Java의 형 변환은 크게 두 종류로 나뉜다.
- 묵시적 형 변환
- 명시적 형 변환
묵시적 형 변환
묵시적 형 변환은 별도의 명시 없이도 형 변환이 가능한 상황에 발생한다.
위 그림은 원시 자료형들 간의 묵시적 변환이 가능한 방향을 표시한 것이다. 잘 보면 크기가 작은 쪽에서 큰 쪽으로만 가능하다. 손실이 발생할 수 있기 때문이다. 마치 큰 그릇에서 작은 그릇으로 물을 옮기면 넘치는 것과 같다.
다만 묵시적 변환이 가능하다고 하여 반드시 값 손실이 없는 것은 아니다. 점선은 값 손실이 발생할 수 있는 경우, 실선은 없는 경우이다. 정수에서 실수로 변환할 경우 유효 숫자의 부족으로 손실이 발생할 수 있다.
아래는 원시 자료형들의 크기 비교이다.
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
- int는 float보다 작으므로 묵시적 변환이 가능하다.
- 변환이 가능하더라도 float의 유효 숫자는 7자리이므로 값 손실이 발생할 수 있다.
- 반대로 float에서 int로의 묵시적 변환을 시도하면 컴파일 에러가 발생한다.
- 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
묵시적 변환이 가능할 때에도 자료형을 굳이 명시할 수는 있지만, 불필요한 명시일 것이다.
원시형 간의 변환은 한 쪽만 알고 있어도 다른 한 쪽은 쉽게 파악하기에, 이 이상의 설명은 생략하겠다.
보다 나아가서 클래스 간의 변환, 업캐스팅과 다운캐스팅을 알 필요가 있다.
'CS > 언어' 카테고리의 다른 글
Java) 대소문자를 서로 변환하는 방법 (0) | 2024.12.19 |
---|---|
Java) 대소문자를 판별하는 방법 (0) | 2024.12.19 |
Java) 문자열을 순회하는 방법 (0) | 2024.12.16 |
Java) Spring 프레임워크의 의존성 주입(DI) (0) | 2024.12.15 |
Java) Stream의 개념 (1) | 2024.11.29 |
댓글