코린이의 소소한 공부노트

변수의 데이터 타입(data type) 본문

Java

변수의 데이터 타입(data type)

무지맘 2021. 12. 6. 13:26

변수에는 임의의 값 하나가 들어갈 수 있는데, 이 값이 무엇이냐에 따라 변수의 타입이 결정된다.

 

자바에서는 크게 기본형과 참조형 두 가지로 나눈다.

1. 기본형(primivtive type)

 - 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)의 8개 타입을 기본형으로 분류한다.

 - 변수에 넣을 실제 값을 저장한다.

 - 타입에 따라 변수의 크기가 다르다.

 - 자바 설계 시 정해놓은 것이기 때문에 기본형은 8개에서 추가될 수 없다.

2. 참조형(reference type)

 - 기본형을 제외한 나머지 타입들(String, System 등)을 참조형으로 분류한다.

 - 객체의 주소를 저장한다.(4 byte의 경우 0x00000000~0xffffffff)

 - 모든 참조형 변수의 크기는 4 byte(=32 bit) 또는 8 byte(=64 bit)로 동일하다.

  ㄱ) 32 bit JVM(자바 버추얼 머신)

    - 32 bit로 표현 가능한 숫자는 약 40억 -> 참조 주소가 40억 개 -> 다룰 수 있는 메모리가 40억 byte = 4GB

  ㄴ) 64 bit JVM

    - 64 bit로 표현 가능한 숫자는 약 1800경 -> 참조 주소가 1800 경개 -> 다룰 수 있는 메모리가 약 1800만TB

 - 우리가 마음대로 추가할 수 있다.

 

여기서 나오는 bit와 byte는 데이터의 단위이다.

 1) bit

  - 가장 작은 데이터 단위

  - 컴퓨터는 2진법을 사용하기 때문에 1 bit로 0과 1의 2가지만 표현 가능

 2) byte

  - 8개의 bit가 모여서 생기는 단위

  - (8 bit) * (1 bit당 2가지 표현) = 2의 8제곱인 256개의 수 표현 가능

 

기본형과 참조형 중 기본형 8가지를 조금 더 자세히 다뤄보겠다.

1) 논리형: boolean

 - 참(true)과 거짓(false)의 논리값이 저장되는 타입

 - 조건식, 논리 계산식에 사용됨

2) 문자형: char

 - 'a', 'A' 등 문자 1개를 저장할 수 있는 타입

 - 여러 개의 문자를 저장하려면 참조형 변수인 String 사용

3) 정수형: byte, short, int, long

 - 정수 1개의 값을 저장할 수 있는 타입

  ㄱ) byte

   - 이진 데이터(이미지 파일 등)를 다루는 데 사용되는 타입

  ㄴ) short

   - C언어와의 호환을 위해 추가된 타입(잘 쓰지 않음)

  ㄷ) int

   - 정수형의 default 타입(정수형 중 가장 많이 쓰임)

  ㄹ) long

   - int보다 더 큰 수를 다룰 때 쓰는 타입

4) 실수형: float, double

 - 실수 1개의 값을 저장할 수 있는 타입

 - 수학에서 보면 정수는 실수에 포함되므로 당연히 정수를 실수형에 저장 가능하나, 표현 방식에 차이가 생김

   - 1은 정수형에 저장하면 1이지만, 실수형에 저장하면 1.0이 됨

 ㄱ) float

  - 실수를 부동 소수점(floating point)방식으로 저장해서 이름이 float으로 붙여짐

 ㄴ) double

  - 실수형의 default 타입

  - float보다 2배의 정밀도를 갖기 때문에 이름이 double으로 붙여짐

    - 숫자가 작아도 정밀도가 중요하면 double 사용 >> 이것이 double이 default type인 이유!

 

기본형의 저장공간과 표현 가능 범위를 비숫자형과 숫자형으로 나눠서 설명하겠다.

1. 비숫자형(unsigned)

[그림 002-1] 비숫자형의 저장공간

1) 논리형: boolean

 - 저장공간: 1 byte

   - 자바에서 데이터를 다루는 최소 단위가 byte이기 때문에, 1 bit를 사용해도 충분한 것을 1 byte로 나타냄

 - true, false 2가지만 저장 가능

