2017. 2. 28. 13:50ㆍ[유튜브 강의]- 센치한 개발자/[JAVA] 자바 기초 강의 - 완료
[센치한 개발자-유튜브 강의] (4) JAVA 초급 - 형 변환 : 1. 기본 타입끼리 형변환 :: 기초 강의
▶︎ 센치한 개발자 강의 구독하기 :
[자료 목차] 1> 형 변환 (1) 기본 타입끼리의 형 변환 1. 자동 변환 (묵시적 ) - promotion 2.강제 변환 (명시적) - casting (2) 클래스끼리의 형 변환 1. 다운 캐스팅 - down casting 2. 업 캐스팅 - up casting |
(1) 기본 타입끼리의 형 변환
자바의 형변환에 대해서는 크게 2가지로 생각해 볼 수 있습니다.
기본타입끼리의 형변환과 참조타입 측면에서의 형변환 입니다.
기본타입끼리의 형변환은 위의 맨 위의 그림처럼 작은 것을 큰 것에 담느냐, 큰 것을 작은 것에 구겨서 넣느냐로 구분합니다.
그래서,
[1]번 과정 !
상식적으로 작은 것이 큰 것에 들어가면 여유롭게 들어가니까 버려지는 게 없겠지만, - 프로모션
[2]번 과정!
큰 것을 작은 것에 넣으려면 소탐대실이랄까요, 포기해야 하는 것들이 생깁니다. - 캐스팅
[1]번을 자동변환인 프로모션(promotion), [2]번을 강제 변환인 캐스팅(casting)이라고 합니다.
그리하여,
[1]번 과정 ( 작은 것을 큰 것에 넣기 ) 은 컴파일 과정에서 문제가 되지 않고 잘 넘어갑니다~
"큰 변수 = 작은변수"
이렇게 바로 대입이 가능하죠.
*. 코딩 방법
int small = 10; long big = small;
과 같이 말이죠
+초급이 싫어
그런데!!
[2]번 과정에서 처럼 큰 것을 작은 것에 넣을때 그냥 알아서 넣어지겠지 하고 넣으면 드디어 문제가 발생합니다.
자바바군 : "큰 걸 지금 작은 것에 넣으라고?? 진심이냐!? 넣을 거냐?" 센치한 개발자 : 그래 넣어 이 자식아. 자바바군 : 끄응스.. 그래서 니가 시키는 대로 하겠지만 그래도 에러 안나게 "명시적"으로 하나 말이나 해줘라. 센치한 개발자 : 감히 나에게 수동으로! 명시적으로! 딱! '캐스팅'을 하라고 말하는 것이냐!? 자바바군 : 그렇다. 나는 너의 노예가 아니니까. 센치한 개발자 : 뚜와이씨..콘센트 뽑아벌라... 음.. 그래 괄호 '()'를 통해서 캐스팅을 '명시'해주마. 자바바군 : 좋아. 그런데 한가지 더. 센치한 개발자 : 끄응스.. 뭔디!? 자바바군 : 큰 것을 작은 것에 구겨서 넣으려니 다 들어가지가 않는다... 값의 뒷부분이 잘려도 상관없겠느냐? 센치한 개발자 : 망ㅎ.... 그래 뭐 어쩔 수 없지. 못들어가서 버려지는 거 감수하마. 콜. 자바바군 : 대입했다. 센치한 개발자 : 수고했..........아아악! 그렇게 값이 달라져야...속이.. 후련했냐! |
2번 과정을 두고 컴퓨터인 자바바군과 제가 나눈 대화 입니다. ( 덕후 같네요... ;; )
자바바군이 말한 것처럼 큰 것을 작은 것에 넣을때는 1가지를 명시하고, 1가지를 이해하고 계셔야 합니다.
바로, '캐스팅'을 한다고 하는 것이며 이것이 곧, 구겨져서 넣는 바람에 못들어가는 녀석들은 '버려도 무관하다'고 인지하는 것입니다.
그런데 이 버려지는 것이 정수값은 동일하고 소수점이 날아가는 정도의 손실과 완전히 충격적(?)인 결과를 초래하는 손실로 나눌 수 있습니다.
이 캐스팅의 "값 손실" 현상에 있어서 이번에는 "초급이 싫어"를 꼭 한 번 읽어보세요. 어떤 결과를 초래하는지요~
+초급이 싫어
'캐스팅' 과정은 다음과 같이,
"작은변수 = (작은변수) 큰 변수"
의 형태로 대입이 가능합니다.
*. 코딩 방법
long big2 = 10; int small2 = (int)big2; double d = 10.0; float f = (float)d;
그런데 여기서! 한 번 더, 돌발상황을 포함해 예시를 더 보고 넘어갈까요.
Q1. short하고 char는 왜!?!?!
short s = 1; char b = (char) s; short ss = -1; byte bb = (char) ss;
값들의 크고 작음을 각 자료형의 byte(bit)단위로만 비교하면 초보분들이 이해하시기에 이상한 현상이 벌어집니다.
같은 byte 크기끼리니까 같은 메모리 크기라서 문제 없을 것이라고 생각했으나,
실은 그 자료형의 "소수점 포함 여부"도 중요합니다.
소수점이 있는지 없는지 (실수인지 정수인지),
그리고 하나 더 "음수가 있는지 없는지"를요~
여기서 첫번째 시간의 기본타입 학습을 떠올려야 합니다.
예를 들어보겠습니다.
같은 2byte인 short 와 char 는 어느 녀석이 더 큰 것일까요? 달리 말하면 결국 어느 것이 '범위'가 더 클까요?
물론 값의 범위는 둘다 65556개이니까 똑같은 거 아님꽈!? 라고 하신다면...
사실 범위는 65535개로 같습니다만,
char는 0부터 65535까지의 음수가 없는 자료형이고, short는 -32,768 ~ 32,767 까지 음수부터 양수까지 표현이 가능한 자료형 입니다.
따라서,
short에는 음수가 있는데 이것을 음수가 없는 char로 값을 넣으라고 (대입하라고) 하면 '캐스팅'을 강요당합니다.
Q2. 그럼 설마 long 과 float의 관계도!?!
float f = 1.1f; long l = (long)f;
Q1에서 이해가 되셨다면 long과 float도 마찬가지라는 것을 눈치 채실 수 있습니다.
분명히 long이 8byte(64bit)로 장난아니게 값의 범위가 크니까 값의 범위가 더 작은 float을 그 큰 long에 넣으려고 할때에 상관없어보이지만.....
long은 실수(소숫점이 있는 숫자)를 담을 수 없는 덩치만 큰 속빈 강정(?)이기때문에, 실수를 정수에 넣을때는 소숫점을 포기하는 '캐스팅'을 해야 합니다.
위의 "손실"에 관련한 "초급이 싫어"를 읽어 보셨다면 당연한 이야기임을 아시겠죠?
+ 초급이 싫어
이정도로 기본타입끼리의 형 변환에 대한 학습이 끝나면 좋겠지만,
사칙연산을 하게될때 각각 형 변환이 어떻게 일어나는지 알아봐야 합니다.
*. 가령 int형을 float형으로 형 변환을 하고나서 다시 int형으로 바꾼뒤, 다른 int형 변수와 사칙연산을 할 때와 같은 현상도 꼭 짚고 넘어가야 합니다.
사칙연산시에 일어나는 형 변환은 "연산" 부분 챕터에서 설명드리면서 본 "형 변환"을 복습하실 수 있게 하겠습니다.
그리하여~~~
많은 내용을 읽고 공부하시느라 고생 많으셨습니다.
기본 타입끼리의 형 변환의 경우 설명드릴 부분이 많았습니다.
사실 실무에서 사용하다 보면, 형변환을 하게되는 유형들이 거의 한정되어 있습니다.
값 손실에 대한 위험이 있기때문에 일부러 손실을 초래하는 종류의 무분별한(?) 캐스팅은 되도록이면 자제하는 편입니다.
(물론 돈과 관련된 업무인 경우 위에서 잠시 언급한 BigDecimal, BigInteger로 사칙연산을 하는 등으로 실수값의 유실을 해결할 수 있습니다)
(2) 클래스 끼리의 형 변환 - 다음시간에~~
다음은 클래스 끼리의 형 변환입니다만.. 이번 시간으로 질려버렸을 분들을 위해 다음시간으로 넘기겠습니다.
( 센개, 네가 지친건 아니고? 퍽.. )
*. 몇 챕터뒤에 클래스와 상속의 관계에 대해서 배우고 나면, 다시 다음 챕터로 돌아와서 클래스끼리의 형변환에 대해 학습하시길 바랍니다.
클래스끼리의 형을 변환한다는 것은 참조타입을 어느 쪽 정보를 바라보게 할 것이냐는 말과 같습니다.
부모 "클래스A"를 상속받은 자식인 "클래스AA"를 클래스A로 바꾸거나, 클래스A로 바꾼 녀석을 다시 자기 자신인 클래스AA로 바꾸는 과정이
클래스끼리의 형 변환이라고 할 수 있습니다.
다음 시간까지
class 나 extends 아버지 {
}
이 구조만 우선 기억해두세요~
'[유튜브 강의]- 센치한 개발자 > [JAVA] 자바 기초 강의 - 완료' 카테고리의 다른 글
[유튜브 강의] (6) JAVA 초급 강좌 - 연산자, 연산식 (0) | 2017.03.01 |
---|---|
[유튜브 강의] (5) JAVA 초급 강좌 - 형 변환 : 2. 클래스끼리의 형변환 (0) | 2017.03.01 |
[유튜브 강의] (3) JAVA 초급 강좌 - 데이터 타입 (Data Type) - 2. 참조타입 (2) | 2017.02.26 |
[유튜브 강의] (2) JAVA 초급 강좌 - 데이터 타입 (Data Type) - 1. 기본타입 (3) | 2017.02.26 |
[유튜브 강의] (1) JAVA 초급 강좌 - 자바의 변수, 상수, 리터럴 (4) | 2017.02.23 |