brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Apr 19. 2019

다형성과 동적 바인딩

다형성(Polymorphism)과 동적 바인딩


객체지향에는 크게 4개의 특징이 있다. 바로 추상화, 캡슐화, 상속, 다형성이다. 객체지향 언어인 자바도 예외일 수 없다. 자바에서 상속을 배우면 캡슐화와 다형성은 자연스럽게 이어서 배우게 될 것이다. 특히 다형성은 시험 문제나 면접 질문으로 종종 등장한다.


예를 들면 다음 코드의 결과를 말해보라는 형식이다.



class PolymorphismExam {

    public static void main(String[] args) {

        Person student = new Student();

        student.show();

    }

}

class Person {

    void show() {

        System.out.println("Person");

    }

}

class Student extends Person {

    void show() {

        System.out.println("Student");

    }

}



잘 모르겠다면 선택지를 제시할지도 모른다.



1) 컴파일 에러

2) Student

3) Person

4) Person

    Student

5) Student

    Person



그래도 답이 보이지 않는다면 계속해서 이 글을 읽으면 된다. 모른다고 걱정할 필요 없다 이제 알게 될 테니까.


일단 결과는 2번의 Student가 출력된다. 왜 그런지 살펴보자.


처음 student 객체를 생성할 때 다음과 같은 캐스팅이 생략되어 있다.


Person student = (Person) new Student();

student.show();


위 코드가 의미하는 바는 참조 변수 student는 Person 객체를 참조하고 있는 것이다. 그러면 Person이 출력되어야 하는 것이 맞는 것처럼 보인다. 반은 맞다. 왜냐하면 컴파일 시점에는 Person 객체의 show() 함수로 인지하기 때문이다.


그러나 실제 실행될 때는 동적 바인딩이 발생한다.


동적 바인딩은 런타임 시점에 객체 타입을 기준으로 실행될 함수를 호출하는 것을 의미한다. 즉, 실제 실행되는 시점에서는 Student 객체가 생성되어 해당 객체의 show() 함수를 호출하는 것이다. 따라서 최종적으로 실행 결과는 Student가 된다.


요약하면 다형성이 적용되었을 때 참조 변수 student는 컴파일 시점과 런타임 시점에서 참조하는 함수가 다른 것이다.

매거진의 이전글 자바 주요 변수의 특징
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari