▶ 형변환(casting) 이란?
값의 자료형을 바꾸는 개념
[표현법]
자료형 변수명 = (바꿀 자료형)값;
컴퓨터의 값 처리 규칙
1. 대입연산자(=) 기준으로 왼쪽과 오른쪽은 같은 자료형이여야함.
=> 즉, 같은자료형에 해당하는 값만 대입 가능
=> 다른 자료형의 값을 대입하고자한다면 "형변환"이 필수
[표현법]
자료형 변수명 = (바꿀 자료형)값;
2. 같은 자료형끼리만 연산 가능
=> 즉, 다른자료형끼리 연산을 수행하고 싶으면 한 구문은 "형변환"을 해야한다.
[표현법]
값 + (바꿀 자료형) 값;
▶ 형변환의 종류
[표현법]
(형변환연산자) 값;
1. 자동형변환(autocasting)
자동으로 형변환이 진행되기 때문에 내가 직접 형변환할 필요가 없다.
작은 바이트의 자료형 -> 큰 바이트의 자료형
1) int(4byte) -> double(8byte)
int i1 = 10;
double d1 = /* (double) */ i1;
System.out.println("d1 : "+d1); // 10.0
// 자동으로 형변환이 되었다.
// 컴퓨터 포장용상자(long)에 휴대폰(int)을 담은 꼴
// int는 정수 double은 실수이므로 d1은 10 -> 10.0으로 형변환이 된다.
2) int(4byte) -> long(8byte)
int i3 = 1000;
long l3 = /* (long) */ i3;
long l4 = 2000; // L을 붙이지 않아도 문제가 없는이유 : 자동형변환이 이루어져서
3) (특이케이스) long (8byte) -> float(4byte)
long l5 = 1000000L;
float f5 = l5;
System.out.println(f5); // 1000000.0
정수가 실수로 담길때에는 큰 사이즈의 정수여도 작은 사이즈의 실수 변수에 대입 가능하다.
float는 long자료형보다 담을수 있는 값의 범위가 더 크기 때문이다.(자동형변환 가능)
4) (특이케이스) char(2btye) <-> int (4byte) 양방향으로 자동 형변환
char ch = 65;
System.out.println(ch); // A
int num = 'A';
System.out.println(num); // 65
char의 범위 (0~65xxx) : 각 문자마다 고유의 정수값이 정해져있음. 따라서 양방향으로 변환이 가능하다. 단, 음수값은 오류가 난다.
참고 : 아스키코드표(0 ~ 127, 영문자 대소문자, 숫자, 특수문자)
유니코드표(0 ~ 65xxx, 영어, 숫자, 특수문자, 한글, 한자 그 외 언어)
5) (특이케이스) byte , short간의 연산
byte나 short로 연산시 반드시 무조건 int자료형으로 형변환이 자동으로 이루어진다.
6) (특이케이스) int(4byte) -> String
int num1 = 1;
String a = num1 + "";
String b = String.valueOf(num1); // a == b
2. 강제(명시적)형변환(forcecasting)
자동형변환이 되지 않아 내가 직접 강제로 형변환을 해야하는 경우
데이터 손실이 발생할 수 있음
큰 바이트 자료형 -> 작은 바이트의 자료형
1) double(8byte) -> float(4byte)
float f1 = 4.0f; // 반드시 f를 붙여줘야 함.
double d2 = 8.0;
float f2 = (float)d2;
2) double(8byte) -> int(4byte)
double d3 = 10.89;
int i3 = (int)d3; // 10.89 -> 10
System.out.println(i3); // 10 소숫점 아래는 절삭
▶ 활용 예시
위와 같은 코드는 에러가 발생하는데 이유는 다음과 같다.
1. iNum이 double 자료형으로 자동형변환됨. 10 -> 10.0
2. 결과값으로 15.89 덧셈연산은 잘 수행된다.
3. 다만, 연산결과가 15.89라는 실수값이기 때문에 대입하는 변수의 자료형도 실수자료형이여야 에러가 나지 않음.
이를 해결하기 위한 방법은 아래와 같다.
1. 연산결과를 int 자료형으로 강제 형변환시킴
int iSum = (int)(iNum + dNum);
System.out.println(iSum);
2. 덧셈연산 전에 dNum변수를 int 자료형으로 강제형변환
int iSum2 = iNum + (int)dNum; // 15
System.out.println(iSum);
자동형변환은 작은 바이트 변수가 큰 바이트 변수로 변환되기 때문에 원래는 iNum이 double로 변환되는데 그 전에 먼저 dNum을 강제 형변환 시킨 것.
3. 애초에 결과값을 double로 저장하기(데이터 손실 없이 정확한 값이 전달된다.)
double dSum = iNum + dNum; // 15.89
System.out.println(dSum);
'JAVA' 카테고리의 다른 글
JAVA(6) 출력문 (0) | 2023.03.23 |
---|---|
JAVA(5) Scanner (0) | 2023.03.22 |
JAVA(3) 자료형 (0) | 2023.03.22 |
JAVA(2) 변수와 상수 (0) | 2023.03.22 |
JAVA(1) (0) | 2023.03.21 |