2) 문자형: char

 - 저장공간: 2 byte

   - 자바에서 2 byte 문자 체계인 유니코드를 쓰기 때문에 char의 크기가 2 byte가 됨

 - 16 bit로 표현 가능한 수는 2의 16제곱인 65,536개 >> 0부터 65,536-1 = 65,535까지 표현 가능

 

2. 숫자형 - 정수형(signed, S는 부호 비트로 0은 양수, 1은 음수를 뜻함)

[그림 002-2] 정수형의 저장공간

1) byte

 - 저장공간: 1 byte (크기가 1 byte이기 때문에 이름이 byte로 붙여짐)

 - 7 bit로 표현 가능한 수는 2의 7제곱인 128개 >> -128부터 127까지 표현 가능

2) short

 - 저장공간: 2 byte (int를 기준으로 더 짧아서 이름이 short으로 붙여짐)

 - 15 bit로 표현 가능한 수는 2의 15제곱인 32,768개 >> -32,768부터 32,767까지 표현 가능

3) int

 - 저장공간: 4 byte

 - 31 bit로 표현 가능한 수는 2의 31제곱인 21억개 >>  -21억부터 21억까지 표현 가능

   (외우기 편하게 2^10≒1000으로 하고, 2^30 = 2 * (2^10)^3 ≒ 2 * 10^9 = 20억으로 간주해서 -20억부터 20억까지로 간편하게 계산)

4) long

 - 저장공간: 8 byte (int를 기준으로 더 길어서 이름이 long으로 붙여짐)

 - 63 bit로 표현 가능한 수는 2의 63제곱인 922경 >> -922경부터 922경까지 표현 가능

   (2^63 = 2^3 * (2^10)^6 ≒ 8 * 10^18 = 800경으로 간주해서 -800경부터 800경까지로 간편하게 계산)

 

3. 숫자형 - 실수형(signed)

[그림 002-3] 실수형의 저장공간

1) float

 - 저장공간: 4 byte

 - 표현 가능 범위: 음수는 -3.4E38부터 -1.4E45까지, 양수는 1.4E45부터 3.4E38까지

                        -1.4E45부터 1.4E45 사이의 수는 표현 불가

                         (3.4E38 = 3.4e38 = 3.4 * 10^38)

 - 정밀도(오차 없는 자리 수 = 유효숫자): 7

2) double

 - 저장공간: 8 byte

 - 표현 가능 범위: 음수는 -1.8E308부터 -4.9E324까지, 양수는 4.9E324부터 1.8E308까지

                        -4.9E324부터 4.9E324 사이의 수는 표현 불가

 - 정밀도: 15

 

기본형 8가지를 비숫자형과 숫자형의 두 부류로 나눈 기준은 부호의 유무이다.

boolean이나 char는 부호가 필요 없는 unsigned 타입이지만, 정수형이나 실수형은 음수도 나타내야 하므로 부호가 필요한 signed 타입이다. 이것은 표현 가능한 최댓값과 최솟값에 굉장한 차이를 나타낸다.

[그림 002-4] 부호 비트의 유무에 따른 표현 범위의 차이

예를 들어, 4 bit로 표현 가능한 부호 없는 수의 가짓수는 2의 4제곱인 16가지이고, 이는 0부터 2^4-1=15까지이다.

그런데 부호가 1 bit를 차지하면, 표현 가능한 가짓수는 2의 3제곱인 8가지로 줄어들게 된다. 그래서 부호 없는 수는 0부터 7(2^3 -1)까지, 부호 있는 수는 -8(-2^3)부터 -1까지 표현하게 되는 것이다.

그래서 같은 n bit수의 unsigned 변수와 signed 변수가 있어도 표현할 수 있는 범위는 각각 0부터 2^n -1까지, -2^(n-1)부터 2^(n-1) -1로 다르다. 기본형 중에서는 char short을 비교해보면 된다.

'Java' 카테고리의 다른 글

문자와 문자열  (0) 2021.12.08
변수와 리터럴의 타입 일치/불일치  (0) 2021.12.08
변수, 상수(constant), 리터럴(literal), 접미사  (0) 2021.12.07
변수 선언 & 명명 규칙  (0) 2021.12.06
변수(variable)  (0) 2021.12.03