-
[Java] 타입 변환언어/Java 2020. 12. 26. 20:12
자동 타입 변환
자바에서는 값의 허용 범위가 작은 타입에서 큰 타입으로 저장될 때 자동으로 타입이 변환됩니다.
허용 범위 순서
- byte < short < int < long < float < double
예시
byte var1 = 10; int var2 = var1; // 자동 변환 byte -> int long var3 = 100000000L; float var4 = var3; // 1.0E8f double var5 = var3; //1.0E8 char var6 = 'A'; int var7 = var6; // 65 byte var8 = 65; char var9 = var8; // char는 음수를 허용하지 않으므로 컴파일 에러
강제 타입 변환
허용 범위가 큰 타입에서 작은 타입으로 변환하고자 할 때엔 강제로 지정을 해줘야 합니다.
int var1 = 10; byte var2 = (int) var1; double var3 = 3.14; int var4 = (int) var3; // 정수 3만 저장
정수, 실수 연산에서 자동 타입 변환
연산을 수행할 때, int 보다 작은 byte, short 타입의 변수가 피연산자로 사용되면 자동으로 int로 변환되어 식을 수행합니다.
- byte, char, short int 타입끼리의 연산은 int로 자동 타입 변환이 됨
- int result = (정수 타입) +,-,/,*,% (정수 타입)
// 1번째 byte x = 1; byte y = 2; byte result = x + y; // 컴파일 에러 int result1 = x + y; // 2번째 int x1 = 1; int y1 = 2; int result2 = x1 + y1;
위의 두 케이스를 컴파일하면 동일한 바이트 코드가 나오기 때문에 2번째와 같은 형태로 진행해 타입 변환 시간을 줄이는 것이 효율적입니다.
실행 성능을 위해 컴파일 단계에서 연산이 가능합니다.
- byte result = 10 + 20;
컴파일 단계에서 10 + 20을 미리 연산해 30이란 결과를 만들고 result 변수에 저장하도록 바이트 코드를 생성합니다. 피연산자 변수가 아니므로 int 타입으로 변환하지 않습니다.
여기서 만약 int 타입보다 더 큰 허용범위의 타입이 피연산자로 사용되면 int를 포함하여 모두 허용 범위가 더 큰 타입으로변환이 됩니다.
int x = 1; byte y = 2; long z = 1000L; long result = x + y + z;
+ 연산에서의 문자열 자동 타입 변환
자바에서는 피연산자가 모두 숫자일 경우, 덧셈 연산을 하고 피연산자 중, 하나가 문자열이면 나머지 피연산자가 숫자여도 문자열로 자동 변환해 문자열 결합 연산을 합니다.
숫자 + 숫자 → 덧셈 연산 → 숫자
"문자열" + 숫자 → "문자열" + "숫자" → 결합 연산 → "문자열숫자"
숫자 + "문자열" → 숫자 + "문자열" → 결합 연산 → "숫자문자열"
파이썬에서는 1 + "1"의 경우 타입이 서로 맞지 않아 오류를 발생시키지만 자바에서는 위와 같은 규칙으로 인해 오류가 발생하지 않습니다.
int var1 = 1 + 1; // 11 String var2 = "1" + 1; // "11" String var3 = 1 + "1"; // "11" String var4 = "AA" + 1; // "AA1"