728x90
반응형
형변환 Type Casting
- 어떤 데이터 타입을 다른 데이터 타입으로 변환하는 것
기본 형변환
- 기본 데이터 타입 8가지 중 boolean을 제외한 나머지 7가지 타입끼리의 형변환
- 작은 타입에서 큰 타입으로 변환 시 자동 형변환
묵시적(암시적) 형 변환 = 자동 형변환
- 작은 데이터 타입 데이터를 큰 데이터 타입으로 변환하는 것
- 별다른 추가 작업 없이 그대로 전달하면 컴파일러에 의해 자동으로 변환됨
- 변환된 후에도 데이터의 변형이 없음
- 큰 타입에서 작은 타입으로 변환 시 강제 형변환
명시적 형변환 = 강제 형변환- 큰 데이터 타입 데이터를 작은 데이터 타입으로 변환하는 것
- 값의 손실(= 넘침(Overflow))이 발생할 가능성이 있으므로 컴파일러에 의해 자동으로 형변환 되지 않는다.
- 형변환 연산자를 사용하여 강제 형변환을 수행해야 한다
우변 데이터 앞에 소괄호()를 붙이고 괄호 사이에 좌변의 작은 데이터 타입(변환할 타입)의 이름을 명시 - 강제 형 변환 후에도 Overflow에 의해 값의 손실이 일어나서 원본 데이터가 아닌 다른 데이터가 저장될 수 있음
단, 작은 데이터 타입에서 표현 가능한 범위일 경우 기존 값이 유지될 수 있음
int a1 = 999;
short a2 = 100;
System.out.println("a1(int) : " + a1 + ", a2(short) : " + a2);
a1 = a2; // short 타입 변수 a2 의 데이터(100)를 int 타입 변수 a1 에 저장
// => 이 때, 작은 타입인 short 타입 변수 a2 의 데이터가
// 큰 타입인 int 타입으로 변환되는 것을 묵시적 형변환(자동 형변환)이라고 한다!
System.out.println("a1(int) : " + a1 + ", a2(short) : " + a2);
System.out.println("----------------------------------");
int b1 = 99999;
short b2 = 100;
System.out.println("b1(int) : " + b1 + ", b2(short) : " + b2);
// b2 = b1; // int 타입 변수 b1 의 데이터(999)를 short 타입 변수 b2 에 저장
// => 오류 발생!
// => 큰 타입(int) 데이터를 작은 타입(short) 에 저장할 때
// 값에 대한 넘침(Overflow)이 발생할 수 있으므로 자동 형변환을 수행하지 않음
// => 형변환 연산자를 사용하여 명시적 형변환(강제 형변환) 을 수행해야함
b2 = (short)b1;
// 강제 형변환 후에는 Overflow 에 의해 원래의 데이터가 아닌
// 다른 변형된 데이터가 저장될 수 있으므로 주의해야한다!
System.out.println("b1(int) : " + b1 + ", b2(short) : " + b2);
// int형 변수 b1 의 99999 정수가 short형 변수 b2 에 저장되면
// Overflow 에 의해 99999 가 아닌 다른 데이터로 변형됨
// => 만약, int형 변수 b1 에 short 타입이 표현 가능한 범위의 데이터가 있을 경우
// 강제 형변환 후에도 원본 데이터가 그대로 유지될 수 있다!
System.out.println("----------------------------");
int c1 = 266;
byte c2 = 10;
System.out.println("c1(int) : " + c1 + ", c2(byte) : " + c2);
// 작은 타입(byte) -> 큰 타입(int)로 변환
c1 = c2;
System.out.println("c1(int) : " + c1 + ", c2(byte) : " + c2);
int d1 = 266;
byte d2 = 10;
System.out.println("d1(int) : " + d1 + ", d2(byte) : " + d2);
// 큰 타입(int) -> 작은 타입(byte)으로 변환
// d2 = d1; // 오류 발생! 강제 형변환 필요!
d2 = (byte)d1; // 형변환 연산자를 사용하여 byte 타입으로 강제 형변환
// => int형 변수에 저장된 정수 266 이 byte 타입 변수에 저장될 때 10 으로 변형됨
System.out.println("d1(int) : " + d1 + ", d2(byte) : " + d2);
char se = 'A';
int i1 = 1234;
long l1 = i1; // int -> long 으로 자동형변환
System.out.println(i1 + ", " + l1); // 1234, 1234 출력됨
//byte b1 = i1; // int -> byte 로 자동형변환 불가
byte b1 = (byte)i1; // byte 타입으로 명시적(강제) 형변환 필수!
// => 변환 과정에서 오버플로우가 발생하므로 다른 값이 저장됨
System.out.println(i1 + ", " + b1); // 1234, -46 출력됨
double d1 = i1; // int -> double 로 자동형변환(소수점 .0 추가됨)
System.out.println(i1 + ", " + d1); // 1234, 1234.0 출력됨
double d2 = 0.12345678901234567890;
//float f1 = d2; // double -> float 로 자동형변환 불가
float f1 = (float) d2; // float 타입으로 명시적(강제) 형변환 필수!
System.out.println(d2 + ", " + f1);
// double 타입은 소수점 18번째자리에서 반올림 17자리로 표시
// float 타입은 소수점 9번째자리에서 반올림 8자리로 표시
byte b3 = 67;
//char c1 = b3; // 오류 발생
// char <-> byte 또는 short 타입 간의 변환은 반드시 명시적 형변환
char c1 = (char)b3;
System.out.println(b3 + ", " + c1); // 67, C 출력됨
// boolean 타입은 그 어떤 데이터타입과도 형변환 불가능
728x90
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 자바의 비교&논리 연산자 (0) | 2021.01.18 |
---|---|
[JAVA] 자바의 연산자 (0) | 2021.01.18 |
[JAVA] 자바의 변수와 상수 (Variable & Literal) (0) | 2021.01.18 |
[JAVA] 자바의 데이터 타입 (0) | 2021.01.18 |
[JAVA] 주석 comment (0) | 2021.01.18 |