본문 바로가기
앱 만들기/Java

byte a = 10+20 이 컴파일 에러가 발생하지 않는 이유

by 나도처음이야 2025. 1. 20.
반응형

하기 코드가 있다.

제목 그대로 byte a = 10 + 20; 은 정상 코드이다.

왜 컴파일 에러가 발생하지 않을까?

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Hello World");
		byte a = 10+20;
		System.out.println(a);
	}

 

이렇게 질문할 수 있는 이유는 먼저 10+20 상수 리터럴은 기본적으로 int 형으로 

자동 캐스팅(타입 변환)이 된다는 규칙을 알고 있기 때문이다.

그럼 byte > int로 바뀌었고, int를 byte로 줄이려면 명시적(강제적)인 타입 캐스팅을 해주어야 하지 않는가?

라는 의문점이 생긴다.

 

그런데 자바에서는 이 코드는 문제가 없다. 

왜?

 

이렇게 문제는 제기된다.

그 이유는 바로, 자바가 컴파일될 때 

byte a = 10 + 20; 

이라는 코드를 자동으로 int에서 byte로 형 변환을 해주기 때문이다.

이게 정답이다.

 

왜?

자바가 컴파일 때 자동으로 형변환을 해주는 거지? 

10+20 은 상수이다. 값 자체가 바뀌지 않는 상수이기에 10+20 즉 30 이란 값을 컴파일 타임에 int로 인식하고 있다. 그리고 byte a에 30을 저장할 때 byte의 크기 -128~127 사이에 해당 값이 들어갈 수 있다면

자바 컴파일은 자동적으로 타입을 변환해준다.

이게 자바에서 지원하는 상수의 경우 컴파일에서 지원해 주는 캐스팅인 것이다.

 

그럼 하기 코드와 같이 변수의 경우는 

어떻게 될까?

다행히 이클립스 IDE에서는 편리하게도 빨간색 밑줄이 나온다. 컴파일 에러가 발생했다는 의미이다. 

컴파일 에러

에러 내용은 int를 byte로 명시적 캐스팅 해라는 내용이다.

byte c = (byte)(a+b) ;

로 수정해야 한다.

 

해당 코드는 컴파일 타임이 아닌 JVM에 의해서 해당 바이트 코드가 실행될 때 캐스팅이 된다.

그렇기에 개발자는 꼭 명시적으로 타입캐스팅을 해주어야 한다.

생각해 보면, 변수에 어떤 값이 들어갈지는 모르기에 상수가 아닌 이상 컴파일 타임에 자동으로 형변환을 해주는 것은 알맞지 않은 것 같다. 자바 설계자의 뜻이 숨어 있겠지...

 

결론
상수 리터럴:
컴파일 타임에 값이 확정되므로, 컴파일러가 자동으로 형 변환을 수행.
예: byte a = 10 + 20; → 정상 작동.


변수:
값이 실행 시점에 결정되므로, 컴파일러는 자동 변환을 허용하지 않음.
명시적으로 타입 캐스팅을 해야 함:
byte a = (byte)(x + y);

 

자바는 상수와 변수에 대해 다른 방식으로 처리함으로써, 데이터 손실 가능성을 최소화하고 타입 안전성을 유지하려는 설계 철학을 따르고 있음.

-끝-

반응형

댓글