타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.
ex) byte -> int, byte -> int
자동 타입 변환 (promotion)
자동 타입 변환은 자동으로 타입 변환이 일어나는 것을 의미하는데 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생한다.
ex 1) byte -> int
byte a = 10;
int b = a; // 자동 타입 변환
ex 2) 정수 -> 실수
long a = 5000000000L;
float b = a; // 5.0E9f로 저장
double = a; // 5.0E9로 저장
실수 타입은 정수 타입보다 허용 범위가 더 크다.
ex 3) char -> int
char a = 'A';
int b = a // 65가 저장
** 예외
byte a = 65;
char b = a // 컴파일 에러 -> char 타입의 허용 범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문에 실패
강제 타입 변환
큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없다. 마치 큰 그릇에 가득 채운 물을 작은 그릇 안에 모두 넣을 수 없는 것과 동일한 이치이다. 하지만 큰 그릇의 물을 작은 그릇 크기로 나눠서 한 부분만 작은 그릇에 넣는 것은 가능하다.
이와 같이 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 강제 타입 변환 (캐스팅, casting)이라고 한다. 강제 타입 변환은 캐스팅 연산자 괄호()를 사용하는데, 괄호 안에 들어가는 타입은 나누는 단위이다.
작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
ex 1) int -> byte
int a = 10;
byte b = (byte) a; // 강제 타입 변환
ex 2) int -> char
int a = 65;
char b = (char) a;
System.out.println(b); // A 가 출력됨
ex 3) 실수 -> 정수
double a = 3.14;
int b = (int) a; // b는 정수 부분인 3만 저장
실수 타입은 정수 타입으로 강제 변환 될때 소수점 이해 부분은 버려지고, 정수 부분만 저장된다.
정수 연산에서의 자동 타입 변환
정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환 되어 연산을 수행한다.
int result = [byte, char, short, int 타입] [연산자 +, -, *, / %] [byte, char, short, int 타입]
byte x = 10;
byte y = 20;byte result = x + y;// 컴파일 에러 (Type mismatch: cannot convert from int to byte)
int result = x + y; // 30
만약 int 타입 보다 허용 범위가 더 큰 long 타입이 피연산자로 사용될 경우 무조건 long 타입으로 변환하고 연산을 수행한다.
long result = [long 타입] [연산자 +, -, *, / %] [byte, char, short, int 타입]
byte x = 10;
int y = 100;
long z = 1000L;
long result = x + y + z; // 1110
실수 연산에서의 자동 타입 변환
실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우 두 피연산자가 동일 타입이라면 해당 타입으로 연산되지만, 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행한다.
int 타입과 double 타입을 연산해도 동일한 과정을 거치게 된다.
int x = 10;
double y = 5.5;
double result = x + y // result: 15.5
만약 int 타입으로 연산을 하고 싶다면 강제 타입 변환을 한다
int x = 10;
double y = 5.5;
int result = x + (int) y; //result: 15
** 수학에서 1을 2로 나누면 결과값은 0.5가 된다. 이것을 코드로 옮기면 다음과 같다
int x = 1; int y = 2;
double result = x / y;
위의 코드의 result 값은 0.5가 아닌 0.0이다. 자바에서 정수 연산의 결과는 정수가 되기 때문이다. x / y의 연산 결과는 0.5가 아니라 0이 되고, 0을 double 타입의 변수 result에 저장하므로 0.0이 되는 것이다.
결과값이 0.5가 되기 위해서는 다음과 같은 방법으로 수정해야 한다.
방법1.
int x = 1; int y = 2;
double result = (double) x / y;
방법2.
int x = 1; int y = 2;
double result = x / (double) y;
방법3.
int x = 1; int y = 2;
double result = (double) x / (double) y;
만약, (double) (x/y)로 수정하게 되면 (x/y)가 먼저 연산이 되어 0이 되고, 여기에 (double)을 적용해 0.0가 된다.
+ 연산에서의 문자열 자동 타입 변환
자바에서 + 연산자는 두 가지 기능을 가지고 있습니다. 피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행하지만, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행합니다. 또한 연산식에서 + 연산자가 연이어 나오면 앞에서부터 순차적으로 + 연산을 수행합니다.
1. 숫자 + 숫자 = 숫자
2. "문자열" + 숫자 = "문자숫자열"
ex)
int value = 3 + 7; -> int value = 10;
String str = "3" + 7 -> String str = "37";
String str = 1 + 2 + "3" -> String str = "33";
String str = "1" + 2 + 3 -> String str = "123";
'BACKEND > Java' 카테고리의 다른 글
[Java] 데이터 타입(Data Type) / 이스케이프(Escape) 문자 (0) | 2020.08.04 |
---|---|
[Java] 변수 (0) | 2020.08.02 |
[Java] 프로그램 소스 분석 / 주석 / 세미콜론 (0) | 2020.08.02 |
[Java] 터미널에서 컴파일하고 실행하기 (0) | 2020.08.02 |
[Java] 프로젝트 생성 (0) | 2020.08.02 |