개발자 도전기
[국비지원] 13일차 - 타입 변환 본문
타입 변환
하나의 타입을 다른 타입으로 바꾸는 것을 말한다.
같은 정수 형태라도 데이터 타입의 크기는 다 다르므로 데이터를 옮기는 과정에서 원치않는 데이터 손실이 생길 수 있다.
이 때문에 데이터 타입의 크기가 작은 것에서 큰 것으로 옮기는 것은 자동 형변환이 일어나지만,
그 반대는 데이터의 손실이 생길 수 있기 때문에 에러 메세지가 뜨고 필요한 경우 사용자가 직접 형변환을 해주어야 한다.
자동 형변환 (promotion)
개발자가 지정하지 않아도 자동으로 일어나는 형변환이기 때문에 묵시적 형변환이라고도 불린다.
char charValue = '가';
intValue = charValue;
System.out.println("가의 유니코드 :"+intValue); //44032
2byte인 char 타입을 4byte인 int 타입에 담았다.
아래 그림과 같이 크기가 작은 데이터 타입에서 큰 타입으로 자동 형변환이 일어난다.
서로 다른 타입의 데이터를 연산할 경우에도 마찬가지로 데이터 크기가 큰 쪽으로 자동 형변환이 일어난다.
byte v3 = 10;
int v4 = 100;
long v5 = 1000L;
long result3 = v3 + v4 + v5;
System.out.println("result3 :" + result3);
다음과 같은 예외 상황은 있다
- long 타입은 8 byte이고 float는 4 byte이지만 long타입보다 float 타입이 더 큰 데이터이다.
-지수부와 가수부를 나누는 부동소수점 방식으로 인해 실수가 표현할 수 있는 범위가 정수보다 많다. - byte 타입은 char에 담을 수 없다
-char는 정수이긴 하지만 문자인 유니코드와 아스키코드를 표현하는 데 목적이 있기 때문에 음수를 표현하지 않아 음수가 포함된 byte의 정보를 담을 수 없다.
강제 형변환(Casting)
강제 형변환은 명시적 형변환으로도 불리며 사용자가 타입 캐스트 연산자를 사용해 강제적으로 변환을 수행하는 것을 말한다. 값이 큰 데이터 타입을 값이 작은 데이터 타입에 강제적으로 담는 것이기 때문에 데이터 손실이 발생할 수 있다.
예를 들어 실수 타입을 정수 타입으로 강제 변환하면 소수점 이하의 데이터들은 버려진다.
연산식 자동 형변환
서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.
정수 연산의 경우 java는 피연산자를 4byte 단위로 저장하기 때문에 int 타입을 기본으로 한다.
int d = 10;
int e = 3;
int f = d / e; // 원하는 값 : 3.3333...
System.out.println("f :" + f); //3
정수 타입의 연산은 int 타입으로 나오기 때문에 나눗셈과 같이 실수 타입의 결과를 기대하는 경우에도 정수 타입으로 변환된다. 이미 정수 타입으로 연산을 마쳤기 때문에 (double) f와 같이 강제 형변환을 하여도 똑같이 3이 담기게 된다.
실수 타입의 결과값을 원한다면 연산시 형변환을 해주거나 정수 중 하나를 실수 타입으로 바꾸어서 연산하면 된다.
double h = (double) d / e;
System.out.println("h : " + h);
double i = d / (double) e;
System.out.println("i :" + i);
double j = (d + 0.0) / e;
System.out.println("j :" + j);
참조타입의 형변환과 연
기본 타입과 참조타입의 형변환은 불가능하지만 메소드를 이용하면 가능하다
// 1. 기본타입 <-> String 간의 변환은 메소드로 가능
String a = "123";
byte b = Byte.parseByte(a);
short c = Short.parseShort(a);
int e = Integer.parseInt((a));
long f = Long.parseLong(a);
float g = Float.parseFloat(a);
double h = Double.parseDouble(a);
// 2. 기본타입 -> String 변환
int k = 356;
double l = 3.14;
String m = String.valueOf(k);
String n = String.valueOf(l);
String 과 다른 타입의 더하기(+) 연산 결과는 String 이다
String o = k + ""; // String과 다른 타입간 더하기(+) 연산의 결과는 String
String p = l + "";
'개발공부 > TIL' 카테고리의 다른 글
[국비지원] 15일차 - 가위바위보 게임, 프로그래머스 (2) | 2024.02.24 |
---|---|
[국비지원] 14일차 - 연산자, 프로그래머스 (0) | 2024.02.22 |
[국비지원] 12일차 - Primitive Type (0) | 2024.02.20 |
[국비지원] 11일차 - JDK, JRE, JVM (0) | 2024.02.20 |
[국비지원] 10일차 - isNaN (2) | 2024.02.16 |