자동 형변환과 강제 형변환

이동주·2025년 3월 1일

JAVA

목록 보기
5/30

자동 형변환

-> 데이터 타입을 다른 타입으로 자동적으로 변환하는 것
-> 값의 허용 범위가 작은 타입이 큰 타입으로 대입될 때 발생함
ex) 큰 허용 범위 타입 = 작은 허용 범위 타입 에서
작은 범위 타입이 큰 허용 범위 타입으로 자동적으로 변환됨
-> 컴파일 때 대입되는 타입을 확인하고 변환함
-> 값이 변수일 때는 변수의 타입 (byte의 크기)를 확인함
-> 기본 타입의 허용 범위 순
byte < short, char < int < long < float < double

-> 그러나 char 타입보다 작은 byte 타입은 char 타입으로 자동 변환이 불가능 함

public class PromotionExam {
	public static void main(String[] args) {
		byte byteValue = 10;
		int intValue = byteValue; 
        // int가 byte보다 범위가 더 넓기 때문에 int 타입의 값으로 변환
		System.out.println(intValue); // 10
		
		char charValue = '가';
		intValue = charValue; 
        // int가 char보다 범위가 더 넓으므로 int 타입의 값으로 변환 (char 타입 값은 유니코드 값으로 변환됨)
		System.out.println(intValue); // 44032
		
		intValue = 50;
		long longValue = intValue; 
        // long이 int보다 범위가 더 큼, int 타입의 값으로 변환
		System.out.println(longValue); // 50
		
		longValue = 100;
		float floatValue = longValue; 
        // float이 long보다 범위가 더 큼, float 타입의 값으로 변환
		System.out.println(floatValue); // 100.0
		
		floatValue = 100.5f;
		double doubleValue = floatValue; 
        // double이 float보다 범위가 더 큼, double 타입의 값으로 변환
		System.out.println(doubleValue); // 100.5
	}
}

강제 형변환

-> byte 값의 큰 타입의 값을 작은 타입의 값으로 변환하는 등 원하는 타입의 형태로 값을 도출할 때 사용
-> 변환하고자 하는 타입을 괄호 안에 넣고 뒤에 값 또는 변수 선언
ex) int value = (int) longvalue;

public class CastingExample{
	public static void main(String[] args) {
		int var1 = 10;
		byte var2 = (byte) var1; 
        //var1이 int 타입의 변수고, byte가 int보다 byte가 더 작음, byte 타입으로 변환해야함
		System.out.println(var2); //10
		
		long var3 = 300;
		int var4 = (int) var3; 
        //var3이 long 타입의 변수, int가 long보다 byte가 더 작음, int 타입으로 변환해야함
		System.out.println(var4); //300
		
		int var5 = 65;
		char var6 = (char) var5; 
        //var5가 int 타입의 변수, char이 int보다 byte가 더 작음, char 타입으로 변환해야함 (변환 시 ascii 코드 값의 문자로 나옴)
		System.out.println(var6); //A
		
		double var7 = 3.14;
		int var8 = (int)var7; 
        //var7이 double 타입의 변수, int가 double보다 byte가 더 작음, int 타입으로 변환해야함 (변환시 소수점 잘려나감, 반올림 x)
		System.out.println(var8); // 3
	}
}

연산식에서 자동 형변환

1. int 타입

-> 정수 타입의 산술연산식의 경우에는 int 타입보다 작은 byte, short타입의 값이나 변수가 자동적으로 int 타입으로 변환함
-> byte나 short 타입의 변수나 값이 피연산자로 사용되면 int 타입으로 저장되기 때문에 연산식의 결과값은 int 타입으로 저장해야 함

ex) (타입) (연산식); 의 형태

2. long 타입

-> 산술 연산식에 long 타입의 변수나 값이 있을 경우 결과 값이 자동적으로 long 타입으로 변환됨

3. 실수 타입

-> 정수간의 연산식을 실수 타입에 저장할 경우 소수점 값이 사라짐
-> 따라서 실수 형태로 나타내기 위해서는 피연산자를 실수 형태로 강제 형변환 해야함
ex) 정수 / 정수 = 정수
정수 / 실수 = 실수

public class OperationPromotion{
	public static void main(String[] args) {
		byte result1 = 10 + 20; 
        // 컴파일 단계에서 연산 후 정수 타입으로 확인함
		System.out.println("result1: " + result1);
		
		byte v1 = 10;
		byte v2 = 20;
		int result2 = v1 + v2; 
        // 컴파일 단계에서 자동으로 int 타입으로 확인됨
		System.out.println("result2: " + result2);
		
		byte v3 = 10;
		int v4 = 100;
		long v5 = 1000L;
		long result3 = v3 + v4 + v5; 
        // long 타입의 변수값이 있을 경우 연산 식이 long 타입으로 변환됨
		System.out.println(result3);
		
		char v6 = 'A';
		char v7 = 1;
		int result4 = v6 + v7; 
        // 컴파일 단계에서 자동으로 int 타입으로 변환됨 (v7의 경우 ascii 코드 값으로 도출됨)
		System.out.println(result4);
		
		int v8 = 10;
		int result5 = v8 / 4; 
        //정수/정수 = 정수 (반올림 x) : 타입을 float/double로 바꾸더라도 정수로 나누면 소수점 값은 사라짐
		System.out.println(result5);

		double result6 = v8 / 4.0; 
        //정수/실수 = 실수 : 실수로 나누기 위해서는 꼭 소수점을 찍어야함. double 타입으로 변환됨
		System.out.println(result6);
		
		int v9 = 1;
		int v10 = 2;
		double result7 = (double) v9 / v10; 
        // int가 double보다 byte값이 작으므로 double로 변환해야함
		// double로 변환 없이 int 변수값으로만 나눌 경우 소수점 값이 사라짐
		System.out.println(result7);
	}

}

4. String 타입

-> 숫자와 문자열의 혼합 연산식의 경우 결과값은 문자열로 나타남
-> 앞에 있는 값부터 순차적으로 계산하기 때문에 뒤에 숫자 형태의 피연산자가 나와도 모두 문자열로 취급함
-> 뒤에 있는 피연산자로 연산을 하고자 할 때는 연산식을 괄호 안에 집어넣기!

public class StringConcatExample {
	public static void main(String[] args) {
		int result1 = 10 + 2 + 8;
		System.out.println(result1); // 20
		
		String result2 = 10 + 2 + "8"; 
        //문자열이 포함되어 있으므로 변수를 String 타입으로 지정해야함
		System.out.println(result2); 
        // 128 : 8을 문자열로 지정했으므로 문자로 취급.
		
		String result3 = 10 + "2" + 8; 
        //맨 앞부터 연산이 처리가 되기 때문에 앞에 문자열이 나오면 그 뒤로부터는 문자열 취급
		System.out.println(result3); // 1028
	
		String result4 = "10" + 2 + 8; 
        //맨 앞부터 연산이 처리가 되기 때문에 앞에 문자열이 나오면 그 뒤로부터는 문자열 취급
		System.out.println(result4); // 1028
		
		String result5 = "10" + (2+8); 
        //괄호 연산자가 있을 경우 괄호 연산자부터 처리됨
		System.out.println(result5); // 1010
	}

}
profile
끄작끄작

0개의 댓글