자바 타입 변환

정주영·2024년 12월 10일

자바

목록 보기
5/10

1. 자동 타입 변환 (Implicit Type Casting)

자동 타입 변환은 더 작은 범위의 타입이 더 큰 범위의 타입으로 변환될 때, 컴파일러가 자동으로 수행하는 변환입니다.
이 변환은 데이터 손실이 발생하지 않기 때문에 안전합니다.

규칙

  • 크기 순서: byte → short → int → long → float → double
  • 문자형 char는 int로 변환될 수 있음.

특징

  • 데이터의 범위가 작은 타입에서 큰 타입으로 변환이 이루어집니다.
  • int 타입은 대부분의 연산에서 기본 타입으로 사용됩니다.
public class TypeConversionExample {
    public static void main(String[] args) {
        int intVal = 100;
        double doubleVal = intVal; // int가 double로 자동 변환
        System.out.println("자동 변환된 double 값: " + doubleVal);

        char charVal = 'A';
        int asciiValue = charVal; // char가 int로 자동 변환
        System.out.println("문자 'A'의 ASCII 값: " + asciiValue);
    }
}

2. 명시적 타입 변환 (Explicit Type Casting)

명시적 타입 변환은 더 큰 범위의 타입을 더 작은 범위의 타입으로 변환하거나, 서로 호환되지 않는 타입 간 변환 시 사용됩니다.
이 경우, 데이터 손실이 발생할 가능성이 있으므로, 개발자가 직접 변환을 명시해야 합니다.

형식
java
코드 복사
타겟타입 변수명 = (타겟타입) 변환할_변수;
예제: 명시적 변환

public class ExplicitTypeCastingExample {
    public static void main(String[] args) {
        double doubleVal = 99.99;
        int intVal = (int) doubleVal; // double을 int로 변환 (소수점 손실)
        System.out.println("명시적 변환된 int 값: " + intVal);

        long longVal = 100L;
        short shortVal = (short) longVal; // long을 short로 변환
        System.out.println("명시적 변환된 short 값: " + shortVal);
    }
}

주의사항
데이터 손실 가능성:
예를 들어, 99.99를 int로 변환하면 소수점이 제거되어 99가 됩니다.

범위 초과(Overflow):
변환하려는 값이 목표 타입의 범위를 초과하면 예상치 못한 값이 될 수 있습니다.

int largeValue = 130;
byte byteValue = (byte) largeValue; // -126 (Overflow 발생)
System.out.println("Overflow 결과: " + byteValue);

3. 문자열(String)과 기본 타입 간의 변환

기본 타입 → 문자열 변환
기본 타입의 데이터를 문자열로 변환할 때는 String.valueOf() 또는 + ""를 사용합니다.

public class BasicToStringExample {
    public static void main(String[] args) {
        int intVal = 42;
        String str = String.valueOf(intVal); // 방법 1
        String str2 = intVal + ""; // 방법 2
        System.out.println("문자열로 변환: " + str);
    }
}

문자열 → 기본 타입 변환
문자열 데이터를 기본 타입으로 변환하려면 Wrapper 클래스의 parseXxx() 메서드나 valueOf() 메서드를 사용합니다.

public class StringToBasicExample {
    public static void main(String[] args) {
        String str = "123";
        int intVal = Integer.parseInt(str); // String → int
        double doubleVal = Double.parseDouble(str); // String → double
        System.out.println("정수 변환: " + intVal);
        System.out.println("실수 변환: " + doubleVal);
    }
}

주의사항: 문자열이 올바른 형식이 아닐 경우 NumberFormatException이 발생합니다.

String invalidStr = "abc";
int invalidInt = Integer.parseInt(invalidStr); // 예외 발생

4. 참조 타입과 기본 타입 간 변환 (Wrapper 클래스)

기본 타입 → Wrapper 객체 (Boxing)
자바는 기본 타입과 관련된 Wrapper 클래스를 제공합니다.
Boxing은 기본 타입을 Wrapper 객체로 변환하는 과정입니다.

int intVal = 100;
Integer intWrapper = Integer.valueOf(intVal); // Boxing
Wrapper 객체 → 기본 타입 (Unboxing)
Wrapper 객체에서 기본 타입 값을 꺼내는 것을 Unboxing이라고 합니다.


// 자바 5부터는 자동으로 Boxing/Unboxing이 가능합니다.
Integer intWrapper = Integer.valueOf(100);
int intVal = intWrapper.intValue(); // Unboxing



Integer intWrapper = 100; // 자동 Boxing
int intVal = intWrapper;  // 자동 Unboxing

5. 특별한 경우의 타입 변환

char와 int 간 변환
char는 숫자로 변환 시 유니코드 값으로 변환됩니다.
java
코드 복사

char charVal = 'A';
int intVal = charVal; // 유니코드 값 65
System.out.println("유니코드 값: " + intVal);

boolean 타입
boolean 타입은 숫자나 다른 타입으로 변환되지 않습니다.
따라서, boolean 값을 직접 변환하려면 조건문을 사용해야 합니다.

boolean boolVal = true;
int intVal = boolVal ? 1 : 0; // true는 1, false는 0

6. 형 변환과 관련된 복잡한 개념

정수 오버플로우와 언더플로우
타입 변환 중 정수의 범위를 초과하거나 미달하면 오버플로우/언더플로우가 발생할 수 있습니다.

int largeValue = Integer.MAX_VALUE;
largeValue += 1; // -2147483648로 순환
System.out.println("오버플로우 결과: " + largeValue);
부동소수점 정밀도 손실
부동소수점 값을 정수로 변환하면 정밀도가 손실됩니다.


double doubleVal = 12345.6789;
int intVal = (int) doubleVal; // 소수점 손실
System.out.println("정밀도 손실: " + intVal);
강제 형 변환에서 ClassCastException
서로 호환되지 않는 타입을 변환하려고 하면 런타임에 ClassCastException이 발생합니다.


Object obj = "String";
Integer intVal = (Integer) obj; // 예외 발생

7. 결론

자바에서 타입 변환은 데이터 처리의 중요한 부분입니다. 타입 간의 변환은 편리하지만, 데이터 손실과 예외 발생 가능성을 항상 염두에 두어야 합니다. 기본적인 자동 변환부터 명시적 변환, 문자열 변환, Wrapper 클래스 활용까지 모든 측면을 이해하고 적절히 사용하는 것이 중요합니다.

profile
효율적인 시스템 설계를 고민하며, 확장성과 안정성을 갖춘 백엔드 개발자가 되길 희망합니다.

0개의 댓글