본문 바로가기
Back-end

[Java] 변수의 기본형 타입 정리 - boolean, byte, short, char, int, float, long, double

by 셀킴 2024. 7. 6.
728x90
반응형

변수의 타입= 기본형(primitive type) + 참조형(reference type)

 

변수의 타입에는 기본형 8개가 있고 그 외 나머지는 전부 참조형입니다.

기본형은 실제 값(리터럴)을 저장하는 데에 반해, 참조형은 객체의 메모리 주소를 저장합니다.

 

기본형 종류: boolean, byte, short, char, int, float, long, double

얘네를 종류와 크기별로 정리해 봅시다.

  1byte 2byte 4byte 8byte
논리형 boolean      
문자형   char    
정수형 byte short int long
실수형     float double

 

 

하나하나 훑어봅시다

 

그전에 알아두면 좋을 정보

✔️ 변수란? 하나의 값을 저장할 수 있는 메모리 공간

✔️ 리티럴=값

✔️ 1비트(bit)는 2진수 한자리(0 또는 1)를 표현할 수 있습니다.

✔️ 1바이트(byte)=8비트. 1byte는 2진수 8자리를 표현할 수 있습니다.

✔️ 자바에서 데이터를 다루는 최소 단위는 1바이트입니다.

 

 

🔹boolean (1byte, 논리형)

boolean은 truefalse만을 값으로 합니다.

boolean 타입은 0(false)과 1(true)로 이루어지기 때문에 1비트만 있어도 되지만, 자바 데이터 최소 단위인 1바이트를 사용합니다.

boolean isReady = false;

 

 

🔹byte (1byte, 정수형)

byte는 1byte로 8비트 정수(2진수 8자리)입니다.

0과 1로 표현 가능한 최소값 1000 0000(-128), 최대값 0111 1111(127)

아래 코드로 Byte 최소값, 최대값을 찍어보면 각각 -128과 127이라고 나옵니다.

System.out.println(Byte.MIN_VALUE); //-128 출력
System.out.println(Byte.MAX_VALUE); //127 출력

값이 전부 정수이죠? 자바에서는 byte와 short 타입의 변수에 값을 할당할 때 int 리터럴을 사용합니다.

범위를 벗어나는 128을 할당하면 어떻게 될까요?

byte b = 128; 

컴파일 오류가 납니다(java: incompatible types: possible lossy conversion from int to byte)

byte타입 변수에 저장할 수 있는 범위를 벗어났기 때문입니다.

 

 

🔹short (2byte, 정수형)

short는 2byte로 16비트 정수를 표현합니다.

자바에서 정수의 기본타입인 int(4byte) 보다 작아서 short라고 부릅니다.

short의 값의 범위를 알아볼까요?

System.out.println(Short.MIN_VALUE); //-32768 출력
System.out.println(Short.MAX_VALUE); //32767 출력

short의 값 표현 범위는 -32768 ~ 32767입니다.

short 값도 byte처럼 int 리터럴을 사용하며, 필요한 경우 캐스팅을 해야 합니다. 예: short s = (short)100;

short는 int보다 작은 범위의 정수를 다룰 때 메모리를 절약하기 위해 사용되지만, 일반적으로 int를 더 많이 사용합니다.

 

 

🔹char (2byte, 문자형)

char 타입은 문자형이지만 정수형의 특징도 가집니다.

기본적으로 char는 문자 하나를 저장할 수 있습니다. 문자 리터럴은 '(홑따옴표)로 감쌉니다.

char는 16비트 부호 없는 정수로 표현됩니다. 값의 범위는 0에서 65,535로 모든 유니코드 문자를 표현할 수 있습니다.

0~65535 사이의 정수를 입력하면 유니코드 문자를 반환해 줍니다.

char c = 44403;
System.out.println(c); //굳 출력

char c2 = 'A';
c++;
System.out.print(c); //B 출력

문자 A에 증감연산자로 1을 더했는데 어떻게 B가 출력되는 걸까요?

문자 A의 유니코드 값은 65입니다. 65++은 66이고, 66은 B의 유니코드 값입니다.

이렇게 문자형이지만 산술연산도 가능합니다.

char에 자주 쓰이는 리터럴은 0~9, a-z, A-Z, +, -, *, / 등이 있습니다.

 

 

🔹int (4byte, 정수형)

int는 자바의 정수형 기본타입입니다.

기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주합니다.

int 값의 범위는 -2147483648 ~ 2147483647로 대략 -21억 ~ 21억 정도입니다.

int i = 100; //**접두사 없으면 기본은 10진수**

int oct = 0100; //64이다. 접두사 0이 앞에 붙으면 8진수
int hex = 0x100; //256이다. 접두사 0x가 붙으면 16진수

 

 

🔹long (8byte, 정수형)

정수 리터럴이 int타입의 허용범위(대략 -21억~21억)를 초과하는 경우 long타입을 사용합니다.

long 타입의 범위는 대략 -922경 ~ 922경입니다.

long타입은 수치가 큰 데이터를 다룰 때 주로 사용됩니다. 대표적인 예가 은행이나 과학 관련 프로그램입니다.

long타입에 int 범위에 해당하는 값을 넣어도 무방합니다.

하지만 int 값 범위를 벗어날 때는 값 끝에 L을 붙여줘야 합니다.

int 범위를 벗어나는 22억 정도의 값을 long 타입에 그대로 넣으면 컴파일 오류가 납니다.

리터럴에 접미사 L을 붙여줘야 정상적으로 컴파일됩니다.

long l = 100;
long l2 = 2222222222L;
long l3 = 2222222222; //에러(java: integer number too large)

 

 

🔹float (4byte, 실수형)

float는 보통 소수점 이하 약 7자리까지 나타내는 정밀도를 갖습니다.
float의 표현범위는 양수 기준 1.4E-45에서 3.4E38입니다. 여기서 E는 뭘까요?

지수를 나타내는 표기법입니다. E가 포함된 숫자 리터럴은 지수와 가수로 표현된 소수점이 있는 10진수 실수로 인식합니다.
1.4E-45는 1.4*10⁻⁴⁵과 같고 3.4E38은 3.4*10³⁸과 같습니다
사실 저는 수포자라 머리로는 이해가 안 됩니다. 그냥 double보다 범위가 좁고 정밀도가 낮은 실수형이라고 인식하고 있어요.
자바의 기본 실수형 타입이 double이기 때문에 double과 구별하기 위해 float는 리터럴에 접미사 f를 붙여줘야 합니다.

float f = 3.14f;
float f2 = 3.14; //에러(java: incompatible types: possible lossy conversion from double to float)

 

 

🔹double (8byte, 실수형)

double은 자바의 실수형 기본타입입니다. 자바가 실수 리터럴은 기본적으로 double타입으로 해석합니다.

float 정밀도의 두 배라고 하여 double이라고 부릅니다. double은 소수점 이하 15자리까지 오차 없이 나타냅니다.

표현 범위는 4.9*10⁻³²⁴에서 1.8*10³⁰⁸입니다.

double 타입이 float 타입보다 정밀도가 좋기 때문에 보다 정확한 데이터 저장이 가능합니다.

double d = 3.14; //OK
double d2 = 3.14d; //OK. double타입은 d 생략가능



728x90
반응형