728x90
반응형
SMALL
다형성이란?
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것입니다.
- 같은 코드에서 여러 다른 실행 결과가 나옵니다.
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나입니다.
- 다형성을 잘 활용하면 유연하고 확장성 있고, 유지보수가 편리한 프로그램을 만들 수 있습니다.
다형성의 예
class Animal {
// 공통적으로 사용하는 메서드는 상위 클래스에 선언합니다.
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal {
@Override
public void move() {
System.out.println("사람이 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal {
@Override
public void move() {
System.out.println("호랑이가 네발로 뜁니다.");
}
public void hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal {
@Override
public void move() {
System.out.println("독수리가 하늘을 날아 다닙니다.");
}
public void flying() {
System.out.println("독수리가 양날개를 쭉 펴고 날아 다닙니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal h = new Human();
Animal t = new Tiger();
Animal e = new Eagle();
AnimalTest test = new AnimalTest();
test.moveAnimal(h);
test.moveAnimal(e);
test.moveAnimal(t);
System.out.println("==============================");
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(h);
animalList.add(e);
animalList.add(t);
for (Animal animal : animalList) {
animal.move();
}
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
출력결과
사람이 걷습니다.
독수리가 하늘을 날아 다닙니다.
호랑이가 네발로 뜁니다.
==============================
사람이 걷습니다.
독수리가 하늘을 날아 다닙니다.
호랑이가 네발로 뜁니다.
- 코드는 한 줄인데 어떤 데이터형이 들어갔느냐에 따라(어떤 인스턴스형이 들어갔느냐에 따라) move()의 실행이 달라집니다. 이것이 다형성입니다.
- 상속을 하게 되면 하위 클래스들을 상위 클래스 하나의 타입으로 모두 핸들링할 수 있습니다. 클래스 간의 결합도가 굉장히 높아집니다.
- 하지만 상위 클래스를 바꾸면 하위 클래스에 영향을 미칠 수 있습니다. 그래서 상속을 설계할 때는 꼭 필요한 경우 신중하게 설계를 해야 합니다.
다형성을 사용하는 이유?
- 다른 동물을 추가하는 경우
- 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있습니다.
- 그렇지 않은 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워집니다.
- 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현합니다.
- 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링할 수 있습니다.
728x90
반응형
LIST
'Java' 카테고리의 다른 글
[JAVA] 자바 - IS-A 관계, HSA-A 관계 (0) | 2021.11.30 |
---|---|
[JAVA] 자바 - 다형성을 활용한 멤버쉽 프로그램 확장 (0) | 2021.11.30 |
[JAVA] 자바 - 메서드 재정의와 가상 메서드 원리 (0) | 2021.11.30 |
[JAVA] 자바 - 메서드 재정의 하기(Overriding) (0) | 2021.11.30 |
[JAVA] 자바 - 상속에서 클래스 생성과정과 형 변환 (0) | 2021.11.30 |
댓글