형변환
1. 형변환(캐스팅, casting)이란?
- 변수 또는 상수의 타입을 다른 타입으로 변환하는 것.
2. 형변환 방법
- 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여준다. (타입)피연산자
double d = 84.5;
int score = (int)d; // double 타입의 변수 d를 int 타입으로 형변환
//단계별 과정
int score = (int)d;
-> int score = (int)85.4; // 변수 d의 값을 읽어 와서 형변환한다.
-> int score = 85; // 형변환의 결과인 85를 변수 score에 저장한다.
- 피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.
- 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.
- 기본형간의 형변환 예시
- float →int 변환할 때, 소수점 이하의 값은 반올림이 아닌 버림으로 처리된다.
3. 정수형 간의 형변환
- 큰 타입에서 작은 타입으로의 변환, int(4byte) → byte(1byte) 은 값손실이 발생할 수 있다.
- 작은 타입에서 큰 타입으로의 변환, byte(1byte) → int(4byte) 은 값손실이 발생하지 않는다.
- 원래의 값을 채우고 남은 빈공간은 0으로 채우는 게 보통이지만, 변환하려는 값이 음수인 경우에는 형변환 후에도 부호를 유지할 수 있도록 빈 공간은 1로 채운다.
4. 실수형 간의 형변환
- 정수형처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간은 0으로 채운다.
- float타입의 범위를 넘는 값을 float로 변환하는 경우 ‘±무한대’ 또는 ‘±0’을 결과로 얻는다.
5. 정수형과 실수형간의 형변환
1) 정수형 → 실수형
- 정수는 소수점 이하의 값이 없으므로 변환이 간단하다.
- 정수는 2진수로 변환한 다음 정규화를 거쳐 실수의 저장형식으로 저장된다.
- 실수형은 정수형보다 큰 저장 범위를 갖기 때문에 비교적 간단하지만 실수형의 정밀도의 제한으로 인한 오차가 발생할 수 있다.
2) 실수형 → 정수형
- 실수형을 정수형으로 변환하면, 정수형의 표현형식으로 소수점 이하의 값은 표현할 수 없기 때문에 실수형의 소수점 이하의 값은 버려진다.
6. 자동 형변환
- 서로 다른 타입간의 덧셈에서는 두 타입 중 표현범위가 더 넓은 타입으로 형변환하여 타입을 일치시킨 후 연산을 수행한다.
- 컴퓨터에서의 값의 처리 규칙
- 대입 연산자를 사용할 때 대입 연산자를 기준으로 왼쪽과 오른쪽은 같은 자료형이어야 한다.
- 같은 자료형끼리만 연산이 가능하다. (연산 결과도 같은 자료형으로 나온다.)
- 자동 형변환의 규칙
- 자동 형변환이 가능한 방향 :
byte (1byte) → short & char (2byte) → int (4byte) → long (8byte) → float (4byte) → double (8byte)
-
- 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
- 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다. (자동 형변환)
- 실수형은 정수형과 같은 값을 표현하는 방식이 다르기 때문에 값은 크기라도 실수형이 더 큰 표현 범위를 갖고 있다.
- char와 short는 서로 범위가 달라서 어느 쪽으로의 형변환도 값 손실이 발생할 수 있어 자동 형변환이 수행될 수 없다.
- [정리]
- boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
- 기본형과 참조형은 서로 형변환할 수 없다.
- 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
1) 자동 형 변환(묵시적 형 변환)
- 자동으로 형 변환이 이루어지기 때문에 개발자가 형 변환을 시켜줄 필요가 없다.
- 데이터 표현 범위가 작은 자료형을 큰 자료형으로 변환한다.
public void autoCasting() {
short s = 12;
int i = s; // short -> int 자동 형 변환, 작은 short를 큰 int !
long l = i; // int -> long 자동 형 변환
// float이 long 보다 표현 가능한 수의 범위가 더 크기 때문에 자동 형 변환이 가능하다
// float f = 1;
float f = 10000000000000L;
double d = f;
double result = 0.0;
result = 12 + 3.3; // 정수 < 실수, 12.0 + 3.3 = 15.3
// long result2 = 30 + 30; // 30 + 30 = 60, 60을 long로 형 변환해서 저장(60L)
long result2 = 30 + 30L; // 30L + 30L = 60L
System.out.println("s : " + s);
System.out.println("i : " + i);
System.out.println("l : " + l);
System.out.println("f : " + f);
System.out.println("d : " + d);
System.out.println("result : " + result);
System.out.println("result2 : " + result2);
i = '문';
char ch = 47932; // 범위가 그 사이에 들어가야 한다.
byte b1 = 10;
byte b2 = 20;
// byte result3 = b1 + b2; // byte, short 타입의 데이터는 연산시 무조건 int 타입으로 처리한다.
byte result3 = (byte)(b1 + b2);
System.out.println("i : " + i);
System.out.println("ch : " + ch);
System.out.println("result3 : " + result3);
}
2) 강제 형 변환(명시적 형 변환)
[표현법]
(자료형) 데이터;
- 범위가 큰 크기의 자료형의 데이터를 작은 크기의 자료형으로 변환하려고 할 때 사용한다.
- (자료형)을 형 변환 연산자라고 한다.
- 강제 형 변환의 경우 데이터 손실이 발생할 수 있다.
- boolean은 형 변환이 불가능하다. (true, false 값만 가질 수 있다.)
public void casting() {
double d = 3.14;
// float f = d; // error
float f = (float) d;
int i = (int) f;
// int sum = 0;
double sum = 0.0;
System.out.println("d = " + d);
System.out.println("f = " + f);
System.out.println("i = " + i);
i = 10;
d = 5.76;
// 1) 수행 결과를 int로 강제 형 변환
// sum = (int) (i + d); // 10.0 + 5.76 = 15.76 -> 15
// 2) double 타입의 값을 int로 강제 형 변환
// sum = i + (int) d; // 10 + 5 = 15
// 3) double 타입의 변수로 변경한다.
sum = i + d;
System.out.println("sum : " + sum);
System.out.println((byte) 256);
}
'Java' 카테고리의 다른 글
연산자(Operator) - 산술 연산자 & 비교 연산자 (0) | 2022.08.17 |
---|---|
연산자(Operator) - 연산자(operator) & 단항 연산자 (0) | 2022.08.17 |
변수(Variable) - 변수의 타입 : printf() & Scanner (0) | 2022.08.16 |
변수(Variable) - 변수와 상수 (0) | 2022.08.15 |
변수(Variable) - 변수의 타입 : 기본형 & 상수와 리터럴 (0) | 2022.08.15 |