자바

JAVA 자바 타입 변환과 다형성 자동 타입 변환(Promotion)

알통몬_ 2017. 3. 12. 19:37
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

다형성 : 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질

 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해줍니다. 

다형성을 위해 부모 클래스로 타입 변환을 허용 => 부모 타입에 모든 자식 객체가 대입될 수 있다. 

이 것을 이용하면 객체는 부품화가 가능합니다. 

자동차를 설계할 때 타이어 클래스 타입을 적용했다면 이 클래스를 상속한 실제 타이어들은 어떤 것이든 상관없이 장착(대입)이 가능합니다.

ex)

public class Car {

    Tire t1 = new HankookTire(); -|

                                      | => 자식 타입 객체 대입

    Tire t2 = new KumhoTire();----|

    ---

    타이어 타입 필드

}


타입 변환

 데이터 타입을 다른 데이터 타입으로 변환하는 행위를 말합니다. 기본 타입의 변환에 대해서는 이미 포스팅 했었죠?

보러가기 => http://blog.naver.com/rain483/220569088792

클래스 타입도 마찬가지로 타입 변환이 있습니다. 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생합니다. 위 코드에서도 한국 타이어와 금호 타이어가 Tire를 상속했기 때문에 Tire 변수에 대입할 수 있는 것입니다.


자동 타입 변환 ( Promotion)

 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것. 

자동 타입 변환은 아래와 같은 조건에서 일어납니다.

 부모 클래스 변수 = new 자식클래스타입;

          ↑_____________________|  자동 타입 변환


class Animal {                                 class Dog extends Animal {

   .....                                                       .......

}                                                 }

두 클래스가 있다고 할 때 Dog 클래스는 Animal 클래스를 상속하므로

Dog 클래스의 dog 객체를 Animal 변수에 대입할 수 있습니다.

Dog dog = new Dog();

Animal animal = dog;

또는   Animal animal = new Dog();


위 코드에서 animal 과 dog 변수는 타입만 다를 뿐 동일한 Dog 객체를 참조합니다.

animal 변수가 Animal 타입이므로 당연히 부모인 Animal객체를 참조한다고 생각할 수 있지만, 그렇지 않습니다. dog == animal 을 연산해보면 true 가 나오는데 참조 변수의 == 연산은 참조 주소값이 같을 경우 ture를 산출하므로 두 변수가 동일한 객체를 참조하고 있다는 뜻입니다.



위 그림 같이 상속을 한다고 할 때

B b = new B(); 

C c = new C();

D d = new D();

E e = new E();


A a1 = b; 가능

A a2 = c; 가능

A a3 = d; 가능

A a4 = e; 가능

B b1 = d; 가능
C c1 = e; 가능
B b3 = e; 불가능
C c2 = d; 블가능

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메서드에만 접근이 가능
비록 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정.
메서드가 자식 클래스에서 오버라이딩되었다면 자식 클래스의 메서드가 대신 호출됩니다. 
다형성과 관련이 있기 때문에 매우 중요한 성질이므로 잘 알아두어야 함!
아래 그림으로 보겠습니다.
Child 객체는 method3() 메서드를 가지고 있지만, Parent 타입으로 변환된 후에는 method3()을 호출할 수 없습니다. 그러나 method2() 메서드는 부모와 자식 모두에게 있습니다. 이렇게 오버라이딩된 메서드는 타입 변환 이후에도 자식 메서드가 호출됩니다.


반응형