• 기본 타입 변환 처럼 클래스에서도 타입 변환이 있다.
  • 다형성 : 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질 
  • 다형성을 구현하려면 상속, 메소드 재정의타입변환이 필요하다.

1. 자동 타입 변환

  • 자동 타입 변환(promotion)이란 ? 프로그램 실행 도중에 자동으로 타입 변환이 일어나는 것
  • 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생한다.

  • 자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것
  • 따라서 자식은 부모 타입으로 자동 타입 변환이 가능하다.
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입 이라면 자동 타입 변환이 일어날 수 있다.
  • 즉, 아래의 그림에서 D객체는 바로 위의 부모인 B타입으로 자동 타입 변환이 될 수도 있고, A 타입으로 자동 타입 변환이 될 수 있다.

 

https://hyuntaekhong.github.io/blog/java-basic21/

 

  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
  • 그러나 예외가 있는데, 메소드가 자식클래스에서 재정의 되는 경우이다. 이땐 자식 클래스의 메소드가 대신 호출된다. (다형성)

출처 : <혼자 공부하는 자바>

  • Child 객체는 method3() 메소드를 가지고 있지만, Parent 타입으로 변환된 이후에는 method3()을 호출할 수 없다.
  • 그러나 부모와 자식 모두에게 있는 method2()는 재정의를 통해 타입 변환 이후에도 호출이 가능하다.

 

 

2. 필드의 다형성

  • 자동 타입 변환이 왜 필요할까? 다형성을 구현하기 위해서이다.
  • 다형성을 구현하는 법 : 상속 + 재정의 + 타입 변환
  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다. 
  • 자식 클래스는 부모의 메소드를 재정의해서 메소드의 실행 내용을 변경함으로써 더 우수한 실행 결과가 나오게 할 수 있다.

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

 

 

 

3. 매개 변수의 다형성

  • 자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만, 주로 메소드를 호출할 때 많이 발생한다.
  • 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다. 
  • 매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행결과가 다양해 질 수 있다.
  • 자식 객체가 부모의 메소드를 재정의 했다면 재정의된 메소드를 호출함으로써 메소드의 실행결과가 다양해 진다.

 

 

 

4. 강제 타입 변환

  • 강제 타입 변환(casting) : 부모 타입을 자식 타입으로 변환하는 것
  • 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때만 적용된다.
  • 자식 타입이 부모 타입으로 자동 타입 변환하면, 부모에 선언된 필드와 메소드만 사용 가능한데,
  • 만약 자식에 선언된 필드와 메소드를 사용하고 싶다면, 자식 타입으로 다시 강제 타입 변환해서 자식의 필드와 메소드를 사용한다.

 

 

 

 

5. 객체 타입 확인

  • 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연산자를 사용한다.
  • instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용된다.
  • 메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 확인하고 안전하게 강제 타입 변환을 해야 한다.
  • 만약 타입을 확인하지 않고 강제 타입 변환을 시도하면 - ClassCastException이 발생할 수 있다.
// 사용법
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;
    }
}

참고자료

 

'Coding > Java' 카테고리의 다른 글

[23] JAVA 인터페이스  (0) 2022.12.04
[22] JAVA 추상클래스  (0) 2022.12.03
[20] JAVA 상속  (0) 2022.11.30
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27

+ Recent posts