상속의 용어와 오버라이딩

물려받은 그대로는 맞지 않을 때, 자식 클래스는 무엇을 할 수 있을까?

부모와 자식의 이름

같은 것을 두 이름으로 부릅니다

물려주는 클래스를 부모 클래스(parent class) 또는 슈퍼클래스(superclass)라고 합니다. 물려받는 클래스는 서브클래스(subclass) 또는 파생 클래스(derived class)입니다.

이 강에서는 부모 클래스와 서브클래스라고 부르고, 서브클래스를 쉬운 말로 자식이라고도 하겠습니다.

메서드와 메시지

호출은 객체에게 보내는 메시지

객체에 대한 연산을 정의한 서브프로그램이 메서드(method)입니다. 메서드 호출은 객체에게 메시지(message)를 보내는 것이라고 말합니다. 한 객체의 메서드 전체가 메시지 프로토콜(message protocol)입니다.

서브프로그램은 함수처럼 이름을 붙여 부르는 코드 묶음입니다. c1.draw()는 예시 표기입니다.

오버라이딩

물려받은 메서드를 덮어씁니다

서브클래스는 물려받은 메서드를 새로 정의할 수 있습니다. 새 메서드가 물려받은 메서드를 대체하는 것이 오버라이딩(overriding)입니다. Circle 객체는 이제 원을 그리는 새 draw로 응답합니다.

대체당한 부모의 메서드를 오버라이딩된(overridden) 메서드라고 부릅니다.

서브클래스가 달라지는 세 가지

더하고, 고치고, 못 보고

서브클래스가 부모와 달라지는 길은 셋입니다. 변수나 메서드를 더하고, 물려받은 메서드를 고칩니다. 그리고 부모가 private으로 정의한 것은 서브클래스에서 보이지 않습니다.

private은 10강에서 본, 클래스 밖에서 못 쓰게 감추는 표시입니다. 멤버(member)는 클래스에 든 변수와 메서드입니다. id는 예시입니다.

상속과 접근 제어

감출 상대가 둘입니다

상속이 들어오면 감출 상대가 둘이 됩니다. 물려받는 서브클래스와, 클래스를 밖에서 가져다 쓰는 코드인 클라이언트(client)입니다. 클래스는 둘에게 서로 다른 권한을 줄 수 있습니다.

어느 멤버를 어떻게 감췄는지는 예시입니다.

변수의 두 종류

클래스에 하나, 객체마다 하나씩

클래스 변수(class variable)는 객체가 몇 개든 클래스에 하나만 있고 모든 객체가 함께 씁니다. 인스턴스 변수(instance variable)는 객체마다 따로 가집니다.

메서드도 클래스에 보낸 메시지를 처리하는 클래스 메서드와 객체에 보낸 메시지를 처리하는 인스턴스 메서드로 나뉩니다. 값은 예시입니다.

상속의 단점

부모를 고치면 자식이 흔들립니다

상속에도 치를 값이 있습니다. 재사용하려고 상속으로 이으면 클래스들이 서로 기대게 됩니다. 부모를 고치면 자식이 모두 영향을 받아 유지보수가 복잡해집니다.

유지보수는 내놓은 뒤 고치고 바꾸는 일입니다.

다음 편

같은 호출문이 객체에 따라 다른 메서드를 부릅니다

3편같은 호출이 왜 다르게 움직일까? 11강 목록