형변환
다른 타입 간의 연산을 수행해야 할 때 수행하기 전에 타입을 일치시켜야 하는데, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 ‘형변환(casting)’이라고 한다.
컴퓨터는 이진수만 알고 있다.
자동 형변환
경우에 따라 생략했을 때 자료형의 크기가 큰 방향으로, 정수보다는 실수 형으로(소수점을 보전하는 쪽으로) 자동 형변환 된다. 이는 형변환이 이뤄지지 않는 것이 아니고, 컴파일러가 생략된 형변환을 자동적으로 추가한다.
float f =1234; // float f = (float)1234;에서 (float)가 생략됨
화살표 방향으로의 변환, 즉 왼쪽에서 오른쪽으로의 변환은 형변환 연산자를 사용하지 않아도 자동 형변환 되며, 그 반대 방향으로의 변환은 반드시 형변환 연산자를 써야 한다.
명시적 형변환
변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하려는 경우에 형변환을 생략하면 에러가 발생한다.
byte b = 1000; // 에러. byte타입의 범위(-128 ~ 127)를 벗어난 값의 대입
다음과 같이 명시적으로 형변환을 해줬을 경우, 형변환이 프로그래머의 실수가 아닌 의도적인 것으로 간주하고 컴파일러는 에러를 발생시키지 않는다.
byte b = (byte)1000; //OK. 그러나 값 손실이 발생해서 변수 b에는 -24가 저장됨.
값 손실 등의 위험이 존재할 수 있기 때문에, 개발자가 형 변환을 직접 명시하여 강제로 형변환을 진행한다.
산술 변환
이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 형변환 연산자로 타입을 일치시켜야한다.
이처럼 연산 전에 피연산자 타입의 일치를 위해 자동 형변환 되는 것을 ‘산술 변환’ 또는 ‘일반 산술 변환’이라 하며, 이 변환은 이항 연산에서만 아니라 단항 연산에서도 일어난다. ‘산술 변환’의 규칙은 다음과 간다.
- 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)float + int → float + float → float
- double + float → double + double → double
- long + int → long + long → long
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
- char + short → int + int → int
- byte + short → int + int → int
int /(float)int -> int / float -> float / float -> float
5 /(float) 2 -> 5 / 2.0f -> 5.0f / 2.0f -> 2.5f
byte a = 10;
byte b = 20;
byte c = a + b; // 컴파일 에러가 발생한다. 명시적으로 형변환이 필요하다.
System.out.println(c);
a와 b는 모두 int형보다 작은 byte형이기 때문에 연산자 ‘+’는 이 두 개의 피연산자들의 자료형을 int형으로 변환한 다음 연산(덧셈)을 수행한다.
그래서 ‘a + b’의 연산결과는 byte형이 아닌 int형(4 byte)인 것이다. 4byte의 값을 1byte의 변수에 형변환 없이 저장하려고 했기 때문에 에러가 발생한 것이다.
'Server > 자바의정석' 카테고리의 다른 글
[Java 입문] 연산자2 (0) | 2022.09.26 |
---|---|
[Java 입문] 연산자1 (0) | 2022.09.26 |
[Java 입문] 기본형과 참조형 (0) | 2022.09.25 |
[Java 입문] 변수와 타입 (variable & type) (0) | 2022.09.25 |
[Java입문] 자바 소개 & 특징 (0) | 2022.09.25 |