Java 파트7-2. 타입 변환과 다형성

1. 시작하기 전에


기본 타입과 마찬가지로 클래스도 타입 변환이 있다. 이를 활용하면 객체 지향 프로그래밍의 다형성을 구현할 수 있다.

다형성

  • 사용 방법은 동일하지만 다양한 객체를 활용해 여러 실행결과가 나오도록 하는 성질
  • 메소드 재정의와 타입 변환으로 구현
    • 메소드 재정의 + 타입 변환 -> 다형성


2. 자동 타입 변환


  • 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것
  • 부모타입 변수에 바로 자식 객체를 대입해도 된다.
  • 자동 타입 변환이 될 경우, 자식 타입의 필드와 메소드는 사용 불가능 -> 사용을 원하면 강제 타입변환 후 사용 가능

그림1

Cat은 Animal의 상속을 받고 있기 때문에 당연히 Cat객체를 생성할 때는 Animal이라는 객체가 생성된다. cat이 가지고 있는 번지가 복사되어 animal 변수에 대입된다.

그림2

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


그림3

  • 부모 타입으로 자동 타입 변환 이후에는 부모 클래스에 선언된 필드 및 메소드만 접근 가능
  • 예외적으로, 메소드가 자식 클래스에서 재정의될 경우 자식 클래스의 메소드가 대신 호출


3. 필드의 다형성


필드 타입을 부모 타입으로 선언할 경우 다양한 자식 객체가 저장되어 필드 사용 결과가 달라질 수 있다.

그림4

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

4. 매개 변수의 다형성


  • 매개 변수를 부모 타입으로 선언하는 효과
    • 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다.
    • 자식의 재정의된 메소드가 호출 -> 다형성

그림5

Driver 클래스에 drive메소드의 매개 변수로 Vehicle 클래스 변수로 넣도록 설계했다면 Driver 클래스의 객체와 Vehicle 객체를 만들어서 Driver클래스변수명.drive(Vehicle클래스변수명)으로 사용하는 것이 일반적이다. 하지만 여기서 Vehicle 클래스를 상속받은 Bus 클래스도 매개 변수로 들어갈 수 있다. 위에서 설명 했듯이 부모타입 변수에 자식 객체를 대입하면 자동 변환되기 때문이다.


5. 강제 타입 변환


  • 부모 타입을 자식 타입으로 변환
    • 조건 : 자식 타입이 부모 타입으로 자동 타입 변환된 경우 다시 반대로 변환할 때만 사용 가능

그림6

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

instanceof 연산자

강제 타입 변환 조건을 확인하지 않고 강제 타입 변환 시도 시 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;
    }
}


6. 정리하기


  • 클래스 타입 변환 : 다른 클래스 타입으로 객체를 대입
  • 자동 타입 변환 : 자식 객체를 부모 타입 변수에 대입할 때에는 자동으로 타입이 변환됨
  • 강제 타입 변환 : 부모 타입 변수에 자식 타입 변수를 대입해서 자동 타입 변환 시켰다가 다시 자식 타입으로 돌아올 때 사용
  • instanceof 연산자 : 객체가 어떤 타입인지 조사할 때 사용
  • 다형성 : 객체 사용 방법은 동일하나 실행결과가 다양하게 나오는 성질, 메소드 재정의와 타입 변환으로 구현

본 포스팅은 ‘혼자 공부하는 자바’를 읽고 공부한 내용을 바탕으로 작성하였습니다.


© 2021. By Backtony