1. 다형성이란?
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
- 상위 타입 참조 변수로 하위 타입 객체를 다루는 것
- 하위 타입 참조 변수로 상위 타입 객체를 다루는 것은 허용하지 않음
class Animal { ... }
class Human extends Animal { ... }
Animal animal = new Human();
Human human = new Animal();
2. 참조변수의 형변환
- 사용할 수 있는 멤버의 갯수를 조절하는 것
- 참조변수를 형변환 한다고 해서 기본형의 형변환 처럼 값이 달라지는 것이 아님
- 상속관계의 참조변수일 때 서로 형변환 가능
class Animal { ... }
class Human extends Animal { ... }
class Pig extends Animal { ... }
Human h = new Human();
Animal a = (Animal)h;
Human h2 = (Human)a;
Pig p = (Pig)h;
3. instanceof연산자
- 참조변수의 형변환 가능 여부 확인하기 위해 instanceof 사용
- 가능하면 true반환
Animal a = new Animal();
if (a instanceof Human) {
Human h = (Human)a;
}
4. 참조변수와 인스턴스의 연결
class Parent {
int x = 200;
void method() {
System.out.println("1234");
}
}
class Child extends Parent {
int x = 100;
void method() {
System.out.println("4321");
}
}
Parent p = new Parent();
Parent p2 = new Child();
Child p3 = new Child();
System.out.println(p.x);
System.out.println(p2.x);
System.out.println(p3.x);
p.method();
p2.method();
p3.method();
5. 매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 하위 타입의 인스턴스 넘길 수 있음
Human h = new Human();
Pig p = new Pig();
Dog h = new Dog();
void move(Animal a) {
...
}
6. 여러 종류의 객체를 배열로 다루기
Animal a[] = new Animal[3];
a[0] = new Human();
a[1] = new Pig();
a[2] = new Dog();
※ 참고로 가변 배열이 가능한 Vector클래스가 있음, 공부 필요