저번 포스팅은 캐스팅에 관해 전반적으로 다루었다.


아래의 URL은 이전 포스팅 내용이다.


http://mommoo.tistory.com/40


이전 포스팅 내용을 요약하자면 아래와 같다.


자료형이 정해진 변수에 값을 넣을때는


변수가 원하는 정보를 하나도 빠짐 없이 다 넣어줘야 성립한다.



이전 포스팅은 기본형으로 캐스팅을 설명했다면,


이번 포스팅은 참조형으로 캐스팅을 설명하려 한다.


기본적으로 캐스팅은 서로 관련없는 데이터 끼리는 변환되지 않는다.


int a = (int) true;


boolean 자료형이랑 int 자료형이랑 은 서로 성질이 맞지 않는 데이터 이므로,


형변환이 안되는 것 이다.


참조형(자바에서는 클래스) 데이터 역시 마찬가지다. 


그렇다면 참조형 데이터가 서로 관련이 있다고 하는 것은 무얼 의미 하는 것일까?


아래와 같은 상황일 것이다.


1. 상속관계가 맺어진 경우.


2. 인터페이스로 인해 확장이 된 경우.



1번 경우인 상속관계를 통해 예시로 설명 하겠다.


class Parent , class Child extends Parent 클래스 가 있다고 가정하자.


Child 는 Parent 클래스를 상속 받으므로 Chiid 클래스가 Parent 클래스 보다 가지고 있는


데이터 양이 무조건 많다. 왜냐하면 Child 클래스는 적어도 Parent 클래스의 데이터를 가지고 있기 때문이다.



때문에 많은 이들이 두 클래스의 구식도를 표현 할때 는 위와 같이 많이 한다.


사람마다 틀리겠지만, 후에 업캐스팅 다운캐스팅 개념을 위해 위와 같이 알아 놓아야 한다.


클래스 데이터 즉, 참조형을 사용할때는 아래와 같이 쓴다.


Parent parent = new Parent();


Parent 데이터형인 parent 변수는 실제 데이터인 new Parent(); 란 인스턴스가 Parent 정보를 모두 가지고 있으므로


오류가 나지 않는다.


아래의 경우는 어떨까?


Parent parent = new Child();


윗 개념으로 생각해보자.


parent변수는 Parent 자료형 데이터 모두를 원한다.


new Child(); 라는 인스턴스는 Parent 자료형 데이터를 모두를 가지고 있을까?


대답은 Yes 이다. 왜냐하면 Child 클래스는 Parent 클래스를 상속 받았기 때문이다.


따라서 성립한다. 엄연히 말하자면 데이터형은 틀리므로 아래와 같이 형변환 기호를 붙여야 한다.


Parent parent = (Parent) new Child();


하지만 위에서 말했다 시피, 변수가 원하는 정보를 인스턴스가 모두 가지고 있으므로,


컴파일러가 형변환 기호를 붙이지 않더라도 다형성 측면에서 넘어가는 것이다.


위와 같은 캐스팅을 '업캐스팅' 이라 부른다.


왜냐하면 Parent 데이터형 에 Child형 데이터를 넣어 생기는 아래와 같은 구식도 때문이다.


Parent 에 Child데이터를 넣으므로 화살표 방향이 위로 향하게 된다.


이런식으로 구조를 이해한다면 업캐스팅인 경우를 외우지 않아도 가능 할 것이다.


준비한 내용은 여기까지다.



다음 포스팅은 다음 캐스팅에 다룰 것이다.



http://mommoo.tistory.com/51 - 다운캐스팅







포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘은 캐스팅의 관해서 포스팅 한다. (형변환이라 부르기도 한다.)


캐스팅은 OOP(객체지향프로그래밍) 에서 매우 중요하다.


왜냐하면 캐스팅은 OOP의 다형성과 관련이 있기 때문이다.


자바를 통해서 설명하겠다. (어떤 언어든 상관없다.)


자바에서의 데이터형은 아래와 같이 크게 2가지로 나눌 수 있다. 


데이터형 : 기본형 , 참조형.


자바에서 기본형은 8가지다. ( boolean, int, short, byte,double, long, float, char ) 이다.


자바에서 참조형은 만들기 나름이지만, 예시를 들자면, 많이쓰는 String 정도가 되겠다.


캐스팅의 목적은 데이터를 바꾸는 것이 주목적이 아닌, 


코드를 적는 프로그래머가 이미 데이터 정보에 대해 이해한 가정하에, OOP의 다형성 측면에서 사용한다.


기본 데이터형에서의 캐스팅은 원칙적으로 데이터손실을 막고자 한다.


아래의 예시를 보자.


int a = 1.0; 


위의 예시는 컴파일 에러가 뜬다.


변수는 분명 int 정보만 원하고 있다. 1.0이라는 실제데이터는 int 정보를 이미 가지고 있고, 소수점을 표현하는


double형 데이터이다. 변수라는 것은 원하는 정보가 실제데이터에 있을 시, 문제 없이 받아 올 수 있다.


하지만 위의 예시는 왜 컴파일 에러가 뜰까?


답은 실제 데이터 1.0이라는 것이 a 변수에 들어 가면 1로 바뀌기 때문에 실제 데이터가 손실되는것을 막고자 하는 것이다.


하지만, 코드를 작성하는 프로그래머가 데이터가 손실된 다는 것을 이미 알고 있고 OOP의 다형성을 이용하고 싶을때는


아래와 같이 캐스팅을 하는 것이다. 


int a = (int)1.0;


실제데이터 앞에 (데이터 자료형) 을 붙여주면 캐스팅이 된다. 따라서 a 에는 1.0 대신 캐스팅된 1이 들어간다.


반대의 상황은 어떨까? 아래의 상황을 보자.


double b = 1;


위의 상황은 컴파일 에러가 뜨지 않는다. 하지만 의문을 가져야 한다.


분명 변수가 원하는정보는 더블형 데이터 자료형 이지만, 실제 데이터는 1이라는 int 자료형만 넣었다.


원칙으로는 변수가 원하는 정보를 충족하지 않을 시, 컴파일 에러가 떠야 한다.


하지만 컴파일 에러가 뜨지 않는 이유가 무엇일까?


그 이유는 기본형 끼리의 캐스팅이기 때문이다. 분명 실제 데이터는 1밖에 넣질 않았지만,


기본 자료형은 이미 컴파일러가 알고 있는 자료형이다. 따라서, 더블형 데이터의 형태를 추측으로 알 수 있는 것이다.


즉, 컴파일러가 자동적으로 더블형으로 바꿔주는 것이지, 원칙으론 안된다는 것을 알아야 한다.







실제로, 다음 포스팅할 다운캐스팅 같은 경우는 참조형 끼리의 형변환 이므로, 컴파일러는 참조형 데이터를 추리하지 못한다.


따라서, 윗 개념과 일맥상통하게 기본적으로 다운캐스팅은 성립되지 않는 개념이다. 


다음 포스팅때 업캐스팅과 다운캐스팅에 대해 그 의문을 풀어볼 것이다.



http://mommoo.tistory.com/41 - 업캐스팅

http://mommoo.tistory.com/51 - 다운캐스팅 



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts