- 다형성은 단일 작업을 다양한 방식으로 수행하는 것이다.
- 다형성은 컴파일 시, 런타임 시 나타난다.
- 컴파일 시 나타나는 다형성은 메소드 오버로딩, 연산자 오버로딩이 있지만 자바는 연산자 오버로딩을 지원하지 않는다.
- 런타임 시 나타나는 다형성은 메소드 오버라이딩이 있다.
- 즉, 자바에서 다형성은 메소드 오버로딩(컴파일)과 메소드 오버라이딩(런타임)으로 나타난다.
1) 업 캐스팅
- 업 캐스팅은 자식 클래스를 부모 클래스로 캐스팅하는 것이다.
- 부모 클래스는 하나이므로 캐스팅 문법 생략이 가능하다.
- 주로 한 개의 변수 또는 메서드가 여러 형태의 데이터 타입과 호환이 필요한 경우 사용한다. (ex. Animal[]에 Dog, Cat, Tiger를 삽입하는 경우)
// 🟢 Animal Class
package lesson04.quiz01;
public class Animal {
public void onlyAnimal() {
System.out.println("부모 클래스에만 있는 메소드");
}
public void cry() {
// do nothing
}
}
// 🟢 Cat Class
package lesson04.quiz01;
public class Cat extends Animal {
@Override
public void cry() {
System.out.println("야옹");
}
public void grooming() {
System.out.println("그루밍");
}
}
// 🟢 AnimalTest Class (Main Class)
package lesson04.quiz01;
public class AnimalTest {
public static void main(String[] args) {
Animal animal = new Animal();
animal = new Cat();
// animal = (Animal)new Cat();
animal.onlyAnimal(); // 부모 클래스에만 있는 메소드
// animal.grooming(); // 자식 클래스에만 있는 메소드 -> error
animal.cry(); // 오버라이딩한 메소드
}
}
2) 다운 캐스팅
- 다운 캐스팅은 부모 클래스를 자식 클래스로 캐스팅하는 것이다.
- 자식 클래스는 여러 개일 수 있으므로 캐스팅 문법 생략이 불가능하다.
instanceof
로 해당 클래스가 실제로 다운 캐스팅하려는 클래스의 인스턴스인지 확인 후 참일 경우에만 수행한다.- 주로 업 캐스팅된 객체가 원래 속한 하위 클래스에만 있는 메소드나 필드에 접근해야 할 경우 사용한다.
// 🟢 Animal Class
package lesson04.quiz01;
public class Animal {
public void onlyAnimal() {
System.out.println("부모 클래스에만 있는 메소드");
}
public void cry() {
// do nothing
}
}
// 🟢 Cat Class
package lesson04.quiz01;
public class Cat extends Animal {
@Override
public void cry() {
System.out.println("야옹");
}
public void grooming() {
System.out.println("그루밍");
}
}
// 🟢 AnimalTest Class (Main Class)
package lesson04.quiz01;
public class AnimalTest {
public static void main(String[] args) {
Animal animal = new Cat(); // up casting
if(animal instanceof Cat) { // animal이 실제로 Cat의 인스턴스인지 확인
Cat cat = (Cat)animal; // down casting
cat.onlyAnimal(); // 부모 클래스에만 있는 메소드
cat.grooming(); // 자식 클래스에만 있는 메소드
cat.cry(); // 오버라이딩한 메소드
}
}
}
3) 업 캐스팅 & 다운 캐스팅 시 메소드 사용 가능 여부
업 캐스팅 | 다운 캐스팅 | |
---|---|---|
부모 클래스에만 있는 메소드 사용 | O | O(상속) |
자식 클래스에만 있는 메소드 사용 | X | O |
자식 클래스에 의해 오버라이딩 된 메소드 사용 | X | X |
부모 클래스의 메소드를 오버라이딩한 메소드 사용 | O | O |