형 변환이란 변수가 가지고 있는 타입을 다른 타입으로 바꾸는 것을 말합니다.
자바에서는 boolean형을 제외하고는 기본 타입 간의 타입을 자유롭게 변환시킬 수 있는데요.
기본적으로 연산을 할 때 같은 타입이어야 연산이 가능합니다.
하지만 byte에서 int로 형 변환을 할 때는 메모리에 할당받은 크기가 작은 것에서 큰 것으로의 변환은 생략 가능합니다.
컴파일 할 때 자동으로 형 변환이 된다고 해야 할까요?
하지만 메모리에 할당받은 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생하게 됩니다.
즉, 에러가 발생하게 됩니다.
형 변환에는 크게 두 가지 종류가 있습니다.
묵시적 형 변환과 명시적 형 변환인데요. 코드와 함께 자세하게 알아보겠습니다.
1. 묵시적 형 변환
묵시적 형 변환은 산술이나 대입 연산에서 자동으로 수행하는 타입 변환을 말합니다.
데이터 손실이 발생하지 않거나 최소화되는 방향으로 묵시적 형 변환을 진행합니다.
쉽게 말해 자동 형 변환이라고 말할 수 있습니다.
코드로 간단하게 보겠습니다.
byte num1 = 100; //byte로 자동 형 변환
double num2 = 200; //double로 자동 형 변환
int num3 = 12.25; //에러 발생
double num4 = 7.0f + 3.33; //float와 double의 연산 -> float가 double로 자동 형변환
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
System.out.println(num3);
위의 명령을 수행했을 때 num1의 경우 데이터를 손실하지 않으니 100이라는 정수형 숫자는 자동으로 byte로 인식합니다.
num2의 경우도 마찬가지로 200이라는 정수는 데이터 손실이 발생하지 않기 때문에 double로 자동으로 형 변환이 됩니다.
하지만 num3의 경우 정수형 타입 int에 실수 12.25를 대입하게 됩니다.
이런 경우 int 타입이 표현할 수 없는 더 큰 범위의 double형 데이터를 대입하게 되어 데이터 손실을 발생시켜 컴파일 에러를 발생시킵니다.
num3는 묵시적 형 변환을 하지 않습니다.
//(연습문제1) 다음 중 정상적으로 작동하는 경우와 에러가 발생하는 경우는?
byte num1 = 100;
byte num2 = 150;
int num3 = 200;
int num4 = 976431547879314856;
long num5 = 976431547879314856;
float num6 = 3.14;
double num7 = 142;
double num8 = 31.23;
int num9 = 1.1;
//정답은 해당글 맨아래에 작성해두겠습니다.
2. 명시적 형 변환
명시적 형 변환은 사용자가 타입을 강제적으로 바꾸어 주는 것을 말합니다.
형 변환을 하고 싶은 값 앞에(타입)을 써줌으로써 가능합니다.
int num1 = 10;
int num2 = 100;
double result1 = num1/num2;
double result2 = (double)num1/num2;
System.out.println(result1);
System.out.println(result2);
해당 코드를 입력하고 실행 결과를 보면
result1의 값은 0.0이 나오고 result2의 값은 0.1이 나오게 됩니다.
인간의 연산으로는 result1의 값도 당연히 0.1이 나와야 하지만 int형끼리의 연산은 정수만 반환하기 때문에 int형 num1과 num2를 연산하고 그 값이 double에 대입되었을 때는 double에 대입이 되어 표현은 실수형으로 보이지만 안에 들어 있는 실제 값은 0이 나오게 됩니다.
반면 result2의 값은 0.1로 정상 출력 됩니다.
int형의 num1, num2를 double형으로 강제로 변환 시켜주고 계산을 하게 되니 값 역시 double형으로 나오게 되었습니다.
이해 가시나요?
//(연습문제2)다음 코드 중 정상 작동하지 않는 부분을 찾아 수정하시오.
int num1 = 100;
int num2 = 55;
double num3 = 100;
double num4 = 55;
int result1 = num1/num2;
int result2 = num4/num1;
double result3 = num3/num4;
double result4 = num2/num3;
//정답은 해당글 맨아래에 작성해두겠습니다.
정수형과 실수형 이외에도 boolean 타입 이외의 모든 타입은 형 변환이 가능합니다.
char 타입의 'a'를 int형으로 형 변환한다고 했을 때 자바는 a의 ascii code를 찾아 숫자로 변환시켜 줍니다.
// 1. int to char
int i = 65;
char c = (char)i;
System.out.println(c);
// 2. char to int char
c2 = 'B';
int i2 = (int)c2;
System.out.println(i2);
char c3 = '1';
char c4 = '9';
int i3 = c3 + c4;
System.out.println(i3);
// 3. String to int
String str = "33";
System.out.println(str + 1);
int i4 = Integer.parseInt(str);
System.out.println(i4 + 1);
1번은 int형을 char형으로 변환시켜 주었습니다. 숫자인 65가 문자인 char로 어떻게 변환이 되는지 의아하시죠?
https://ko.wikipedia.org/wiki/ASCII
ASCII - 위키백과, 우리 모두의 백과사전
1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문 알파벳을 사용하는 대표적인 문자
ko.wikipedia.org
위 사이트에 ASCII 코드를 정리되어 있습니다. 10진수 65를 찾아 문자 형태를 보면 A일겁니다. 따라서 c를 출력하면 A가 출력이 됩니다.
char형을 int형으로 변환 시키는 것도 마찬가지입니다.
문자 'B'를 아스키코드에서 찾아 십진수로 변환시켜주는 것이죠.
위 코드에서 i2를 출력시키면 66이 출력이 되겠네요.
자 그리고 바로 아래에서 c3과 c4의 연산이 있습니다.
c3에 있는 '1'과 c4에 있는'9'는 숫자처럼 보이지만 컴퓨터에서는 문자로 인식하고 있습니다.
마찬가지로 c3과 c4를 더하게 되면 10이 출력이 되는 것이 아니라 문자인 '1'과 '9'를 아스키코드의 십진수로 변환시켜 계산합니다.
자 그럼 String형은 어떨까요?
문자열로 저장된 "33"값이 str 변수에 들어있습니다.
str에 1을 더하면 문자열 33에 1을 더하게 되기 때문에 묵시적 형 변환 되어 331이라는 문자가 출력이 됩니다.
str을 int형으로 바꾸어 계산하면 34의 값이 출력되게 됩니다.
//(연습문제1) 다음 중 정상적으로 작동하는 경우와 에러가 발생하는 경우는?
byte num1 = 100; //정상
byte num2 = 150; //Type mismatch에러 발생
int num3 = 200; //정상
int num4 = 976431547879314856; //Out of range에러 발생
long num5 = 976431547879314856; //Out of range에러 발생
float num6 = 3.14; //Type mismatch에러 발생
double num7 = 142; //정상
double num8 = 31.23; //정상
int num9 = 1.1; //Type mismatch에러 발생
//(연습문제2)다음 코드 중 정상 작동하지 않는 부분을 찾아 수정하시오.
int num1 = 100;
int num2 = 55;
double num3 = 100;
double num4 = 55;
int result1 = num1/num2; //정상
int result2 = num4/num1; //값을 (int)로 형변환 해야 작동하지만 소수점은 출력되지 않음
double result3 = num3/num4; //정상
double result4 = num2/num3; //작동은 하지만 소수점이 출력되지않음 (double)로 형변환
'Java 관련 > Java' 카테고리의 다른 글
[Java] 제어문 - 조건문(if 문) (0) | 2021.10.08 |
---|---|
[Java] 자바 연산자(Operator) (0) | 2021.10.07 |
[Java] 자바에서 여러가지 타입(Type) (0) | 2021.10.05 |
[Java] 변수 표기법, 출력문, 주석 (0) | 2021.10.04 |
[Java]Hello, World!(자바 및 이클립스 설치) (0) | 2021.10.03 |