컴퓨터 내부에서의 값 처리 규칙
- 대입 연산자를 기준으로 왼쪽과 오른쪽은 같은 자료형이여야된다.
=> 즉, 같은 자료형에 해당하는 값만 대입이 가능함
( 다른 자료형의 값을 대입하고자 한다면 형변환이 필수)
자료형 변수명 = (자료형)값;
- 같은 자료형끼리만 연산이 가능 => 연산 결과 또한 같은 자료형으로 나옴
값 + (자료형)값형변환의 종류
- 자동형변환 : 자동으로 형변환이 진행되기 때문에 개발자가 직접 형변환을 시킬 필요없음
- 강제형변환 : 자동형변환이 안되서 우리가 직접 형변환을 해줘야됨
[주의사항]
boolean은 형변환이 불가함
자동형변환
자료형이 다른 두 값 간의 연산(대입, 계산)시 자동으로 값의 범위가 작은 자료형을 큰 자료형으로 변환하여 처리해준다.
강제형변환
큰 범위의 자료형을 작은 범위의 자료형으로 변환시키는 것
실수값을 정수형으로 강제형변환시 소수점 아래 부분은 버려짐 (* 데이터 손실이 발생할 수 있음)
package com.br.variable;
public class D_Cast {
public void autoCasting() {
// 1. int(4byte) => double(8byte)
int i1 = 12;
double d1 = /*(double)*/i1; // 12 => 12.0
System.out.println("d1 : " + d1);
int i2 = 12;
double d2 = 3.3;
double result = /*(double)*/i2 + d2; // 12 + 3.3 => 12.0 + 3.3 => 15.3
System.out.println("result : " + result);
// 2. int(4byte) => long(8byte)
int i3 = 1000;
long l3 = i3;
long l4 = 10000/*L*/;
// 3. float(4byte) => double(8byte)
float f5 = 1.0f;
double d5 = /*(double)*/f5;
// ===== 특이 케이스 =====
// 4. long(8byte) => float(4byte)
long l6 = 100000L;
float f6 = l6;
// float이 실수형이기 때문에 long형보다 표현 가능한 수의 범위가 더 크다.
// 5. char(2byte) <=> int(4byte)
int num = /*(int)*/'A';
System.out.println("num : "+ num);
char ch = /*(char)*/60;
System.out.println("ch : "+ ch);
// char에는 음수값 저장 불가능 => 값의 범위가 0 ~ 65535
// 6. byte 또는 short간의 연산
byte b1 = 1;
byte b2 = 10;
//byte b3 = b1 + b2; // 에러발생 => byte나 short는 연산시 무조건 int형으로 취급
// 연산 결과가 범위가 더 큰 int형임 => byte형에 대입 불가
byte b3 = (byte)(b1 + b2); // "강제형변환" 하면 저장 가능
}
public void forceCasting() {
// 강제형변환 : 큰 범위의 자료형을 작은 범위의 자료형으로 변환시키는 것
// double(8byte) => float(4byte)
double d1 = 4.0;
float f1 = (float)d1;
// double(8byte) = > int(4byte)
int iNum = 10;
double dNum = 5.89;
//int iSum = iNum + dNum; // 10 + 5.89 => 10.0 => 5.89 => 15.89 (double)
// 연산결과인 double형이 int형 변수에 대입 불가
// 해결방법 1. 연산결과를 int형으로 강제형변환 후 담기
int iSum1 = (int)(iNum + dNum); // (int)15.89 => 15
System.out.println("iSum1 : " + iSum1);
// 해결방법 2. double형 값 하나만 int형으로 강제형변환
int iSum2 = iNum + (int)dNum; //10 + 5 => 15
System.out.println("iSum2 : " + iSum2);
// 실수값을 정수형으로 강제형변환시 소수점 아래 부분은 버려짐 (* 데이터 손실이 발생할 수 있음)
// 해결방법 3. 연산결과를 아싸리 double형 변수에 대입
double dSum = iNum + dNum;
System.out.println("dSum : " + dSum);
}
}