혼공자 ch7-2 타입 변환과 다형성

Ada·2022년 10월 4일
0

항해TOL

목록 보기
17/63
post-custom-banner

다형성은 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질

다형성을 구현하려먼 메소드 재정의와 타입 변환이 필요함

[자동 타입 변환]

  • 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생하며, 자식은 부모 타입으로 자동 타입 변환이 가능함

  • 자동타입변환(promotion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말함

  • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이 자동 타입 변환의 개념

  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.

  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능함

  • 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로만 한정됨

  • 그러나 메소드가 자식 클래스에서 재정의되었다면 자식 클래스의 메소드가 대신 호출됨

[필드의 다형성]

  • 자동 타입 변환이 필요한 이유는 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있음

Tire 클래스가 Car 클래스와 같은 패키지에 있다고 가정하자. 그렇다면 Car 클래스는 Tire클래스를 사용할 수 있다. 그래서 Car 클래스에서 Tire클래스로 각 바퀴에 대한 객체를 만들었다. 바퀴의 수명이 다하면 새로운 객체로 바꿔주려고 한다. Tire 클래스를 부모 클래스로 하는 자식 클래스 Hankook과 kumho 를 만들고 타이어 교체시기가 되면 해당 위치의 타이어를 hankook이나 kumho 클래스로 새로운 객체를 만들어서 교체해줄 수 있다. 이때 hankook과 kumho 클래스의 roll을 재정의했을 경우 이전에 사용했던 roll과는 다르게 작동한다. 이렇게 다양한 자식 객체를 넣어 결과가 달라지는 것을 다형성이라고 한다.

[매개변수의 다형성]

  • 매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과가 다양해질 수 있다는 것

  • 자식 객체가 부모의 메소드를 재정의 했다면 메소드 내부에서 재정의된 메소드를 호출함으로써 메소드의 실행결과는 다양해짐

[강제 타입 변환]

  • 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환 사용 가능

  • 자동 타입 변환시 자식 타입의 메소드, 필드는 사용이 불가능하지만 강제 타입 변환을 할 경우 다시 자식 타입의 메소드, 필드 사용이 가능해짐

[객체 타입 확인]

강제 타입 변환 조건을 확인하지 않고 강제 타입 변환 시도 시 ClassCastException이 발생할 수 있다. 따라서 이전에 어떤 객체가 어느 클래스의 인스턴스인지 확인할 때 instanceof 연산자를 사용한다.


// 사용법
boolean result = 객체 instanceof 타입

// Parent가 부모 클래스고 Child가 자식 클래스라고 가정하자.
Parent parent = new Parent();

// parent라는 객체가 Child로부터 만들어진 객체인가?
parent instanceof Child // false // classcastexception 발생

// Child 객체가 자동 타입 변환으로 parent에 대입됨
Parent parent = new Child();

// 활용법
public void method(Parent parent){
    // parent는 child 객체가 자동 타입 변환된 경우이므로 true
    if (parent instanceof Child){
        // 강제 타입 변환 조건에 맞으므로 강제 타입 변환 가능
        Child child = (Child) parent;
    }
}
profile
백엔드 프로그래머
post-custom-banner

0개의 댓글