자바의 정석(남궁성 저) 학습내용 정리
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();