2.3.3 부울대수 자료형 - boolean /2.3.4 정수 자료형 - byte, short, int, long

jh·2022년 1월 4일
0

2.3.3 부울대수 자료형 - boolean

boolean은 true(참)과 false(거짓)의 값만 저장할 수 있는 자료형이다. 불리언은 이렇게 2가지 값만 포함할 수 있으므로 실제로는 1bit로도 충분하지만, 자료 처리의 최소 단위가 바이트 이므로 1byte가 할당된다. 실제로 할당된 1byte(=8bit) 가운데 상위 7bit는 사용하지 않는다.
boolean a = true ;
boolean b = false ;

2.3.4 정수 자료형 - byte, short, int, long

정수를 저장할 수 있는 자료형에는 byte, short, int, long이 있으며 크기는 각각 1byte, 2byte, 4byte, 8byte이다. 예를 들어 변수 a에 정수 3을 저장한다면 다음과 같이 4가지 자료형으로 각각 다르게 정의할 수 있다.
byte a = 3;
short a = 3;
int a = 3;
long a = 3;

이렇게 같은 숫자의 값을 다양한 자료형으로 저장할 수 있다 보니 주의해야 할 사항이 있다. 자바에서는 반드시 지켜야 하는 규칙이 1개 있는데, 항상 대입 연산자(=)를 중심으로 양쪽의 자료형이 똑같아야 한다는 것이다. 만일 양쪽의 자료형이 같지 않으면 문법 오류가 발생한다.

그렇다면 코드에서 직접 숫자로 쓴 정수 3은 어떤 자료형일까? 코드에 직접 작성한 값을 리터럴literal이라고 하는데 앞에서도 공부한 것처럼 3을 저장할 수 있는 자료형이 4개나 있어서 컴파일러는 해당 값의 자료형을 그중 하나로 정해야 한다.

정수 리터럴의 기준은 크게 2가지로 나뉜다.

  1. byte와 short 자료형에 저장할 수 있는 범위 내의 정숫값이 입력됐을 때다. 이때 정수 리터럴은 각각의 자료형, 즉 byte 또는 short 자료형으로 인식한다.

  2. 이와 반대로 byte, short에 저장할 수 없는 범위의 정수 리터럴은 모두 int 자료형으로 인식한다. 또는 크기에 상관 없이 int, long에 정수 리터럴을 입력할 때도 int로 인식한다. 다만 정수 리터럴 뒤에 long을 나타내는 L(또는 l)을 붙여 표기하면 long 자료형으로 인식한다.

대입식정수 리터럴의 자료형 인식
byte a = 3;byte에 저장할 수 있는 값이 byte 자료형에 대입되면 byte로 인식(byte = byte)
short a =3;short에 저장할 수 있는 값이 short 자료형에 대입되면 short로 인식 (short = short)
int a = 3;int와 같거나 int보다 큰 정수 자료형(long)에 정숫값이 입력되면 크기에 관계없이 int로 인식
long a =3L;정수 리터럴 뒤에 L(또는 l)이 붙으면 long으로 인식 (long = long)
long a = 3;long 자료형에 대입되는 정숫값은 크기에 상관 없이 int로 인식되지만, 자동 타입 변환이 발생해 long으로 전환 (long = long)
byte a = 130;byte에 저장할 수 없는 범위의 정숫값이 입력되면 int로 인식(byte = int) -> 오류 발생

자바에서는 대입 연산자를 기준으로 양쪽 자료형이 일치해야 한다고 했는데, 그러면 long a = 3은 틀린 것일까? 정수 리터럴 뒤에 L을 붙이지 않았으므로 int 자료형으로 인식할 것이고, long = int의 형태가 돼 자료형이 불일치하는 것처럼 보인다.

하지만 이 코드에서는 오류가 발생하지 않는다. 그 이유는 크기가 작은 자료형을 큰 자료형에 대입하면 컴파일러가 자동 타입 변환 type casting을 수행하기 때문이다. 즉, long = int의 형태를 long= long의 형태로 변환해 주므로 결국 자료형이 일치한다.

반면 byte a = 130에서 왼쪽은 byte 자료형, 오른쪽은 byte가 저장할 수 없는 범위의 정수 리터럴이므로 int로 인식될 것이다. 왼쪽과 오른쪽의 자료형이 일치하려면 오른쪽의 int 자료형을 byte로 타입 변환을 해야 하는데, 큰 자료형에서 작은 자료형으로의 변환은 자동으로 일어나지 않는다. 따라서 byte = int의 형태로 왼쪽과 오른쪽 자료형이 불일치해 문법 오류가 발생한다.

profile
코딩 공부 중...

0개의 댓글