다형성
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
- 같은 코드에서 여러 다른 실행 결과가 나옴
- 정보은닉,상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
- 다형성을 잘 활용하면 유연하고 확장성 있고, 유지보수가 편리한 프로그램을 만들수 있음
public class Animal {
public void makeSound() {
System.out.println("동물이 소리를 내고 있습니다.");
}
}
public class Bird extends Animal {
@Override
public void makeSound() {
System.out.println("새가 지저귀고 있습니다.");
}
public void fly() {
System.out.println("새가 날아갑니다.");
}
}
다형성을 사용하는 이유
- 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음
- if else if 문으로도 구현할 수 있지만 코드의 유지보수가 어려움
- 상위클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각클래스에 맞는 기능 구현
- 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음
업캐스팅
- 업캐스팅은 하위 클래스의 객체를 상위 클래스 타입으로 변환하는 것을 말합니다 (데이터 손실이 없음)
- 업캐스팅은 자동적으로 이루어지므로 별도의 형변환 연산자가 필요없음
Animal animal = new Bird();
//animal.fly(); // 데이터 타입이 Animal이기때문애 오류 발생
다운 캐스팅
- 업캐스팅된 객체를 다시 원래의 하위 클래스 타입으로 변환 시키는것
- 수동적으로 형변환 연산자를 사용해야함
- 업캐스팅된 객체를 하위 클래스에 메서드나 속성을 사용하기 위해 필요
Bird bird = (Bird)animal;
bird.fly();
- bird의 데이터 타입은 Bird이기 때문애 성공적으로 실행, (Bird)animal을 animal로 변경하면 animal의 데이터 타입이 Animal이기 때문애 오류 발생
배열 활용
- 다형성,업캐스팅,다운캐스팅을 활용하여 배열을 이용하여 코드를 작성할 수 있다.
public static void main(String[] args) {
Animal[] animals = new Animal[3];
animals[0] = new Animal();
animals[1] = new Bird();
animals[2] = new Animal();
System.out.println("======================");
// 0 -- Animal --> if --> false
// 1 -- Bird --> if --> true
// 2 -- Animal --> if -- false
for (Animal a : animals) {
a.makeSound();
//a.fly(); 데이터 타입을 확인하고 싶다면 instanceof 연산자
if(a instanceof Bird) {
Bird targetBird = (Bird)a;
targetBird.fly();
}
System.out.println("----------");
}
}