자바 형변환(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; // 자동 형변환
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;
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 (오버플로우 발생)
byte smallValue = (byte) largeValue; // byte 범위: -128 ~ 127 System.out.println(smallValue); // 결과: -126 (오버플로우 발생)
실수에서 정수로 변환 시 소수점 손실
double 값
3.14159
→
소수점 이하 (.14159) 버림
소수점 이하 (.14159) 버림
(int) 캐스팅
3
소수점 손실 코드 예제
double pi = 3.14159;
int iPi = (int)pi;
System.out.println(iPi); // 결과: 3 (소수점 이하 버림)
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 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;
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 (내림)
// 방법 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 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;
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 (정확한 값)
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 사용 권장 |
'언어 공부 > JAVA' 카테고리의 다른 글
JAVA D4 [ 메서드 ] - 메서드 실무에서 꼭 알아야할 내용 정리 (0) | 2025.03.07 |
---|---|
JAVA D3 [ 배열 ] - 자바 배열과 참조형 타입 실무 정리 (1) | 2025.03.07 |
JAVA D2 [ 반복문 ] - 실무에서 사용하는 반복문 정리 (2) | 2025.03.05 |
JAVA D1 [ 변수 ] - 실무에서 사용하는 자바 변수 타입 총정리 (2) | 2025.03.04 |
JAVA D1 [ 변수 ] - 초기화하지 않은 변수 읽을 때의 컴파일 에러 (0) | 2025.03.04 |