반응형
이번 포스팅에서는 자바(Java)에서 다형성(polymorphism)에 대하여 공부를 해보고자 한다.
다형성이란
다형성이란 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 말한다.
쉽게 말해 같은 코드에서 여러 실행 결과가 나오는 것이다.
다형성은 추상 클래스, 인터페이스에서 구현된다.
또한 안드로이드, 스프링 등 자바 기반의 프레임워크에서 응용할 수 있는 객체 지향 프로그램의 중요한 개념이다.
- Animal 클래스에 메서드 하나를 정의하고 상속받은 클래스에서 재정의 한다.
이를 코드로 구현하면 다음과 같다.
import java.util.ArrayList;
class Animal{
public void move(){
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
public void move(){
System.out.println("사람이 두 발로 걷습니다. ");
}
public void readBook(){
System.out.println("사람이 책을 읽습니다. ");
}
}
class Tiger extends Animal{
public void move(){
System.out.println("호랑이가 네 발로 뜁니다. ");
}
public void hunting() {
System.out.println("호랑이가 사냥을 합니다. ");
}
}
class Eagle extends Animal{
public void move(){
System.out.println("독수리가 하늘을 납니다 ");
}
public void flying() {
System.out.print("독수리가 날개를 쭉 펴고 멀리 날아갑니다");
}
}
public class AnimalTest1 {
public static void main(String[] args) {
AnimalTest1 aTest = new AnimalTest1();
aTest.moveAnimal(new Human());
aTest.moveAnimal(new Tiger());
aTest.moveAnimal(new Eagle());
}
public void moveAnimal(Animal animal) { //매개 변수의 자료형이 상위 클래스
animal.move(); //재정의 된 메서드 호출
}
}
출력 결과
사람이 두 발로 걷습니다.
호랑이가 네 발로 뜁니다.
독수리가 하늘을 납니다.
- moveAnimal( ) 메서드는 어떤 인스턴스가 매개변수로 넘어와도 모두 Animal형으로 변환한다.
(매개변수가 전달되는 부분에 Human 인스턴스가 전달되었다면 Animal ani = new Human( ); 과 같이 형 변환된다.) - Animal에서 상속받은 클래스가 매개변수로 넘어오면 모두 Animal형으로 변환되므로 animal.move( ) 메서드를 호출할 수 있다.
- 가상 메서드 원리에 따라 animal.move( ) 메서드가 호출하는 메서드는 Animal의 move가 아닌 매개변수로 넘어온 실제 인스턴스의 메서드이다.
- animal.move( ) 코드는 변함이 없지만 어떤 매개변수가 넘어왔느냐에 따라 출력문이 달라진다.
다형성의 장점
- 유지보수가 쉽다.
개발자가 여러 객체를 하나의 타입으로 관리가 가능하기 때문에 코드 관리가 편리해 유지보수가 용이하다. - 재사용성 증가
다형성을 활용하면 객체를 재사용하기 쉬워지기 때문에 개발자의 코드 재사용성이 높아진다. - 느슨한 결합
다형성을 활용하면 클래스 간 의존성이 줄어들며 확장성이 높고 결합도가 낮아져 안전성이 높아진다.
다형성 필수 조건
- 상속 관계
다형성을 활용하기 위해서는 필수로 부모-자식 간 클래스 상속이 이루어져야 한다. - 오버라이딩 필수
다형성이 보장되기 위해서는 하위 클래스 메서드가 반드시 재정의되어 있어야 한다. - 업캐스팅
부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 한다.
반응형
'Back-End > Java' 카테고리의 다른 글
[Java] 추상 클래스(abstract method) (0) | 2023.02.07 |
---|---|
[Java] 다운 캐스팅과 instanceof (0) | 2023.02.06 |
[Java] 메서드 오버라이딩(method overriding) (0) | 2023.02.06 |
[Java] 상속에서 클래스 생성과 형 변환 (0) | 2023.02.05 |
[Java] 상속(inheritance) (0) | 2023.02.05 |