형변환
- 값의 자료형을 바꾸는 것 (boolean제외)
- 값 처리 원칙
- 연산자 기준으로 왼쪽, 오른쪽 자료형이 동일해야 함
- 표현법 : 자료형 변수명 = (바꿀 자료형)값; - 같은 자료형끼리만 연산 가능
- 표현법 : 값 + (바꿀 자료형) 값;
- 연산자 기준으로 왼쪽, 오른쪽 자료형이 동일해야 함
자동 형변환 (autocasting)
- 컴파일러가 자동으로 값의 범위가 작은 자료형을 큰 자료형으로 변환
- 자동으로 형변환이 진행되기 때문에 내가 직접 형변환할 필요가 없다
예시
- 1. int(4byte) -> double(8byte)
int i1 = 10;
double d1 =i1;
// int는 정수 double은 실수이므로 d1은 10 -> 10.0으로 형변환이 된다
- 2. int(4byte) -> long(8byte)
int i3 = 1000;
long l3 = i3;
long l4 = 2000; // L을 붙이지 않아도 문제가 없는이유 : 자동형변환이 이루어져서
- 특이케이스 : 3. long (8byte) -> float(4byte)
- 정수가 실수로 담길때에는 큰 사이즈의 정수여도 작은 사이즈의 실수 변수에 대입 가능
- float는 long자료형보다 담을수 있는 값의 범위가 더 크기 때문 (자동형변환 가능)
long l5 = 1000000L;
float f5 = l5;
- 특이케이스 : 4. char(2btye) -> int (4byte)
- char의 범위 (0~65xxx) : 각 문자마다 고유의 정수값이 정해져있음. 따라서 양방향으로 변환이 가능하다. 단, 음수값은 오류가남.
- 아스키코드표(0 ~ 127, 영문자 대소문자, 숫자, 특수문자)
- 유니코드표(0 ~ 65xxx, 영어, 숫자, 특수문자, 한글, 한자 그 외 언어)
char ch = 65; // A
int num = 'A'; //65
int sum = 'A' + 10;
System.out.println((int)'김'); //44608
System.out.println("sum : "+sum); // 75 문자와 정수사이에 연산이 가능하다.
System.out.println("sum : "+(char)sum); // K 알파벳 별로 순서대로 고유값이 들어가있음
강제 형변환 (forcecasting)
- 값의 범위가 큰 자료형을 작은 자료형으로 변환
- 데이터 손실이 발생할 수 있음
- 캐스팅 기호를 사용
예시
- 1. double(8byte) -> float (4byte)
float f1 = 4.0f; // 반드시 f를 붙여줘야함. (double 자료형으로 인식하므로)
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 : "+i3);// 10 소숫점 아래는 절삭
- 3.int (4byte) → char (2byte)
int num = 65;
char ch = (char) num;
System.out.println(ch); // 'A'가 출력
연산식에서 자동 타입 변환
- 자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 리터럴 연산 수행
- byte나 short로 연산시 반드시 무조건 int자료형으로 형변환이 자동으로 이루어짐
- 피연산자중 하나라도 long타입이 있으면 연산 결과는 long타입이 나옴
- 컴파일 단계에서 미리 연산해서 30을 만들고 변수에 30을 저장하고록 바이트코드 생성 → 실행시 덧셈 연산이 없으므로 실행 성능이 좋아짐
byte result = 10 + 20 // 컴파일 : byte result = 30
- 하지만 정수 리터럴이 아니라 변수가 피연산자로 사용되면 실행 할 때 연산 수행
byte x = 10;
byte x = 20;
int result = x+y; //byte로 하면 컴파일 에러
- double자료형과 int 자료형의 연산
int iNum = 10;
double dNum = 5.89;
// int iSum = iNum + dNum; // iNum이 double자료형으로 자동형변환됨. 10 -> 10.0
// 결과값으로 15.89 덧셈연산은 잘 수행된다.
// 다만, 연산결과가 15.89라는 실수값이기 때문에 대입하는 변수의 자료형도
// 실수자료형이어야 에러가나지 않음.
// 해결방법 1. 연산결과를 int자료형으로 강제 형변환시킴
int iSum = (int)(iNum + dNum); // 15 . 실행순서 : 변수생성, 덧셈연산, 강제형변환, 대입연산
System.out.println("iSum : "+iSum);
// 해결방법 2. 덧셈연산전에 dNum변수를 int자료형으로 강제형변환
// 자동형변환은 작은 바이트 변수가 큰 바이트 변수로 변환되기 때문에 원래는 iNum이 double로
// 변환되는데 그 전에 먼저 dNum 강제 형변환 시킨것
int iSum2 = iNum + (int)dNum; // 15
System.out.println("iSum2 : "+iSum2);
// 해결방법 3. 애초에 결과값을 double로 저장하기(데이터 손실 없이 정확한 값이 전달된다)
double dSum = iNum + dNum; // 15.89
System.out.println("dSum : "+dSum);
'JAVA > 1. 자바 언어 기초' 카테고리의 다른 글
[JAVA] 출력메소드 (0) | 2023.11.16 |
---|---|
[JAVA] 문자열과 기본 타입간의 형변환 (0) | 2023.11.16 |
[JAVA] 자료형, 리터럴 (0) | 2023.11.16 |
[JAVA] 변수, 상수 (0) | 2023.11.16 |
[JAVA] 단축키 (0) | 2023.11.16 |