JAVA 데이터 타입 간의 형 변환 (타입 변환)
▶▶ 자바 데이터 타입 간의 형 변환 (타입 변환)
– 어떤 데이터타입이 다른 데이터타입으로 변환되는 것.
– 기본 데이터타입 중 boolean타입을 제외한 나머지 타입간의 변환.
1. 자동 형변환
2. 강제 형변환
▶ 자바 데이터타입 크기 관계
byte < short < int < long < float < double
( char )
→ 왜 long(8byte)보다 float(4byte)가 더 클까?
예를 들어, 0~1사이의 정수값은 없으나 0.0~1.0사이의 실수값은 아주 많으므로
long(정수 타입)보다 float(실수 타입)이 더 큰 값으로 취급됨.
▶ 자동 형변환 ( = 묵시적 형변환)
– 작은 데이터타입의 데이터를 큰 데이터타입으로 변환하는 것.
– 아무런 문제가 생기지 않으므로 개발자가 신경쓸 필요 없이 자바 컴파일에 의해 자동으로 형변환이 일어남.
– 정수 타입보다 실수 타입이 무조건 큰 타입으로 취급되기 때문에,
메모리 크기가 long이 float보다 더 크더라도 float타입이 큼.
ex ) byte → int, int → long, long → float 등
EX ) short → int
int a1 = 2000; // 큰 데이터타입 int = 4byte
short a2 = 1000; // 작은 데이터타입 short = 2byte
→ int타입의 변수 a1에 '2000'의 값을 저장하고, short타입의 변수 a2에 '1000'의 값을 저장함.
→ int타입이 short타입보다 큰 데이터타입.
a1 = a2; // 작은 데이터타입 short → 큰 데이터타입 int
→ 작은 데이터타입(short) 데이터를 큰 데이터타입(int)으로 이동.
→ 컴파일러에 의해 자동으로 형변환이 일어나고, 변환 후에도 원본 데이터에는 아무런 영향이 없음.
→ int a1= short a2 원래는 타입에러 ( 4byte > 2byte)
그런데 오른쪽에껄 왼쪽에 넣는데 오른쪽공간이 더 커서 자바가 알아서 short를 int로 바꿔줌.
✓ 변수에는 하나의 값만 들어감으로 a1에 원래 있던 2000은 사라지고 1000이 출력됨.
2. 강제 형변환 ( = 명시적 형변환)
ex ) 500ml용기에 강제로 1L를 넣는 것
– 큰 데이터타입의 데이터를 작은 데이터타입으로 변환하는 것.
– 작은 데이터타입 허용치보다 커서 Overflow(넘침)가 발생할 수 있기에 자바가 자동으로 형변환을 수행해주지 않음.
– 반드시 우변의 데이터 앞에 형변환 연산자를 사용하여 강제 형변환을 수행해야하며, 아래의 형식으로 지정함.
(좌변의 작은 데이터타입명) 우변의데이터
– 강제 형변환으로 인해 오류가 없어지더라도, 형변환 후의 데이터는 원본 데이터와 다를 수 있으나(= overflow)
작은 데이터타입 허용치 이내의 데이터일 경우, 강제 형변환 후에도 원본 데이터가 유지 될 수 있음.
EX ) int → short
int b1 = 9999999; // 큰 데이터타입
short b2 = 32767; // 작은 데이터타입
→ b1이 int형 큰 데이터타입, b2가 short형 작은 데이터타입.
b2 = b1; // 오류 발생!
→ 'Type mismatch: cannot convert from int to short' 오류 발생! int타입을 short타입으로 변경할 수 없음!
큰 데이터타입을 작은 데이터타입으로 이동할 때는 넘침(Overflow)의 위험성 때문에 자동으로 변환해주지 않음.
→ 개발자가 강제로 형변환 연산자를 사용하여 명시적 형변환(강제)을 수행해야 함.
우변의 데이터 앞에 ()를 쓰고, 좌변의 작은 데이터타입을 명시해야 함.
b2 = (short)b1;
→ 큰 데이터타입인 b1 앞에 (short)타입을 명시함으로써 강제 형변환을 수행함.
→ 강제 형변환 후에는 Overflow에 의해 원본 데이터와 실제 변환되어 저장된 데이터가 다를 수 있음.
✓ b1 → b2 강제 형변환에는 성공했으나, 변환 후의 b2값이 뭔가 이상함.
이는 '9999999'라는 값은 short타입의 범위에서 벗어나므로 Overflow에 의해 원본 데이터가 달라진 것.
일단 이 부분에서는 여기까지만 이해하면 됨.
▸ 정수 타입 ↔ 실수 타입 변환
EX1 ) 정수 타입 → 실수 타입 (자동 형변환)
→ 변환전 d2의 값이 3.14가 아닌 3.140000으로 나오는 이유는 실수 표현법 때문이며,
3.140000 → 3.140000001도 3.14이기 때문에 실수 표현은 근사치값으로 나타남.
✓ d2 = d1은 double타입이 int타입보다 크므로 컴파일러에 의해 자동으로 변환됨.
EX2 ) 실수 타입 → 정수 타입 (강제 형변환)
→ 평범하게 e1 = e2를 하면 큰 데이타타입인 double이 작은 데이터타입인 int로 변환 할 수 없기에 오류 발생함.
→ double타입인 e2 앞에 (int)를 붙여줌으로써 강제 형변환을 하고 출력함.
✓ e2의 원래 값은 3.14였으나 강제 형변환을 통해 int타입으로 만든 결과, 정수 3이 출력됨.
▸ char타입과 byte&short 타입간의 관계
• byte타입 (1Byte = 8bit) : -128 ~ +127
• short타입(2Byte = 16bit) : -32768 ~ +32767
• char타입 (2Byte = 16bit) : 0 ~ 65535
– char타입은 문자 표현을 위해 양수로만 표현하므로 byte타입과 short타입에 비해 양수 표현 범위가 큼.
– byte타입과 short타입은 음수까지 표현이 가능하므로 char타입에 비해서 음수 표현 범위가 큼.
→ 따라서 char타입과 byte 또는 short타입 양방향간에는 자동 형변환이 일어나지 않고 반드시 강제 형변환 필수!
EX )
byte b = 100;
short s = 65;
char ch;
→ byte타입인 변수 b와 short타입인 변수 s를 만들고 char타입인 변수 ch는 초기화하지 않고 선언만 해둠.
1 ) byte타입 → char타입으로 변환
ch = b; // 오답 X byte ↔ char 강제 형변환 필수
ch = (char)b; // 정답 O char타입으로 강제 형변환
2 ) char타입 → byte타입으로 변환
b = ch; // 오답 byte ↔ char 강제 형변환 필수
b = (byte)ch; // 정답 O byte타입으로 강제 형변환
3 ) short타입 → char타입으로 변환
ch = s; // 오답 X short ↔ char 강제 형변환 필수
ch = (char)s; // 정답 O char타입으로 강제 형변환
4 ) char타입 → short타입
s = ch; // 오답 X char ↔ short 강제 형변환 필수
s = (short)ch; // 정답O short타입으로 강제 형변환
comment

오늘의 목표 끄읏~~~~~~~~~~!!!!!
딱 데이터타입까지만 정리하고 자려고 했는데 생각보다 시간이 많이 걸렸다ㅠ
막상 공부했을 때는 바로바로 이해하고 쉽게 넘어갔었는데
풀어서 이론적으로 설명하려니 어렵다ㅠㅜㅜ흠ㅠ
아무쪼록 블로그를 방문한 모든 사람들과 미래의 나에게 도움이 되는 정보이길❤️