자바에서는 서로 다른 타입의 데이터를 변환하여 사용할 수 있습니다. 이를 형변환이라 부르며, 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때는 자동으로 이루어집니다. 하지만 큰 데이터 타입에서 작은 데이터 타입으로 변환할 때는 명시적 형변환을 통해 직접적으로 변환을 지시해야 합니다. 이 글에서는 자바에서 자동 형변환과 명시적 형변환에 대해 살펴보겠습니다.
1. 자동 형변환 (Implicit Casting)
자바에서는 작은 범위의 타입에서 큰 범위의 타입으로 데이터를 변환하는 경우, 별다른 지시 없이도 자동으로 형변환이 이루어집니다. 예를 들어, int에서 long, 또는 long에서 double로 변환할 때 문제가 발생하지 않습니다. 다음 예제를 보겠습니다.
package casting;
public class Casting1 {
public static void main(String[] args) {
int intValue = 10;
long longValue;
double doubleValue;
longValue = intValue; // int -> long (자동 형변환)
System.out.println("longValue = " + longValue);
// 출력: longValue = 10
doubleValue = intValue; // int -> double (자동 형변환)
System.out.println("doubleValue1 = " + doubleValue);
// 출력: doubleValue1 = 10.0
doubleValue = 20L; // long -> double (자동 형변환)
System.out.println("doubleValue2 = " + doubleValue);
// 출력: doubleValue2 = 20.0
}
}
실행 결과:
longValue = 10
doubleValue1 = 10.0
doubleValue2 = 20.0
작은 데이터 타입에서 큰 데이터 타입으로의 형변환은 자바에서 자연스럽게 이루어집니다. 이것을 자동 형변환 혹은 묵시적 형변환이라고 합니다. 형을 맞춰주는 작업이 자동으로 이루어지기 때문에 개발자는 따로 신경 쓸 필요가 없습니다.
형변환 과정:
intValue = 10;
doubleValue = (double) intValue; // 형 맞추기
doubleValue = 10.0; // 형변환 후 최종 값
2. 명시적 형변환 (Explicit Casting)
이번에는 큰 범위의 데이터 타입에서 작은 범위의 데이터 타입으로 변환해보겠습니다. 이때는 명시적 형변환이 필요합니다. 예를 들어, double에서 int로 변환할 때, 자동으로 변환할 수 없기 때문에 직접 형변환을 지시해야 합니다.
package casting;
public class Casting2 {
public static void main(String[] args) {
double doubleValue = 1.5;
int intValue = 0;
// intValue = doubleValue; // 컴파일 오류 발생
intValue = (int) doubleValue; // 형변환
System.out.println(intValue); // 출력: 1
}
}
double 타입의 실수 값을 int로 변환하려면 소수점이 손실됩니다. 이 과정에서 값을 명시적으로 변환하는 코드를 작성해야 하며, 이를 명시적 형변환이라고 부릅니다.
명시적 형변환 과정:
doubleValue = 1.5;
intValue = (int) doubleValue; // 형변환
intValue = 1; // 소수점이 제거됨
3. 형변환과 오버플로우 (Overflow)
만약 형변환 과정에서 작은 데이터 타입이 표현할 수 있는 범위를 넘어서면 오버플로우가 발생할 수 있습니다. 예를 들어, long 타입의 값이 int 타입의 최대값을 초과할 경우, 전혀 다른 값으로 변환됩니다.
package casting;
public class Casting3 {
public static void main(String[] args) {
long maxIntValue = 2147483647; // int의 최대값
long maxIntOver = 2147483648L; // int의 최대값을 초과
int intValue;
intValue = (int) maxIntValue; // 정상 변환
System.out.println("maxIntValue casting = " + intValue);
// 출력: 2147483647
intValue = (int) maxIntOver; // 오버플로우 발생
System.out.println("maxIntOver casting = " + intValue);
// 출력: -2147483648
}
}
오버플로우가 발생하면 예측할 수 없는 값이 나타나므로 주의해야 합니다.
4. 계산 중 형변환
계산을 할 때도 형변환이 발생할 수 있습니다. 서로 다른 데이터 타입끼리 연산을 할 경우, 더 큰 범위의 타입으로 자동 형변환이 이루어집니다.
package casting;
public class Casting4 {
public static void main(String[] args) {
int div1 = 3 / 2;
System.out.println("div1 = " + div1); // 1
double div2 = 3 / 2;
System.out.println("div2 = " + div2); // 1.0
double div3 = 3.0 / 2;
System.out.println("div3 = " + div3); // 1.5
double div4 = (double) 3 / 2;
System.out.println("div4 = " + div4); // 1.5
int a = 3;
int b = 2;
double result = (double) a / b;
System.out.println("result = " + result); // 1.5
}
}
중요한 규칙:
- 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
- int + int는 int 타입의 결과가 나오고, double + double은 double 타입의 결과가 나옵니다.
- 서로 다른 타입의 계산은 더 큰 타입으로 자동 형변환된다.
- int + long은 long으로, int + double은 double로 형변환됩니다.
마무리
형변환은 자바에서 매우 중요한 개념이며, 자동 형변환과 명시적 형변환의 차이를 잘 이해하는 것이 중요합니다. 자동 형변환은 개발자의 부담을 덜어주지만, 명시적 형변환은 신중하게 사용해야 하며, 오버플로우와 같은 문제를 유발할 수 있기 때문에 주의해야 합니다. 데이터 타입을 올바르게 다루는 것이 안정적인 코드를 작성하는 첫걸음입니다.
'Back-End > Java' 카테고리의 다른 글
배열 선언과 생성 이해하기 (0) | 2024.10.26 |
---|---|
자바에서 Scanner 클래스를 활용한 사용자 입력 받기 (0) | 2024.10.24 |
지역 변수와 스코프 (0) | 2024.10.21 |
자바의 for 문 이해하기 (0) | 2024.10.17 |
Java 반복문: do-while, break, continue를 활용한 실전 예제 (0) | 2024.10.16 |