본문 바로가기
Language/Java

[Java] 변수 기본형의 종류와 범위

by DevPark 2023. 1. 19.

기본형(Primitive type) 종류와 크기

기본형은 크게 논리형, 문자형, 정수형 그리고 실수형으로 나눌 수 있다. 

 

논리형에는 타입이 boolean 하나밖에 없다. boolean 타입 변수에는 true와 false 이 두가지 값만 저장할 수 있다. boolean 타입은 조건식과 논리적 계산에 사용된다. 

 

문자형도 char 타입 하나밖에 없다. char 타입은 하나의 문자만을 저장하는데 사용된다. 만일 여러 문자를 저장하고 싶다면 String 타입을 사용해야한다. 

 

정수형은 정수 값을 저장하는데 사용하는 타입이다. byte, short, int, long  총 4개가 있다. 이중에서 주로 int 타입이 사용되고 long 타입은 아주 큰 정수를 다룰 때 사용 한다. byte 타입은 이미지 파일이나 실행파일 같은 이진 데이터를 다룰 때 주로 사용되며 short 타입은 c언어와의 호환을 위해서 추가되었으나 잘 쓰이지 않는다. 

 

실수형에는 실수값을 저장하는데 사용되는 타입으로 float와 double이 있다. 

 

각 타입의 크기는 1부터 시작해서 1,2,4,8로 두배씩 올라간다. 단위는 byte이다. 

 

먼저 논리형 타입 boolean의 크기는 1byte이다. boolean 타입의 변수에는 true와 false 두가지 값만 저장하면 되기 때문에 1bit만 있어도 되지만 Java에서는 데이터를 다루는 최소단위가 byte이기 때문에 좀 아깝지만 1byte를 사용한다. 참고로 1bit는 2진수 1자리를 의미하고 1byte는 8bit이다. 

 

문자형 char 타입의 크기는 2byte이다. Java에서는 2byte 문자체계인 유니코드를 사용하기 때문이다. 참고로 C언어에서는 char 타입의 크기가 1byte이다. 

 

정수형에는 byte, short, int, long 모두 4개의 타입이 있는데 byte는 크기가 1byte여서 이름이 byte이며 int 타입을 기준으로 int 타입보다 짧아서 short, 길어서 long이다. short과 long은 서로 반댓말이라 외우기 쉽다. int 타입의 크기는 4byte 이므로 

int 타입보다 짧은 short 타입은 2byte, int 타입보다 긴 long 타입은 8byte 이다.  

 

마지막으로 실수형에는 float와 double 타입이 있는데 실수형은 실수를 부동소수점 즉, floating point  형식으로 저장하기 때문에 flaot라고 이름을 지었고 여기서 부동의 의미는 움직이지 않는 다는 뜻이 아니고 떠다닌는 뜻이다. 

뜰 부(浮) 움직일 동(動). double은 float 타입보다 크기가 두배라서 double이라고 생각하면 외우기 쉽다. 사실 double은 float 타입보다 정밀도가 두배라서 붙혀진 이름이다. 

 

정수형 중에서는 int 타입이 디폴트 타입이다. 디폴트 타입이라는 것은 4개의 정수형 타입 중에서 가장 기본이 되는 타입이라는 뜻이다. 그래서 정수를 저장할 때 int 타입을 가장 많이 쓴다. 실수형에서는 double이 디폴트 타입이다. 

기본형(Primitive type) 종류와 크기


기본형(Primitive type) - 표현범위(1/3)

 

byte b ;  // byte 타입의 변수 b를 선언했을 때 변수 b의 크기는 byte 타입의 크기인 1byte가 된다. 1byte는 1bit 8개로 이루어져 있고 1bit는 2진수 한자리를 의미하고 1bit에는 0과 1중 하나의 값만 저장할 수 있다. 

 

