5. 다형성(polymorphism)
5-1 다형성이란?
'여러 가지 형태를 가질 수 있는 능력'을 의미한다.
구체적으로는 '조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것'이다.
- 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
- 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.
5-2 참조변수의 형변환
참조변수도 형변환이 가능하다. 단, 서로 상속관계에 있는 클래스사이에서만 가능하기 때문에 자손타입과 조상타입 서로간의 형변환만 가능하다.
자손타입 -> 조상타입(up-casting) : 형변환 생략가능
조상타입 -> 자손타입(down-casting) : 형변환 생략불가
형변환은 참조변수의 타입을 반환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.
단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 잇는 멤버의 범위(개수)를 조절하는 것 뿐이다.
서로 상속관계에 잇는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다. 그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.
5-3 instanceof연산자
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용한다.
주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 그리고 연산의 결과로 true, false 둘 중 하나를 boolean타입으로 반환한다.
어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.
5-4 참조변수와 인스턴스의 연결
조상 클래스에 선언된 멤버변수와 같은 이름의 인스턴스변수를 자손 클래스에 중복으로 정의했을 때, 조상타입의 참조변수로 자손인스턴스를 참조하는 경우와 자손타입의 참조변수로 자손인스턴스를 참조하는 경우는 서로 다른 결과를 얻는다.
메서드의 경우 조상 클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에 관계없이 항상 실제인스턴스의 메서드(오버라이딩된 메서드)가 호출되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.
참고) static메서드의 경우 참조변수가 아닌 '클래스이름.메서드()'로 호출한다.
5-5 매개변수의 다형성
참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
5-6 여러 종류의 객체를 배열로 다루기
조상타입의 참조변수 배열을 사용하면, 공통의 조상을 가진 서로 다른 종류의 객체를 배열로 묶어서 다룰 수 있다.
이 때 배열의 크기를 조정하는데 문제가 생길 수 있는데, 이 때 Vector를 이용하면 된다.
Vector는 동적으로 크기가 관리되는 객체배열이다.
메서드 / 생성자 |
설 명 |
Vector() |
10개의 객체를 저장할 수 있는 Vector인스턴스를 생성한다.
10개 이상의 인스턴스가 저장되면, 자동적으로 크기가 증가된다. |
boolean add(Object o) |
Vector에 객체를 추가한다. 추가에 성공하면 결과값으로 true, 실패하면 false를 반환한다. |
boolean remove(Object o) |
Vector에 저장되어 있는 객체를 제거한다. 제거에 성공하면 true, 실패하면 false를 반환한다. |
boolean isEmpty() |
Vector가 비어있는지 검사한다. 비어있으면 true, 비어있지 않으면 false를 반환한다. |
Object get(int index) |
지정된 위치(index)의 객체를 반환한다. 반환타입이 Object타입이므로 적절한 타입으로의 형변환이 필요하다 |
int size() |
Vector에 저장된 객체의 개수를 반환한다. |
'java > 요약정리' 카테고리의 다른 글
자바의 정석 7장 (7) 인터페이스(interface) (0) | 2018.07.06 |
---|---|
자바의 정석 7장 (6) 추상클래스(abstract class) (0) | 2018.07.06 |
자바의 정석 7장(4) 제어자(modifier) (0) | 2018.07.06 |
자바의 정석 7장(3) package와 import (0) | 2018.07.06 |
자바의 정석 7장(2) 오버라이딩(Overriding) (0) | 2018.07.06 |