본문 바로가기

프로그래밍/자바(JAVA)

[자바/JAVA] 자바 형변환(Casting) 덩치 큰놈이 장땡이다.

자바 형변환(Casting) 덩치 큰놈이 장땡이다.


오늘은 자바 형변환에 관해서 한번 이야기 해보려 합니다.

자바에서는 2가지의 형변환이 존재 합니다.


강제 형변환 - 강제로 형을 변환하는 것

자동 형변환 - 자동으로 형이 변환 되는것


제가 쓴거지만 참 어이 없는것 같습니다. 그럼 좀더 풀어서 쓰도록 하겠습니다. 여기서 자동이냐 강제냐의 주체는 JVM( Java Virtual Machine - 자바 짝퉁 로봇으로 자바 프로그램을 실행시켜주는 녀석쯤으로 생각하시면 됩니다. )이라는 녀석이 형변환을 해주느냐 마느냐의 차이 입니다.


이건 강의에서 변수의 자료형에 대해서 설명드렸습니다. ☞ http://jwandroid.tistory.com/324

그거에 보시면 자료형의 크기 라는 녀석이 나오게 되죠? 그부분을 참고 하시면 됩니다. 자바에서는 = (대입연산자) 라는 녀석은 " 오른쪽에 있는 값을 왼쪽에 넣어라 " 라는 뜻이 됩니다. 즉

int a = 10; 이라고 한다면 10이라는 값을 변수 a에 대입해라 는 뜻이 되지요.


그러면 형변환이 무엇이냐. 다음 두개의 변수가 있다고 가정하도록 하겠습니다.


int intA = 10;

char charB = 'B';


자료형이 int인(크기는 4바이트이고 정수를 저장하는) 변수 intA와 자료형이 char(크기는 2바이트이고 문자를 저장하는)변수 charB가 있습니다.


intA = charB    -->    1번

charB = intA    -->    2번


위와 같이 작성 했을때 어떤 녀석이 자동 형변환이고 어떤 녀석이 강제 형변환일까요?


1번 - intA = charB : 자동 형변환

위에서 말씀드린 것처럼 = (대입연산자) 이녀석은 우측의 값을 좌측에 대입하라는 뜻입니다.  그러니 자료형이 char인(크기가 2바이트) 변수를 자료형이 int인(크기가 4바이트) 변수에 대입하라는 뜻이되네요. 2바이트 크기인 놈을 4바이트 크기에다 넣으라고 하니 작은놈을 큰놈에다가 넣으라는 이야기가 되지요. 그러면 작은놈을 큰놈에다가 넣을때는 공간이 충분하니 잘들어 가겠죠? 아무런 문제가 없으니 JVM이라는 놈이 지가 알아서 형변환을 해주게 됩니다.


2번 - charB = intA : 강제 형변환

4바이트 크기인 intA를 2바이트 크기인 charB에다가 대입하라는 뜻입니다. 즉 큰놈을 작은놈에 넣을려고 하니 안들어 가겠죠? 강제로 넣어야 합니다. charB크기에 맞게 intA라는 놈을 짜르든 뿌시든 해서 2바이트 크기로 만들어야 하죠? 이 작업을 하게 되면 플밍에서는 "데이터 손실" 이라고 이야기를 합니다. 손실이 발생하니 JVM이라는 놈이 문제생길것을 예상하고 자동으로 해주지 않고 에러메세지를 개발자에게 뱉어냅니다. 그러면 개발자는 "내가 책임질테니 강제로 넣어도" 라고 해야 되겠죠?  


chatB = (char)intA;    요딴식으로 수정을 해야만 합니다. 


대부분 크기로 강제형변환이냐 자동형변환이냐를 판단할 수 있는데요. 예외적인 사항이 있습니다.

바로 정수와 실수에 대한 구분으로 나뉘어질때 입니다.

자료형은 정수형(byte, char, short, int, long)과 실수형(float, double) 두가지로 나뉘게 됩니다.

여기서 long는 크기가 8바이트 flaot는 크기가 4바이트 입니다. 당연히 8바이트인 long이 4바이트인 float보다 크기가 더 큽니다. 하지만 위에서 설명드린 설명과는 다르게 진행이 됩니다. 아래는 예제 입니다.


long longA;

float floatB;


longA = (long)floatB;         floatB = longA;

이렇게 써야 맞는 이야기가 되는데 실제로는 위의 코드로 사용하시면 에러가 발생하구요. 반대로 하셔야 됩니다. 왜그렇느냐?

바로 수체계 때문이죠. 기본적으로 실수 영역이 정수 영역보다 범위가 넓습니다. 그래서 이때는 크기상관없이 무조건 실수형이 정수형보다 크다 라는게 성립이 되죠. 그래서 아래와 같이 쓰셔야 합니다.


longA = (long)floatB;        floatB = longA;


대충 이해가 되셨나요? 

이외에도 형변환에는 위에서 설명드린 기본자료형 외에 클래스간의 형변환도 있답니다. 그녀석은 "상속"이라는 것을 하고 난뒤 다시 설명드리도록 하겠습니다.


지금까지 읽으신다고 수고많으셨습니다.


덧글 1]

글을쓰고나니 먼가 아쉬움이 남습니다. 그래서 추가적으로 변수에 대한 동영상 강좌가 있어 링크를 걸어 두도록 하겠습니다. 질문사항은 언제든지 댓글로 환영입니다.^^


자바 변수 동영상 강좌 ☞ http://jwandroid.tistory.com/317