b = 3; // 이처럼 변수 b에 3을 저장하면 10진수 3이 2진수로 변환되어 저장된다. 10진수 3은 2진수로 11이다. 3(10) = 11(2)

나머지는 0으로 채워진다. 변수에 10진수 값을 저장하면 실제로는 2진수 값으로 저장된다. 컴퓨터는 0과 1밖에 모르기 때문이다. 그렇다고 항상 이런식으로 저장되는 것은 아니다. 타입마다 값이 저장되는 형식이 있어서 형식에 맞게 변환되어 저장된다. 

 

1bit 즉, 2진수 한자리에 저장할 수 있는 값의 개수는 0과 1뿐이다. 2bit에 저장할 수 있는 값의 개수는 00,01,10,11 모두 4개이다. n비트로 표현할 수 있는 값의 개수는 2의 n제곱이 된다. 8비트에서는 2의 8제곱 즉 256개의 값을 표현할 수 있다. n비트로 표현할 수 있는 부호없는 정수의 범위(양수)는 0~ 2의 n제곱 -1 이다. 0을 범위에 포함시켜야하기 때문에 -1을 해준다. 8비트로 표현할 수 있는 부호없는 정수의 범위는 0부터 255까지가 된다. n비트로 표현할 수 있는 부호있는 정수의 범위는 -2의 n-1제곱부터 2의 n-1제곱 -1까지가 된다. 자바에서 정수형은 모두 부호가 있다. -2의 n-1제곱~ 2의 n-1제곱 -1과 타입의 크기만 알고 있으면 각 정수형의 범위를 쉽게 계산해 낼 수 있다.  byte 타입의 경우 크기가 1byte이므로 8bit로 표현 할 수 있는 정수의 범위는  -2의 7제곱부터 2의 7제곱 -1이 된다. 2의 7제곱은 128이므로 byte 타입의 범위는 -128부터 127까지가 된다. 그렇다면 8비트의 부호없는 정수의 범위는 어떻게 될까? 0부터 255까지가 된다. 

 

n비트로 표현할 수 있는 값의 개수는 2의n개로 똑같지만 부호의 유무에 따라서 값의 범위가 달라진다는 점을 잘 기억해야한다. 


기본형(Primitive type) - 표현범위(2/3)

각 정수형 타입의 변수에 저장할 수 있는 값의 범위를 직접 계산해서 확인해보자. 

 

byte  -2⁷~2⁷-1  // byte 타입의 변수에 값이 저장되는 형식. 즉, 저장형식은 이와 같다. 전체 8bit 중에서 왼쪽의 1bit를 값의 부호를 나타내는데 사용한다. 이 비트를 부호비트 또는 sign bit라고한다. 이 부호비트의 값이 0이면 양수이고 1이면 음수이다. 그래서 이 부호비트의 값만 보더라도 값이 양수인지 음수인지 알 수 있다. 부호비트를 제외한 나머지 7bit 로는 2의 7제곱 즉 128개의 수를 표현할 수 있으므로 양수 128개와 음수 128개 모두 256. 즉 2의 8제곱 값을 표현할 수 있다. 양수의 경우에는 0을 포함해야하기 때문에 범위가 0부터 127까지이고 음수의 경우에는 -1부터 -128까지이다. byte 타입의 전체 범위는 -128부터 127이된다.  

 

 

short 타입은 크기가 2byte 즉, 16bit이다. 16bit 로 나타낼 수 있는 값의 범위는 -2의 15제곱부터 2의 15제곱 -1이다. 2의 15제곱은 32,768이다. short 타입의 범위는 -32,768~32,767이다. 

 

