Java 문법

7-2상속(타입 변환과 다형성)

개발하는지호 2023. 10. 9. 04:01

다형성 : 다형성은 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질이다. 예를 들어 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 사용(장착)하느냐에 따라 주행 성능이 달라질 수 있다.

 

*다형성 구현

메소드 재정의 + 타입 변환 

 

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

ex)

부모타입 변수 = 자식 타입;

 

타입 변환이란 타입을 다른 타입으로 변환하는 행위를 말한다. 클래스도 기본타입 변환과 같이 타입 변환이 있는데, 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생한다. 자식은 부모 타입으로 자동 타입 변환이 가능하다.

 

ex)

Animal 클래스 (부모)

Cat 클래스 (자식)

 

Cat cat = new Cat();

Animal animal = cat; or Animal animal = new Cat();

 

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

 

클래스 자동 타입 변환 후 사용

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

*예외가 있는데, 메소드가 자식 클래스에서 재정의(오버라이딩) 되었다면 자식 클래스의 메소드가 대신 호출된다.

 

필드의 다형성

필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다. 이를 필드의 다형성이라고 한다.

 

다형성을 구현할 수 있는 기술적 조건

1. 부모 클래스를 상속하는 자식 클래스는 부모가 가지고 있는 필드와 메소드를 가지고 있으니 사용 방법이 동일하다.

2. 자식 클래스는 부모의 메소드를 재정의해서 메소드의 실행 내용을 변경함으로써 더 우수한 실행결과가 나오게 할 수 있다.

3. 자식 타입을 부모 타입으로 변환할 수 있다.

 

매개 변수의 다형성

자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만, 주로 메소드를 호출할 때 많이 발생한다. 메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.

 

강제 타입 변환

강제 타입 변환(casting)은 부모 타입을 자식 타입으로 변환하는 것을 말한다. 그렇다고 해서 모든 부모 타입을 자식 타입으로 강제 변환할 수 있는 것은 아니다. 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변활할 때 강제 타입 변환을 사용할 수 있다.

 

ex)

Parent parent = new Child();

Child child = (Child) parent; 

 

객체 타입 확인

부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인하는 방법은 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연사자를 사용한다.

 

ex)

boolean result = 좌항(객체) instancof 우항(타입)

 

public void method(Parent parent) {

  if(parent instanceof Child) {

    Child child = (Child) parent;

  }

}

 

 

*예외가 발생하면 프로그램은 즉시 종료되기 때문에 method1()과 같이 강제 타입 변환을 하기 전에 Instanceof 연산자로 변환시킬 타입의 객체인지 조사해서 잘못된 매개값으로 인해 프로그램이 종료  되는 것을 막아야 한다.