형변환(Casting, Type Conversion)
변수 또는 상수의 타입을 다른 타입으로 변환하는 것
서로 다른 타입간의 연산을 수행해야할 경우 연산을 수행하기 전에 타입을 일치시켜야하는데, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 말한다.
그렇다면 형변환은 왜 하는 것일까?
1 2 | 00000000 00000000 00000000 11001000 01000011 01001000 00000000 00000000 | cs |
사람이 보기에는 200과 200.0은 같은 수로 인식하지만 컴퓨터는 다르게 인식한다.
200이라는 숫자를 정수형 데이터 타입인 int로 저장하게 되면 1번 라인과 같이 0과 1의 조합을 가지게 된다. 하지만 실수형 데이터 타입인 float로 저장하게 되면 2번 라인과 같은 조합으로 저장한다. 즉, 정수 200과 실수 200.0의 값이 완전히 다르다는 것 알 수있다. 이렇게 서로 다른 수를 가지고 연산을 하게 된다면 값에 손실이 생기고 본래 의도했던 결과 도출이 안될 수도 있기 때문에 형변환을 통해 타입을 일치 시켜주는 것이다.
형변환의 방법
(타입)피연산자
1 2 3 4 5 6 7 8 9 10 | package com.doubles.javastudy.basic; public class JavaTypeCasting { public static void main(String[] args) { long x = 5; int y = (int) x; } } | cs |
형변환 방법은 형변환하고자하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 써주면 된다.
여기서 '()'를 캐스트 연산자, 형변환 연산자라고 한다.
자동(암시적) 형변환
서로 다른 타입간의 대입이나 연산을 수행할 때, 형변환으로 타입을 일치시키는 것이 원칙이지만, 경우에 따라 편의상을 이유로 형변환을 생략할 수도 있다. 형변환이 이루어지는 것이 아니라 컴파일러가 생략된 형변환을 자동적으로 추가하게 된다.
위의 코드를 보면 double형 변수 a에 3.0F 값을 대입하는 것은 오류가 없지만 float형 변수 b에 3.0을 대입할 경우에는 오류가 발생한다. 이 이유는 자동 형변환의 규칙에 어긋나기 때문이다.
*자동 형변환의 규칙
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
표현범위가 좁은 타입에서 넓은 타입으로 변환하는 경우 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 변환이 된다. 화살표 방향으로의 형변환은 형변환 연산자를 사용하지 않아도 자동 형변환되지만 역 방향으로의 변환은 반드시 형변환 연산자를 사용해야한다.
보통 자료형의 크기가 클 수록 값의 표현 범위가 크지만, 실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기라도 실수형이 정수형보다 훨씬더 큰 표현 범위를 갖기 때문에 float와 double이 가장 오른쪽에 위치한다.
short과 char는 같은 2 byte의 크기를 가지고 있기 때문에 서로 형변환이 가능할 것처럼 보이지만 char의 범위는 '0~2^16-1(65535)'이고 short의 범위는 '-2^15~2^15-1(-32768~32767)'이므로 서로 범위가 달라 형변환 시에 값의 손실이 발생할 수 있으므로 자동 형변환을 수행할 수 없다.
*자동 형변환이 되어 연산이 되는 과정
위와 같이 연산을 하게 되면 long형 변수 a에 담긴 3은 연산과정에서 3.0F로 변환되어 3.0F + 1.0F = 4.0F 가 된다. 그리고 나서 최종적으로 double형 변수 c에 담길 때에는 자동 형변환 되어 double형 데이터 타입인 4.0으로 출력이 된다.
명시적 형변환
자동 형변환이 적용되지 않는 경우에는 아래의 코드와 같이 수동으로 형변환을 해야한다.
실제 이클립스에서는 변수 a와 b는 오류가 발생하지만 변수 a1, b2는 수동으로 형변환을 해줬기 때문에 오류가 발생하지 않는다.
1 2 3 4 5 6 7 8 9 10 11 | public class JavaTypeCasting { public static void main(String[] args) { float a = 100.0; int b = 100.0F; float a1 = (float)100.0; int b1 = (int)100.0F; } } | cs |
출처 : 생활코딩(형변환) https://opentutorials.org/course/1223/5330 / 자바의 정석