CS/언어

Java) 형 변환의 개념

alpacadabra 2025. 2. 24. 17:57

Java의 형 변환은 크게 두 종류로 나뉜다.

 

  1. 묵시적 형 변환 
  2. 명시적 형 변환

묵시적 형 변환

묵시적 형 변환은 별도의 명시 없이도 형 변환이 가능한 상황에 발생한다.

 

출처: codenga.com

 

위 그림은 원시 자료형들 간의 묵시적 변환이 가능한 방향을 표시한 것이다. 잘 보면 크기가 작은 쪽에서 큰 쪽으로만 가능하다. 손실이 발생할 수 있기 때문이다. 마치 큰 그릇에서 작은 그릇으로 물을 옮기면 넘치는 것과 같다.

다만 묵시적 변환이 가능하다고 하여 반드시 값 손실이 없는 것은 아니다. 점선은 값 손실이 발생할 수 있는 경우, 실선은 없는 경우이다. 정수에서 실수로 변환할 경우 유효 숫자의 부족으로 손실이 발생할 수 있다.

아래는 원시 자료형들의 크기 비교이다.

 

byte(1) < short(2) = char(2) < int(4) < long(8) < float(4) < double(8)

 

특이 사항으로는,

  • short와 char 간에는 묵시적 형 변환이 불가능하다. short는 signed, char는 unsigned이기 때문이다.
  • long은 8바이트이지만 4바이트인 float보다 작다. 이는 부동소수점과 정수의 이진수 표현 방식이 다르기 때문이다.

 

묵시적 형 변환의 예시를 살펴보겠다.

 

1)
int i = 1234;
float f = i; //Implicit conversion
System.out.println("int : " + i); //int : 1234
System.out.println("float : " + f); //float : 1234.0


2)
int i = 1234567890;
float f = i; //Implicit conversion
System.out.println("int : " + i); //int : 1234567890
System.out.println("float : " + f); //float : 1.234568E9


3)
float f = 1234f;
int i = f; //Compile error, lossy conversion


4)
char c = 65535;
short s = c; //Compile error, lossy conversion

 

  1. int는 float보다 작으므로 묵시적 변환이 가능하다.
  2. 변환이 가능하더라도 float의 유효 숫자는 7자리이므로 값 손실이 발생할 수 있다.
  3. 반대로 float에서 int로의 묵시적 변환을 시도하면 컴파일 에러가 발생한다.
  4. char와 short는 서로 2바이트로 크기는 같지만 범위가 달라 묵시적 변환이 불가능하다.

명시적 형 변환

명시적 형 변환은 묵시적 변환이 불가능할 때, 즉 크기가 큰 자료형에서 작은 자료형으로 변환하고자 할 때 사용한다.

문법은 매우 간단하다. 아래와 같이 소괄호로 변환하고자 하는 자료형을 명시해주면 된다.

 

float f = 1234567f;
int i = (int)f; //Explicit conversion
System.out.println("float : " + f); //float : 1234567.0
System.out.println("int : " + i); //int : 1234567

 

묵시적 변환이 가능할 때에도 자료형을 굳이 명시할 수는 있지만, 불필요한 명시일 것이다.

 

원시형 간의 변환은 한 쪽만 알고 있어도 다른 한 쪽은 쉽게 파악하기에, 이 이상의 설명은 생략하겠다.

보다 나아가서 클래스 간의 변환, 업캐스팅과 다운캐스팅을 알 필요가 있다.