자바의 데이터 타입 변환 중에서 가장 안전하고 자연스러운 과정인 **프로모션(Promotion, 자동 타입 변환)**에 대해 알아보겠습니다.
이름에서 느껴지듯이, '승진'이나 '격상'처럼 작은 그릇에 담긴 데이터를 큰 그릇으로 옮기는 과정을 말합니다.
📘 자바 프로모션(Promotion): "작은 그릇에서 큰 그릇으로"
1. 프로모션이란?
- 설명: 크기가 작은 타입이 크기가 큰 타입으로 저장될 때, 자바 컴파일러가 자동으로 형변환을 해주는 현상입니다.
- 특징: 데이터 손실이 전혀 없기 때문에 개발자가 직접 변환하라고 명시하지 않아도 자바가 알아서 처리해 줍니다.
- 비유: 종이컵에 든 물을 커다란 양동이에 붓는 것과 같습니다. 물이 넘칠 걱정이 없으니 안심하고 부어도 되는 것이죠.
📦 프로모션의 규칙과 예제
데이터 타입의 크기 순서는 다음과 같습니다.
byte(1) < short(2) < int(4) < long(8) < float(4) < double(8) > (참고: float은 4바이트지만 표현 범위가 long보다 크기 때문에 long에서 float으로도 자동 변환됩니다.)
1. 정수 타입 간의 프로모션
작은 정수 타입 변수를 큰 정수 타입 변수에 대입할 때 발생합니다.
Java
public class PromotionExample {
public static void main(String[] args) {
byte byteValue = 10;
// byte(1) -> int(4)로 자동 변환
int intValue = byteValue;
System.out.println("int로 변환된 값: " + intValue);
long longValue = intValue; // int(4) -> long(8)로 자동 변환
System.out.println("long으로 변환된 값: " + longValue);
}
}
2. 정수와 실수 간의 프로모션
정수는 실수 타입으로 저장될 때 항상 자동으로 변환됩니다. 실수 타입은 소수점 이하를 표현할 수 있는 더 정밀한 그릇이기 때문입니다.
Java
public class IntToDoubleExample {
public static void main(String[] args) {
int intValue = 200;
// int(4) -> double(8)로 자동 변환
// 결과는 200.0이 됩니다.
double doubleValue = intValue;
System.out.println("double로 변환된 값: " + doubleValue);
}
}
3. 연산 중의 프로모션
자바에서 서로 다른 타입이 연산을 수행하면, 결과는 자동으로 더 큰 타입으로 변환됩니다.
Java
public class OperationPromotion {
public static void main(String[] args) {
int intVal = 10;
double doubleVal = 5.5;
// int + double 연산을 하면 int가 double로 먼저 자동 변환된 후 계산됩니다.
// 결과 타입은 double이 됩니다.
double result = intVal + doubleVal;
System.out.println("연산 결과: " + result); // 15.5
}
}
👨🏫 쉽게 이해하는 핵심 포인트
- 컴파일러의 배려: 프로모션은 자바가 우리 대신 안전하게 처리해 주는 서비스입니다.
- 반대 방향은 안 돼요: 큰 그릇의 물을 작은 그릇에 부으면 넘칠 수 있겠죠? 이를 **캐스팅(Casting, 강제 형변환)**이라고 하며, 이때는 반드시 개발자가 직접 명령해야 합니다.
- char 타입: char는 0~65535의 범위를 가지므로, int 타입으로 자동 변환되면 해당 문자의 유니코드 번호가 저장됩니다.
오늘의 요약
- Promotion은 작은 타입에서 큰 타입으로의 자동 변환이다.
- 데이터 손실이 없으므로 자바가 스스로 처리하며 매우 안전하다.
- 실수 타입은 정수 타입보다 항상 크다고 간주되어 정수에서 실수는 무조건 자동 변환된다.
자바의 데이터 흐름을 이해하는 가장 기본이 되는 프로모션에 대해 마스터하셨습니다!

'JAVA' 카테고리의 다른 글
| JAVA Default code analysis (0) | 2026.02.04 |
|---|---|
| Exception class (0) | 2025.11.05 |
| Inheritance (0) | 2025.10.09 |
| Exception handing (0) | 2025.10.08 |
| JAVA Comments (2) | 2025.08.27 |