본문 바로가기

Java

(상속) 메서드 오버라이딩과 다형성

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

다형성


다형성이란 다양한 형태를 취할 수 있는 능력을 의미합니다.

객체지향 프로그래밍에서는 다형성의 강력함을 통해 코드를 매우 간결하게 할 수 있습니다.

 

이런 다형성을 구현하는 대표적인 방법이 자바에서 메서드 오버 라이딩입니다.

간단한 예시와 함께 다형성에 대해 알아보겠습니다.

 

 

위와 같은 상속 구조가 있다고 생각해보겠습니다.

제가 전에 올린 상속 관련 글들을 보신 분들이라면 아시겠지만,

Person type reference로 professor, student, gamer 인스턴스 모두를 가리킬 수 있습니다. (업 캐스팅)

 

소스코드를 보겠습니다.

public class Person {
    public void doSomething() {
        System.out.println("do something");
    }

    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Professor());
        persons.add(new Student());
        persons.add(new Gamer());

        persons.forEach(Person::doSomething);
    }
}

class Professor extends Person {
    @Override
    public void doSomething() {
        System.out.println("do research & teaching");
    }
}

class Student extends Person {
    @Override
    public void doSomething() {
        System.out.println("do studying");
    }
}

class Gamer extends Person {
    @Override
    public void doSomething() {
        System.out.println("do gaming");
    }
}

 

main 메서드에서 보면 Person type reference에 실질적으로 상속받은 인스턴스들을 넣음을 알 수 있습니다.

그리고 반복문을 통해 돌아가면서 doSomething() 메서드를 호출하고 있음을 볼 수 있습니다.

 

다음은 실행 결과를 보겠습니다.

 

실제 가리키는 레퍼런스는 Person형으로 통일되었으나, doSomething() 메서드를 호출했을 때

각자 오버 라이딩한 메서드가 호출되었음을 확인할 수 있습니다.

 

오버라이딩한 메서드가 호출된 이유는, 이전 글인 메서드 동적 바인딩에서 설명드렸으므로 참고하시면 됩니다.

이처럼 다양한 type의 인스턴스들을, 관리는 일관적으로 하면서도 실제 동작은 각각 다른 것.

이것이 객체지향에서 지향하는 다형성의 모습입니다.

 

이런 다형성을 잘 활용하면 코드를 많이 간단하게 줄일 수 있습니다.

위의 예시에서도 만약 다형성을 활용하지 않았다면

if 분기문을 사용하거나 하는 방법으로, 코드가 많이 길어졌을 것입니다.

 

오늘은 메서드 오버 라이딩을 통한 다형성에 대해서 알아보았습니다.

'Java' 카테고리의 다른 글

인터페이스  (0) 2021.05.11
추상 메서드와 추상 클래스  (0) 2021.05.11
(상속) 메서드 오버라이딩과 동적 바인딩  (0) 2021.05.07
(상속) 업캐스팅과 다운캐스팅  (0) 2021.05.07
(상속) 생성자 호출  (0) 2021.05.07