동적 바인딩

s.draw() 한 줄이 어떤 때는 원을, 어떤 때는 사각형을 그립니다. 어떻게 그럴까?

다형 변수

변수 하나가 자손의 객체까지

다형 변수(polymorphic variable)는 한 클래스의 타입으로 선언되지만, 그 클래스의 객체뿐 아니라 모든 자손 클래스의 객체도 가리킬 수 있는 변수입니다.

자손 클래스는 상속으로 이어진 아래쪽 클래스들입니다. 원은 도형의 한 종류이니 도형 자리에 올 수 있습니다.

어느 draw일까

draw는 셋, 호출문은 하나

Circle과 Rectangle이 draw를 오버라이딩(덮어쓰기)했다면 draw는 셋입니다. 호출문을 이 가운데 하나에 이어야 합니다. 4강에서 본 대로 이렇게 잇는 일이 바인딩(binding)입니다.

정적 바인딩

변수의 타입만 보고 미리 정하면

정적 바인딩은 컴파일러가 실행 전에 변수의 타입만 보고 메서드를 정합니다. s의 타입이 Shape이니 Shape의 draw에 이어집니다. s가 원을 가리켜도 원을 그리는 draw는 불리지 않습니다.

컴파일러는 소스를 기계어로 번역하는 프로그램입니다.

동적 바인딩

가리키는 객체를 보고 실행 중에

다형 변수로 오버라이딩된 메서드를 부르면, 어느 클래스의 메서드를 실행할지를 실행 중에 정합니다. 이것이 메서드 호출의 동적 바인딩(dynamic binding)입니다.

나란히 보면

무엇을 보고, 언제 정하는가

두 방식은 무엇을 보느냐와 언제 정하느냐가 다릅니다. 정적 바인딩은 변수의 타입을 보고 실행 전에, 동적 바인딩은 가리키는 객체를 보고 실행 중에 정합니다.

4강의 그림처럼 실행 전은 노랑, 실행 중은 청록으로 그렸습니다.

동적 바인딩이 주는 것

새 클래스를 더해도 호출문은 그대로

동적 바인딩이 있으면 호출문은 도형이 무엇인지 몰라도 됩니다. 새 서브클래스를 더해도 호출하는 코드는 고치지 않습니다. 그래서 소프트웨어를 넓혀 가기가 쉬워집니다.

예시 코드입니다. 목록 shapes에 든 도형을 하나씩 s로 꺼내 draw를 부릅니다. Triangle(삼각형)도 예시입니다.

추상 메서드와 추상 클래스

몸체 없이 이름만 둔 메서드

'도형'만으로는 무엇을 그릴지 정할 수 없어, draw는 몸체(메서드 안의 실행 코드) 없이 이름과 형태만 둡니다. 이것이 추상 메서드(abstract method)이고, 이를 가진 클래스가 추상 클래스(abstract class)입니다.

추상 클래스는 몸체 없는 메서드가 있어서 객체를 만들 수 없습니다. 교재의 Shape가 그렇고, 이 강의 다른 그림은 draw에 몸체를 둡니다.

다음 편

상속과 객체를 두고 언어가 정해야 할 것들

4편언어 설계자는 무엇을 정해야 할까? 11강 목록