본문으로 건너뛰기
Advertisement

2.5 형변환 (Type Casting)

프로그래밍을 하다 보면 서로 다른 타입의 변수나 리터럴 간에 연산을 수행해야 할 때가 있습니다. 이런 경우, 먼저 연산을 수행하기 전에 값을 같은 타입으로 맞춰 주어야 합니다. 이처럼 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환(Type Casting) 이라고 합니다.

1. 형변환 연산자

형변환은 명시적으로 수행할 수도 있고, 데이터의 손실 가능성이 없을 경우에는 컴파일러가 자동으로 형변환을 적용해주기도 합니다. 형변환을 명시적으로(강제 형변환) 수행할 때에는 괄호 (타입) 기호를 값 앞에 기입합니다.

double d = 85.4;
int score = (int) d;

// d의 공간이 변하는 것이 아니라, 값만 변환됨
System.out.println("score=" + score); // 85 (소수점 버림)
System.out.println("d=" + d); // 85.4 (값은 보존됨)

2. 자동 형변환 (Implicit Casting)

서로 다른 타입의 변수 간에 값을 대입할 때 형변환 연산자를 생략할 수 있는 경우가 있습니다. 컴파일러가 알아서 형변환을 해 주는 것을 '자동 형변환'이라고 합니다. 보통 "표현 범위가 좁은 타입에서 넓은 타입으로 변환" 될 때 안전하기 때문에 자동으로 변환됩니다.

자동 형변환의 규칙

byte -> short/char -> int -> long -> float -> double

방향키 오른쪽으로 갈수록 표현할 수 있는 값의 범위가 넓기 때문에 자동으로 변환됩니다. float 타입은 크기가 4 byte이기는 하나 부동소수점 방식으로 훨씬 넓은 값을 가지기 때문에 long(8 byte) 보다 우위에 있습니다.

int i = 300;
double d1 = i; // int(4 byte)에서 double(8 byte)로 문제없이 변환
System.out.println(d1); // 300.0

3. 강제 형변환 (Explicit Casting)

반대로 값의 손실의 우려가 있는 경우 (큰 그릇의 물을 작은 그릇에 옮겨 담듯), 자바 컴파일러는 오류를 냅니다. 이럴 경우에는 개발자가 데이터의 손실을 감수하고서라도 변환하겠다고 명시해주어야 합니다.

double d = 3.14;
// int i = d;
// 에러 발생: Incompatible types. Possible lossy conversion from double to int

int i = (int) d; // 강제 형변환 명시
System.out.println(i); // 다행히도 에러 없이 3 출력 (소수점은 버려짐)

정수형 오버플로우와 캐스팅

값을 강제로 자를 경우, 저장공간 범위를 넘어서면 예기치 않은 값이 나오게 됩니다.

int exceed = 300;
byte b = (byte) exceed;
System.out.println(b); // 44 (데이터 손실로 인한 이상한 값 초래)

요약

  • 작은 타입에서 큰 타입으로 변환: 자동 형변환 (안전)
  • 큰 타입에서 작은 타입으로 변환: 명시적 형변환 필요 (데이터 손실 우려)
Advertisement