Programing Language/Java

[Java] 기본 자료형 타입 변환(Primitive Data Type Casting)

vinedpillar 2022. 5. 13. 08:46

형 변환 / 타입 변환(Casting)

  • 형 변환은 기존에 선언했던 자료형을 변경하는 것으로 자동 형 변환과 강제 형 변환이 있습니다.

  • 자동 형 변환
    • 허용 범위가 작은 타입에서 큰 타입으로 변경할 때는 자동으로 형 변환이 됩니다.
    • 기본 타입 크기 순서: byte < short / char < int < long < float < double
    • 단, byte 타입은 부호를 가지기 때문에 char 타입으로 자동 변환 되지 않습니다.
    • 또한, long 타입을 float로 변환하는 경우 대입한 숫자가 크다면 정밀도에서 차이가 발생할 수 있습니다.

자동 형 변환 예시

public class PromotionExample {
	public static void main(String[] args) {
    	// byte -> int
        // "intNum = 10" 출력
	byte byteNum = 10;
        int intNum = byteNum;
        System.out.println("intNum = " + intNum);
		
        // char -> int
        // "intNum2 = 44032" 출력
        char charNum = '가';
        int intNum2 = charNum;
        System.out.println("intNum2 = " + intNum2);
        
	// int -> long
        // "longNum = 1234" 출력
        int intNum3 = 1234;
        long longNum = intNum3;
        System.out.println("longNum = " + longNum);
        
	// long -> float
        // "floatNum = 1.2345678E7" 출력
        long longNum2 = 12345678L;
        float floatNum = longNum2;
        System.out.println("floatNum = " + floatNum);
        
	// float -> double
        // "doubleNum = 123.456" 출력
        float floatNum2 = 123.456F;
        double doubleNum = floatNum2;
        System.out.println("doubleNum = " + floatNum2);
	}
}

 

  • 강제 타입 변환
    • 허용 범위가 큰 타입에서 작은 타입으로 변경할 때는 강제로 형 변환을 해주어야 합니다.
    • 더 큰 숫자를 작은 범위에 넣는 것이기 때문에 데이터의 손실이 발생할 수 있습니다.
    • (수를 비트로 나열했다고 생각했을 때 변환할 타입의 허용 비트수를 벗어나는 비트를 버리는 식으로 변환)
    • 강제로 형 변환을 하기 위해서는 대입 값 앞에 괄호("( ... )")를 붙이고 변환할 타입을 입력하면 됩니다.

강제 형 변환 예시

public class PromotionExample {
	public static void main(String[] args) {
		// int -> byte
		// 10 출력 (값 보존)
		int intNum = 10;
		byte byteNum = (byte)intNum;
		System.out.println(byteNum);
		
		// 68 출력 (값 손실)
		int intNum2 = 1030221380;
		byte byteNum2 = (byte)intNum2;
		System.out.println(byteNum2);
		
		// 실수 -> 정수
		// 3 출력 (값 손실)
		double doubleNum 3.14;
		int intNum3 = doubleNum;
		System.out.println(byteNum3);
	}
}

   

 

 

연산식에서의 타입 변환

  • 변수의 연산에서 사용하는 자료형이 동일하다면 컴파일러는 컴파일 단계에서 미리 산술 연산 결과를 변수에 대입하여 바이트 코드를 생성하기 때문에 실제 프로그램 수행 시에는 연산을 하지 않습니다.

  • 하지만 변수의 연산에서 여러 자료형들을 사용할 경우 프로그램 실행 시 연산을 수행하며, 자동으로 타입 변환을 해줍니다.

  • 정수 타입의 산술 연산에서 int 보다 작은 byte, short는 자동으로 int 타입으로 변환되어 연산을 수행합니다.

  • 또한 연산을 수행하는 변수 중 int 보다 큰 자료형이 있다면 연산에 활용되는 모든 변수가 해당 타입으로 변경되어 계산됩니다.

  • 따라서 기본적으로 정수는 int를 사용하는 것으 효율적이며, 사용하고자 하는 수가 int의 범위를 벗어날 경우 타입 변환을 고려해야 합니다.

연산에서의 자동 형변환 예시

public class PromotionExample2 {
    public static void main(String[] args) {
        // 컴파일 단계에서 연산
        // "result1 = 30" 출력
        byte result1 = 10 + 20;
        System.out.println("result1 = " + result1);

        // int 타입으로 변환 후 연산
        // "result2 = 30" 출력
        byte val1 = 10;
        byte val2 = 20;
        int result2 = val1 + val2;
        System.out.println("result2 = " + result2);

        // long 타입으로 변환 후 연산
        // "result3 = 1110" 출력
        byte val3 = 10;
        int val4 = 100;
        long val5 = 1000L;
        long result3 = val3 + val4 + val5;
        System.out.println("result3 = " + result3);

        // int 타입으로 변환 후 연산
        // "result4 = 66" 출력
        //  char로 형변환 한 경우 "result4 = B" 출력
        char val6 = 'A';
        char val7 = 1;
        int result4 = val6 + val7;
        System.out.println("result4 = " + result4);
        System.out.println("result4 = " + (char)result4);

        // 정수의 연산 결과는 정수로 출력
        // "result5 = 2" 출력 (나머지는 버림)
        int val8 = 10;
        int result5 = val8 / 4;
        System.out.println("result5 = " + result5);

        // double 타입으로 변환 후 연산
        // "result6 = 2.5" 출력
        int val9 = 10;
        double result6 = val9 / 4.0;
        System.out.println("result6 = " + result6);

        // double 타입으로 변환 후 연산
        // "result7 = 0.5" 출력
        int val10 = 1;
        int val11 = 2;
        double result7 = (double) val10 / val11;
        System.out.println("result7 = " + result7);
    }
}