언어(Language)/Java
다형성(polymorphism)
송기동
2023. 8. 9. 18:55
728x90
다형성이란?
하나의 코드가 여러 자료형으로 구현되어 실행되는 것
같은 코드에서 여러 다른 실행 결과가 나옴
정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음
다형성을 사용하는 이유?
상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음
그렇지 않는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워짐
상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현
여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음
package ch05;
public class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
public void eating() {
System.out.println("동물이 먹습니다.");
}
} // end of Animal class
class Tiger extends Animal {
@Override // 오버라이드
public void move() {
System.out.println("호랑이가 네발로 움직입니다.");
}
@Override
public void eating() {
System.out.println("호랑이가 사냥합니다.");
}
} // end of Tiger class
class Human extends Animal {
@Override
public void move() {
System.out.println("사람이 두발로 걸어다닙니다.");
}
@Override
public void eating() {
System.out.println("밥을 먹습니다.");
}
public void readBooks() {
System.out.println("사람이 책을 읽습니다.");
}
} // end of Human class
형변환(업캐스팅,다운캐스팅)
package ch06;
public class Animal {
public void makeSound() {
System.out.println("동물이 소리를 내고 있습니다.");
}
} // end of class
package ch06;
public class Bird extends Animal {
@Override
public void makeSound() {
System.out.println("새가 지저귀고 있습니다.");
}
public void fly() {
System.out.println("새가 날아갑니다.");
}
} // end of class
package ch06;
public class CastingExample {
public static void main(String[] args) {
// 다형성, 업캐스팅(Upcasting)
// 업캐스팅은 하위클래스의 객체를 상위클래스 타입으로
// 변환하는 것을 말합니다. 이 경우에는 데이터 손실이 없습니다.
// 업캐스팅은 자동적으로 이루어지므로 별도의 형변환 연산자가 필요없습니다.
Animal animal = new Bird();
// 다운캐스팅이란
// 업캐스팅된 객체를 다시 원래의 하위 클래스타입으로
// 변환하는 것을 말합니다.
// 다운캐스팅은 수동적으로 형변환 연산자를 사용하여 이루어집니다.
// 업캐스팅된 객체를 하위 클래스에 메서드나 속성을 사용하기 위해 필요합니다.
// 다운캐스팅을 할 땐 반드시 하위 클래스타입으로 변환 가능한지
// instaceof 연산자로 확인하는 것이 안전합니다.
Bird bird = (Bird) animal;
bird.fly();
// 배열을 활용
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("----------------");
}
// for (int i = 0; i < animals.length; i++) {
//
// }
} // end of main
} // end of class
새가 날아갑니다.
=================
동물이 소리를 내고 있습니다.
----------------
새가 지저귀고 있습니다.
새가 날아갑니다.
----------------
동물이 소리를 내고 있습니다.
----------------
728x90