음 앞에서 데이터타입의 종류와 내용에 대해서 정리했다
형변환은 쪼금 복잡할 수도(?) 있어서 최대한 내가 다시 봐도 바로 이해할 수 있게 정리를 해야겠다!
내용에 오류가 있다면 알려주시는거 환영합니다 !
형변환이란 데이터의 타입을 변경하는 것이다.
데이터는 int 형으로 숫자 200을 저장했을 때 메모리상에 만들어지는 내용이다. 그럼 실수형인 float 타입으로 정수 200.0을 저장하면 어떻게 될까? 사람에게는 똑같은 수인 정수 200과 실수 200.0을 컴퓨터는 전혀 다른 방식으로 저장한다
-생활코딩
< 기본 데이터타입의 형변환(타입 변환)>
1. 묵시적(암시적) 형변환 = 자동 형변환
형변환 자체를 우유를 통에 옮긴다고 생각하면 쉽다. 묵시적 형변환은 작은 통에서 큰 통으로 우유를 옮기는 것.
작은 곳에서 큰 곳으로 옮길 때에는 이 통에 우유가 다 들어갈지 고민할 필요가 없다! 그냥 붓기만 하면 옮겨진다.
그것처럼 묵시적 형변환은 작은 데이터타입에서 큰 데이터타입으로 변환하는 것인데 우유를 붓듯 자동으로 형변환이 되어 자동 형변환이라고도 한다.
따로 문제가 발생할 우려가 없기 때문에 자바 컴파일러가 자동으로 형변환 시켜준당
변환 후 데이터는 원본 데이터를 그대로 유지함 .
byte - short - int - long - float - double
( char )
좌측에서 우측으로 묵시적 형변환이 가능해진다.
실수형은 메모리크기와 관계 없이 무조건 정수형 보다 큰 타입으로 취급된다. (int=float=4Byte)
주의! char 타입은 문자형으로 다른 타입들과 조금 다르다.
표현 범위 자체도 0 ~ 65535로 음수 범위가 포함되지 않는다. 그래서 byte 타입과 short 타입을 제대로 표현할 수 없으므로 byte, short <-> char 타입 간 상호 자동 형변환은 불가하다.
(자동 형변환이 안된다는 것이지 강제로 형변환은 가능)
큰 데이터 타입 변수 = 작은 데이터타입 변수(또는 리터럴);
=> 참고! 형변환 연산자를 사용해도 무관(생략가능=> 어차피 자동으로 변환되니)
2. 명시적 형변환 = 강제 형변환
앞의 묵시적 형변환과 달리 명시적 형변환은 큰 통에 있던 우유를 작은 통으로 옮긴다고 생각하면 이해하기 쉽다.
옮기는 통이 작아지기 때문에 우유가 넘칠수도 있다. 우유가 데이터라면 자바 컴파일러는 그 넘치는 우유에 대해 책임을 지지 않기 때문에 자동형변환을 시켜주지 않는다. 그리고 넘친 우유는 overflow(오버 플로우)라고 일컫는다.
그래서 개발자가 강제로 형변환을 시켜줘야한다. 형변환 후에 발생하는 변형된 다른 데이터가 저장될 위험에 대한 책임은 개발자가 진다.
형변환 후에도 오버플로우에 의해 기존 데이터가 아닌 변형된 다른 데이터가 저장될 위험 존재
double - float - long - int - short -byte
( char )
작은 데이터타입 변수 = (작은 데이터타입명) 큰 데이터타입 변수(또는 리터럴)
//1.묵시적 형변환
byte a1 = 10;
byte a2 = 128;
//변수 a1의 값을 a2에 전달
a2 = a1;
//2.명시적 형변환 == 강제형변환
byte b1 = 10;
short b2 = 128;
b1 = b2; <= 오류 발생!
b1 = (byte)b2
//short 타입을 byte타입으로 변환하는 건데 자동으로 변환할 수 없어서 강제로 변환해야한다
//그래서 앞에 형변환 연산자를 붙혀 명시적 형변환 수행
byte & short <-> char 타입 간 형변환에서 발생하는 문제
byte d1 = 65;
short d2 = 65;
char d3 = 65;
//byte 타입 변수 d1을 char 타입 변수 d3에 전달
d3 = (char) d1;
//short 타입 변수 d2의 값을 char 타입 변수 d3에 전달
d3 = (char) d2;
//char 타입 변수 d3의 값을 byte 타입 d1, short 타입 d2에 전달
d1 = (byte) d3;
d2 = (short) d3;
만약 int 타입 변수 e1에 float 타입 변수 e2 데이터가 전달된다면
(int= 정수형, float= 실수형)
=> 소수점 부분(실수) 데이터가 제거 되므로 오버플로우 발생 가능성이 존재한다.
그래서 float 에서 int는 자동형변환이 불가능하니 강제형변환을 실시해야 한다.
int e1 = 100;
float e2 = e1; // 이거는 int 타입이 float 타입에 전달되는 것으로 자동형변환이 가능하다
반대로
e1 = e2 는 불가능하고 형변환 연산자를 붙혀
e1 = (int)e2는 가능합니당
만약 e2에 3.14f 가 저장되어 있을 경우 변환하게 되면 3만 저장되므로 오버플로우로 0.14 사라짐
byte b3 = 67;
char c1 = (char)b3
System.out.println(c1); 하면 67에 해당하는 문자 C가 출력
long -> float 타입 변환하는 경우는
메모리 크기가 long 타입이 더 크지만 데이터 크기는 float이 더 크므로 자동형변환이 가능하다!
참고로 논리형 데이터타입인 boolean은 기본데이터타입과 상호 형변환이 불가능하다.
강제 형변환도 불가능!!!!
'develop > Java' 카테고리의 다른 글
for 문과 while문 - 중첩 (2) (0) | 2021.01.25 |
---|---|
for 문과 while문 - (1) (0) | 2021.01.23 |
switch 조건문 (0) | 2021.01.19 |
if 조건문 (0) | 2021.01.19 |
변수와 데이터타입 (0) | 2021.01.19 |