순수 객체지향 언어

숫자 3까지 객체인 언어에서는 3 + 4를 어떻게 계산할까?

객체의 배타성

객체만 둘까, 섞어 둘까

객체의 배타성(exclusivity of objects)은 언어가 모든 것을 객체로만 다루는지의 문제입니다. 전부 객체면 일관되지만 느리고, 객체가 아닌 타입을 섞으면 빠르지만 복잡해집니다.

타입 시스템은 값의 타입을 정하고 관리하는 규칙 체계입니다. 띠의 길이는 뜻만 나타냅니다.

스몰토크

계산도 메시지로 합니다

스몰토크(Smalltalk)는 순수 객체지향 언어입니다. 모든 데이터가 객체이고 모든 연산이 메시지입니다. 대입문(변수에 값을 넣는 문장) 같은 명령형 구조가 따로 없고, 물려받은 것을 감출 수도 없습니다.

모든 객체는 힙(필요할 때 받아 쓰는 칸)에 놓이고, 해제는 언어가 알아서 합니다.

스몰토크의 동적 바인딩

메서드를 위로 올라가며 찾습니다

스몰토크는 메시지를 받은 객체의 클래스에서 메서드를 찾고, 없으면 슈퍼클래스(부모 클래스)로 올라가 찾습니다. 맨 위까지 가도 없을 때만 타입 오류가 납니다.

타입 오류는 그 타입이 할 수 없는 일을 시켰다는 오류입니다. 타입 검사도 실행 중에만 합니다. spin은 예시입니다.

루비

클래스를 실행 중에 고칩니다

루비(Ruby)도 모든 것이 객체인 순수 객체지향 언어입니다. 루비에서는 클래스 정의 자체가 실행되는 코드입니다. 그래서 이미 정의된 클래스에 실행 중에 멤버를 더할 수 있습니다.

예시 코드입니다. def는 메서드를 정의한다는 뜻이고 end로 닫습니다. 컴파일은 실행 전에 소스를 기계어로 번역하는 일입니다.

루비의 접근 제어

데이터는 모두 감추고, 메서드만 고릅니다

루비에서 데이터는 모두 private이라 밖에서 직접 바꿀 수 없습니다. 메서드는 public, private, protected 가운데 하나로 정하고, 접근해도 되는지는 실행 중에 검사합니다.

데이터를 읽어 주는 메서드가 게터(getter), 바꿔 주는 메서드가 세터(setter)입니다. 루비는 둘을 짧은 문법으로 정의합니다.

두 언어를 견주면

감출 수 있느냐가 가릅니다

스몰토크는 물려받은 것을 감출 수 없어, 부모에게 하던 호출이 자식에게도 모두 통합니다. 루비는 부모가 공개한 메서드를 자식이 감출 수 있어, 서브클래스가 꼭 서브타입은 아닙니다.

서브타입은 4편에서 본, 부모 자리에 그대로 쓸 수 있는 서브클래스입니다.

다음 편

전부 실행 중에 정하면 느립니다. C++는 어떻게 했을까요?

6편C++는 무엇을 프로그래머에게 맡겼을까? 11강 목록