[유튜브 강의] (4) JAVA 초급 강좌 - 형 변환 : 1. 기본 타입끼리 형변환

2017. 2. 28. 13:50[유튜브 강의]- 센치한 개발자/[JAVA] 자바 기초 강의 - 완료

728x90

[센치한 개발자-유튜브 강의] (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 아버지 {

}


이 구조만 우선 기억해두세요~








728x90