자바의 정석 - 다형성(Polymorphism)



자바의 정석(남궁성 저) 학습내용 정리

1. 다형성 (Polymorphism)

  • Java에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것.
  • 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하는 것.
  • 참조변수의 타입이 참조변수가 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 개수를 결정한다.
  • 모든 참조변수는 null 또는 4 byte의 주소값이 저장된다.

2. 참조변수의 형변환

  • 부모타입의 참조변수를 자식타입의 참조변수로 변환하는 것 = down-casting (형변환 생략 불가)
  • 형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에, 참조변수의 형변환은 인스턴스에 아무 영향 없다.
  • 컴파일 시, 참조변수 간의 타입만 체크하기 때문에 실행 시 생성될 인스턴스의 타입에 대해서는 알지 못하여 컴파일은 성공하더라도 실행 시 에러(ClassCastException)가 발생할 수 있다.

3. instanceof 연산자

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.(주로 조건문에 사용)
  • instanceof를 이용한 연산 결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 뜻이다.
    void doWork(Car c) {
      if (c instanceof FireEngine){
          FireEngine fe = (FireEngine)c;
          fe.water();
          ...
      }else if ...
    }

4. 참조변수와 인스턴스의 연결

  • static 메소드는 static 변수처럼 참조변수의 타입에 영향을 받는다. 참조변수의 타입에 영향을 받지 않는 것은 인스턴스 메소드 뿐이다.
  • 따라서 static 메소드는 반드시 참조변수가 아닌 클래스이름.메소드()로 호출해야 한다.

5. 여러 종류의 객체를 배열로 다루기

  • 부모타입의 참조변수 배열을 사용하면, 공통의 조상을 가진 서로 다른 종류의 객체를 배열로 묶어서 다룰 수 있다.
  • Vector클래스는 내부적으로 Object타입의 배열을 가지고 있어서, 이 배열에 객체를 추가하거나 제거할 수 있다.
    public class Vector extends AbstractList
                  implements List, Cloneable, java.io.Serializable  {
        protected Object elementData[];
        ...
    }
  • Vector클래스는 배열의 크기를 알아서 관리해주기 때문에 저장할 인스턴스의 개수에 신경 쓰지 않아도 된다.
  • Vector클래스는 단지 동적으로 크기가 관리되는 객체배열일 뿐이다.
    • Vector item = new Vector();