char  타입의 범위는 0부터 2의 16제곱 -1이다. 즉 0부터 65535까지이다. char 타입은 문자열을 저장하기 위한 타입이지컴퓨터는 모든 데이터를 숫자로 저장하기 때문에 문자도 지정된 문자코드로 변환되어 저장된다. 예를들어 문자 A를 변수 Ch에 저장하면 문자 A가 그대로 저장되는 것이 아니라 문자 A의 문자코드 65가 저장된다. 엄밀히 말하면 2진수로 저장되니까  0000000001000001로 저장된다. char의 타입도 short 타입처럼 2byte 즉 16bit니까 이렇게 16자리의 2진수로 변환된다. 문자코드는 문자마다 일련번호를 붙혀놓은 것이라서 음수를 사용할 필요가 없다. 그래서 char 타입의 저장식에는 부호비트가 없다. char 타입은 short 타입과 달리 16비트를 모두 양수값을 표현하는데 사용한다. 그래서 같은 2byte라도 short 타입과 char 타입의 범위가 다른 것이다. 


기본형(Primitive type) - 표현범위(3/3)

 

실수형인 float와 double의 저장형식과 범위에 대해서 알아보자.

float 타입의 변수에 저장가능한  값의 범위는 -3.4 곱하기 10의 38제곱부터   3.4 곱하기 10의 38제곱까지이다. 이 구간 중 float 타입으로 표현할 수 없는 구간이 있다. -1.4 곱하기 10의 -45제곱부터 1.4 곱하기 10의 -45제곱까지이다. 

float 타입은 int와 같은 4byte 크기인데 어떻게 이렇게 큰 수를 표현할 수 있는 것일까?

그 이유는 float 타입의 저장형식에 있다. 

float 타입은 정수형과 달리  값을 부호, 지수, 가수 이렇게 세 부분으로 나누어서 저장한다. 

3.4가 가수이고 38이 지수다. 그래서 같은 크기의 정수형인 int 타입보다 float 타입으로 훨씬 큰 범위의 수를 표현할 수 있는 것이다. 대신에 정수형과 달리 실수형은 원래 저장하려는 값과 실제로 저장된 값 사이에 오차가 발생할 수 있다. 

실수형은 오차라는 것이 발생할 수 있기 때문에 '정밀도'라는 것이 중요하다. 정밀도라는 것은 값을 몇자리까지 오차없이 정확하게 표현할 수 있는지를 의미하고 float의 경우 10진수로 7자리까지 오차없이 표현할 수 있다. 정밀도를 결정하는 것은 가수의 자릿수이고 float 타입의 가수는 23자리지만 정수형에서 실제로 24자리까지 저장 할 수 있다. 2의 24제곱은 10의 7제곱보다 크고 10의 8제곱보다는 작다. 그래서 float의 정밀도가 7자리인 것이다. 

 

double은 가수의 자릿수가 float의 약 두배이기 때문에 정밀도도 float의 약 두배인 15자리이다. 정밀도가 float의 두배여서 double이라는 이름이 붙은 것이다. 중요한 것은 실수를 저장할 float의 타입을 정할때 단순히 저장가능한 값의 범위만으로 타입을 선택해서는 안된다는 것이다. 10의 38제곱은 상당히 큰 값이라서 웬만해서는 이 값을 넘지는 않겠지만 정확한 계산을 해야하는 경우에는 정밀도가 더 중요하다. 정밀도가 중요한 경우에는 flaot보다 double을 사용해야 한다. 10진수로 7자리의 정밀도는 그렇게 높은 것이 아니다. 실수형에서는 float가 아닌 double이 디폴트 타입이다. 디폴트 타입이라는 것은 실수형 중에서도 기본이 되는 타입이라는 뜻이다. 정수형에서는 int가 디폴트 타입이다.


출처

https://youtu.be/yVxsi_CBLR0

반응형

'Language > Java' 카테고리의 다른 글

[Java] 화면에서 입력받기 - Scanner  (0) 2023.01.24
[Java] printf를 이용한 출력  (0) 2023.01.24
[Java] 기본형과 참조형  (0) 2023.01.17
[Java] 두 변수의 값 바꾸기  (0) 2023.01.11
[Java] 변수(Variable)-2  (0) 2023.01.10

댓글