[edx] 다형성(Polymorphism)

Hyeon Soo·2022년 5월 13일
0

1. 개요

  • 클래스와 클래스간의 상속관계가 있다면, 부모 클래스가 더 큰 범주이고, 자식 클래스는 부모 클래스의 하위 범주가 된다. 그렇다면, 하위 개념을 상위 개념으로 불러도 원칙대로라면 무리가 없다. 예를 들어, 포유류의 범주 아래 있는 사람을 사람이 아니라 포유류라고 불러도 되는 것을 의미한다.

2. 선언

  • 다형성은 상속, 혹은 인터페이스를 사용하는 클래스와 클래스 간의 관계에 기반한 특성이다. 상위 클래스의 객체는 하위 클래스의 객체를 assign해도 동작한다.
public class Human{
	~~~
}

public class Korean extends Human{
	~~~
    
    public String checkSpiceLevel(){
    	~~~
    }
}

public static void main(){
	Human Kim;
    
    Kim = new Korean();
}
  • 위의 예시코드에서 Kim은 Human 클래스로 선언했으나, 실제 객체는 자식 클래스인 Korean으로 선언하였다. 선언한 변수의 자료형과 실제 데이터의 타입이 다르면 컴파일 단계에서 오류가 발생하는 것과 다르게, 객체의 경우 상속 관계를 고려하여 무리가 없으면 오류를 일으키지 않는다.

  • 위의 예시는 상속만 보였으나, 인터페이스 또한 비슷하게 작동한다.

public class Korean extends Human implements Eat{
	~~~
}

public class Cat implements Eat{
	~~~
}

public static void main(){
	Eat Kim = new Korean();
    Eat Tom = new Cat();
}
  • 위와 같이 인터페이스를 사용하는 서로 다른 클래스의 객체를 인터페이스 객체로 선언할 수 있다.

3. 캐스팅

  • 위와 같이 다형성을 이용하였을 경우, 객체의 메서드를 호출할 때 의문이 생길 수 있다. 부모 객체로 선언되어 있지만, 실제 데이터는 자식 객체인데, 이때 부모 클래스의 메서드를 자식이 override한 경우, 어떤 메서드가 호출되는지의 문제가 생긴다.

  • 결론은, 최초 선언한 부모 클래스의 메서드가 호출된다. 만약 메서드가 자식 클래스에만 존재하고 부모 클래스에 없다면, 오류가 발생한다.

  • 만약 선언된 클래스가 아닌 실제 클래스의 메서드를 호출하고 싶다면, Java의 경우 객체의 앞에 클래스를 재지정해야한다.

((Korean)Kim).checkSpiceLevel();
  • 앞서 Kim을 Human으로 선언하고, 실제 객체는 Korean으로 넣었기 때문에, Korean클래스의 메서드를 실행하기 위해선 위와 같은 작업이 필요하다.

출처: https://learning.edx.org/course/course-v1:GTx+CS1331xII+2T2021/home

이상의 내용은 edx 플랫폼을 통해 GTx에서 제공하는 Introduction to Object-Oriented Programming with Java 강의의 내용을 개인적으로 정리한 것입니다. 그렇기 때문에, 부정확한 내용 혹은 잘못 이해하고 있는 내용이 있을 수 있으니 양해 부탁드립니다.

0개의 댓글