다형성이란?
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
- 같은 코드에서 여러 다른 실행 결과가 나옴
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
- 다형성을 잘 활용하면 우연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음
- 상위 타입 참조 변수로 하위 타입 객체를 다루는 것
- 하위 타입의 참조변수로 상위 타입의 객체를 가리킬 수 없음
다형성 구현 방법
상위타입 Animal이고 하위타입이 Human이라고 생각해보자
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("사람이 책을 읽습니다.");
}
}
Human은 상위 타입인 Animal 타입을 상속 받고 있다. 여기서 다형성을 구현을 하게 되면 상위 타입인 Animal로 타입을 지정하고 참조변수를 선언한다.
// 상위타입으로 참조변수 선언해서 하위타입 다룸
Animal hAnimal = new Human();
근데 왜 하위타입으로 참조변수를 선언 해서 상위 타입을 다룰수는 없을까?
상위타입인 Animal 하위 타입인 Human을 봤을 때 상위 타입보다 하위타입이 메서드가 더 추가가 되어있다.
그렇다면 하위타입을 상위타입을 다뤘을 때 멤버변수나 메소드가 감소가 나기 때문에 사용할 수가 없다.
그렇기 때문에 상위타입으로 참조변수를 선언 해야한다.
다형성 예
import java.util.ArrayList;
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 hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
AnimalTest test = new AnimalTest();
test.moveAnimal(hAnimal);
test.moveAnimal(tAnimal);
test.moveAnimal(eAnimal);
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for(Animal animal : animalList) {
animal.move();
}
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
다형성을 사용하는 이유?
- 다른 클래스를 추가 하는 경우
- 상속과 메서드 재정의를 활용하여 확정성 있는 프로그램을 만들 수 있음
- 그렇지 않는 경우 많은 if-else if문이 구현되고 코드 유지보수가 어려워짐
- 상위 클래스에서는 공통적인 부분을 제공하고 하위 클랫에서 각 클래스에 맞는 기능 구현
- 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음
참조 :
- https://www.youtube.com/watch?v=fw7Nm_li0pE&list=PLW2UjW795-f5JPTsYHGAawAck9cQRw5TD&index=30
- 패스트캠퍼스
'JAVA' 카테고리의 다른 글
| [JAVA] 추상 클래스의 의미와 구현하는 방법 (0) | 2023.07.30 |
|---|---|
| [JAVA] instanceof 연산자 와 업캐스팅,다운캐스팅 (0) | 2023.07.28 |
| [JAVA] 메서드 재정의 하기 (2) | 2023.07.16 |
| [JAVA] 상속에서 클래스 생성 과정과 형 변환 (1) | 2023.07.16 |
| [JAVA] 상속을 활용한 멤버십 클래스 구현 (0) | 2023.07.13 |