본문 바로가기
언어 공부/JAVA

JAVA D2 [ 형변환 ] - 형변환 핵심 정리

by TMrare 2025. 3. 5.

자바 형변환(Type Casting)  정리

1. 자바 데이터 타입 크기와 형변환 방향

byte
1바이트
short
2바이트
int
4바이트
long
8바이트
float
4바이트
double
8바이트

자동 형변환(암시적) - 작은 타입에서 큰 타입으로 자동 변환

명시적 형변환(캐스팅) - 큰 타입에서 작은 타입으로 변환 시 (type) 형식 필요

자동 형변환 (Promotion)

작은 크기의 타입에서 큰 크기의 타입으로 자동 변환

byte b = 10;
int i = b; // 자동 형변환
long l = i; // 자동 형변환
double d = l; // 자동 형변환

명시적 형변환 (Casting)

큰 크기의 타입에서 작은 크기의 타입으로 강제 변환

// 명시적 형변환, 소수점 손실
double d = 3.14;
// 명시적 형변환
byte b =
(byte) l;
int i = (int) d;
long l = 100L;

참고: float가 4바이트로 long(8바이트)보다 작지만, 표현 범위가 더 넓어 자동 형변환이 가능!! 이는 내부 표현 방식의 차이 때문

2. 명시적 형변환과 데이터 손실

주의! 큰 데이터 타입에서 작은 데이터 타입으로 형변환 시 데이터가 손실될 수 있음

정수 오버플로우 예제

int 값: 130
00000000 00000000 00000000 10000010
byte로 변환
10000010
최상위 비트가 1 = 음수!
결과값
-126
정수 오버플로우 코드 예제
int largeValue = 130;
byte smallValue = (byte) largeValue; // byte 범위: -128 ~ 127 System.out.println(smallValue); // 결과: -126 (오버플로우 발생)

실수에서 정수로 변환 시 소수점 손실

double 값
3.14159
                    →
소수점 이하 (.14159) 버림
(int) 캐스팅
3
소수점 손실 코드 예제
double pi = 3.14159;
int iPi = (int)pi;
System.out.println(iPi); // 결과: 3 (소수점 이하 버림)

3. 실무에서 필수적인 형변환 사례

나눗셈 연산과 형변환

코드 결과 설명
int result = 10 / 3; 3 정수 나눗셈은 소수점 이하를 버리기
double result = (double)10 / 3; 3.3333... 형변환으로 실수 결과를 얻을 수 있음
// 정수 나눗셈 (소수점 버림)
int a = 10;
int b = 3;
int result1 = a / b; // 결과: 3 (소수점 버림)

// 실수 결과를 얻기 위한 형변환
double result2 = (double) a / b; // 결과: 3.3333... (정확한 나눗셈)

백분율 계산

int completed = 7;
int total = 10; // 정확한 백분율 계산 --> // 70.0 (7 / 10 * 100)
double percentage = (double) completed / total * 100; // (double) 없이 계산하면 --> 0 (0.7 * 100 -> 0 * 100)
int wrongPercentage = completed / total * 100;

4. 실수에서 정수로 변환 시 반올림 방법

방법 코드 예시 (3.75→?) 특징
단순 캐스팅 (int)value 3 (버림) 소수점 이하 버림 (반올림 아님)
0.5 더하고 캐스팅 (int)(value + 0.5) 4 (반올림) 간단한 반올림 방식
Math.round() (int)Math.round(value) 4 (반올림) 반환값이 long이므로 int로 캐스팅 필요
Math.ceil() (int)Math.ceil(value) 4 (올림) 항상 올림
Math.floor() (int)Math.floor(value) 3 (내림) 항상 내림
double value = 3.75;

// 방법 1: 0.5 더하고 int로 캐스팅 (간단한 방법)
int rounded1 = (int)(value + 0.5); // 4

// 방법 2: Math.round() 사용 (권장)
int rounded2 = (int)Math.round(value); // 4

// 방법 3: Math.floor(), Math.ceil() 사용
int ceiling = (int)Math.ceil(value); // 4 (올림)
int flooring = (int)Math.floor(value); // 3 (내림)

5. 형변환 주요 주의사항

연산 시 자동 형변환 주의!

서로 다른 타입이 연산되면 큰 타입으로 자동 변환됨

byte b1 = 10; byte b2 = 20;
// byte sum = b1 + b2; // 컴파일 에러! b1 + b2는 int로 자동 변환됨

// 명시적 캐스팅 필요
byte sum = (byte)(b1 + b2);

다양한 타입 혼합 시 자동 변환 순서

byte → short → int → long → float → double

// 다양한 타입 혼합 시 예제
byte b = 10;
short s = 20;
int i = 30;
long l = 40L;
float f = 50.0f;
double d = 60.0;
// 결과는 double (가장 큰 타입으로 자동 변환)

double result = b + s + i + l + f + d;

6. 금융 계산과 정밀도 문제

double vs BigDecimal 비교
// double 사용 시 정밀도 문제
double price1 = 19.99;
double quantity1 = 3;
double total1 = price1 * quantity1;
System.out.println(total1); // 59.97000000000001 (오차 발생)

// BigDecimal 사용 (정확한 계산)
import java.math.BigDecimal;
BigDecimal price2 = new BigDecimal("19.99");
BigDecimal quantity2 = new BigDecimal("3");
BigDecimal total2 = price2.multiply(quantity2);
System.out.println(total2); // 59.97 (정확한 값)

7. 형변환 핵심 포인트 요약

주제 핵심 내용
자동 형변환 작은 타입 → 큰 타입 자동 변환
byte → short → int → long → float → double
명시적 형변환 큰 타입 → 작은 타입 변환 시 (type) 형식으로 명시 필요
데이터 손실 정수 간 변환 시 오버플로우, 실수→정수 변환 시 소수점 버림 발생 가능
연산 시 형변환 서로 다른 타입 간 연산 시 큰 타입으로 자동 변환
실수 반올림 Math.round() 사용 또는 0.5 더한 후 int 캐스팅
정밀 계산 금융 계산 등에는 BigDecimal 사용 권장