국비/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); |