국비/Java

[03-1] Java - type casting, promotion 형변환

제발 취업하게 해주세요 2022. 4. 11. 19:04
❗ 형변환 (Type Casting) : 값의 종류, 자료형을 바꾸는 개념
* 컴퓨터 안에서 값을 처리하는 규칙
*
* 1. = (대입연산자)를 기준으로 왼쪽, 오른쪽이 같은 자료형이여야 한다.☆☆☆☆☆☆
* => 같은 자료형에 해당하는 리터럴 값만 대입이 가능하다
* => 자료형이 다를 경우 ? == 값을 바꿔서 대입해야 함
*
* 2. 같은 자료형들끼리만 연산이 가능하다.
* => 다른 자료형들끼리 연산을 하고 싶다? 둘 중 하나를 "형변환"을 해서 나머지 하나와 동일하게 만들어줘야 함
*
* 3. 연산의 결과물도 같은 자료형이어야 한다.
* ex) 1(정수) + 1(정수) = 2(정수), 1.1(실수) + 1.1(실수) = 2.2(실수)
*
*
* [표현법] (바꿀자료형)값
* 형변환 연산자, cast 연산자
*
* 형변환의 종류
*
* 1. 자동형변환(promotion) : 자동으로 형변환이 진행
* 작은 크기 자료형 -> 큰 크기의 자료형
* 내가 형변환을 할 필요가 없음
*
* 2. 강제형변환(Type Casting) : 자동 형변환이 되지 않은 경우에 진행
* 직접 내가 형변환을 해야할 때 => () 통해서 진행!!
* 큰 크기의 자료형 -> 작은 크기의 자료형
* => 값의 손실이 발생할 수 있기 때문에 신중하게 해야 한다.
*

‼️ 자동형변환(promotion) : 작은 바이트 -> 큰 바이트
* 특이케이스 1. long(8byte, 정수) -> float(4byte, 실수)

* 정수가 실수로 담길 때 큰 사이즈의 정수가 작은 사이즈의 실수에 대입 가능
* 왜?? 4byte의 float형이 long형보다 담을 수 있는 값의 범위가 더 크기 때문이다.
* 표현할 수 있는 범위가 더 넓다

// 정수(1~3) -> 1 2 3
// 실수(1~3) -> 1 1.0001 1.0002 1.0003... 2... 3


* 특이케이스 2. char(2byte) <-> int(4byte) : char와 int는 양방향 형변환이 가능하다.
// 아스키코드표 참고

* 특이케이스 3. byte, short 간의 연산

byte b1 = 126;
byte b2 = 2;

System.out.println(b1 + b2);
// 결과값이 int형 => cpu가 값을 처리하는 기본 크기 int(4byte)

byte b3 = (byte)128; // byte : -128 ~ 127
System.out.println(b3); // -128 오버플로우

		int i1 = 10;
		System.out.println(i1); //10
		
		double d1 = /*(double)*/i1;
		System.out.println(d1); //10.0
		// int는 정수 double은 실수, d1 = 10 -> 10.0
		
        
		//int(4byte, 정수) -> long(8byte, 정수)
		int i2 = 120000;
		long l3 = i2;
		System.out.println(l3); // 120000
  
  
  
        // 특이케이스 2
        char ch = 98;
		char ch2 = 'b';
		int num = ch;
		System.out.println(num);
		System.out.println('b'); //b
		System.out.println((int)'b'); // 98
		System.out.println('b' + 2); // 100
		// => 자료형이 같아야 연산이 됨, b가 int형인 98로 형변환되어 연산
        
		System.out.println('b' + (char)2); // 100
		// => 더하기보다 (char)2가 먼저 수행, 단일문자는 연산할 때 int로 바뀜
		
		
		// 둘이 같을까요 다를까요??
		System.out.println((char)2 + (char)'2'); // 52
		// 2 + 문자2(정수50) = 2 + 50 = 52
		System.out.println((char)2 + (char)2); // 4
		
		int a = 2; // 정수 2
		
		System.out.println(a);
		System.out.println((char)a); // 문자 2 =  stx
		
		char c = '2'; // 단일 문자 '2'
		System.out.println(c);
        
        // 비교연산자 	좌항과 우항의 값을 비교해서 결과값 반환
		// 논리값 true, false
		// == 
        
		System.out.println(2 == '2'); // false
		System.out.println(2 == a); // true
		System.out.println('2' == c); // true
		System.out.println(a == c); // false
		
		System.out.println(2 == (int)'2'); // 2 == 50 // false
		System.out.println((char)2 == '2'); //  == 문자 2 // false
		System.out.println((int)a == (int)c); // 2 == 50 // false
‼️ 강제형변환(Type Casting) : 큰 바이트 -> 작은 바이트
* 명시적 형변환이라고도 함
* (바꿀 자료형) 값;

// 1. double(8byte) -> float(4byte)
float f1 = 4.0f;
double d2 = 8.0;

float f2 = (float) d2;

// 2. double(8byte) -> int(4byte)
double d3 = 10.89;
int i3 = (int)d3;

System.out.println(i3); // 0.89 소수점 뒷부분이 절삭되었다 => 데이터 손실

int iNum = 10;
double dNum = 8.99;

System.out.println(iNum + dNum); // 18.99
//BigDecimal _ 클래스

int result = iNum + (int)dNum;
System.out.println(result); // 18

result = (int)(iNum + dNum);
System.out.println(result);