SqueakByExample:5.5

From 흡혈양파의 번역工房
Jump to: navigation, search

모든 동작은 메시지를 보낼 때 일어난다

이 규칙은 스몰토크 프로그래밍의 핵심이라 할 수 있습니다.

절차적 프로그래밍에서는, 호출자가 프로시저를 호출할 때 코드 일부를 선택합니다. 그리고 호출자는 이름을 이용해서 실행할 프로시저 또는 함수를 선택하죠.

객체지향 프로그래밍에서, 우리는 "메서드 호출"을 하지 않고, "메시지 전송"을 사용합니다. 이러한 용어의 선택은 중요합니다. 객체 지향 프로그래밍에서 각각의 객체는 그 자신이 각각 책임을 가집니다. 프로시저를 사용해서 객체에서 할일을 지시하지 않죠. 대신, 메시지를 보내어 어떤 일을 해달라고 정중하게 요청합니다. 메시지는 코드의 일부가 아닙니다: 단지 이름이고 인수의 목록일 뿐 입니다. 수신자는 요청받은 메시지의 내용에 따라 자신 스스로에게서 메서드를 선택하고 어떻게 응답할지를 결정합니다[1]. 각각의 객체가 동일한 메시지에 응답하기 위해 각자 메서드를 가지고 있기 때문에, 메세지를 받는 시점에서 메서드는 동적으로 선택됩니다.


3+4 ⇒ 7 "integer 3 에 인자 4 와 함께 메시지 + 를 보낸다"
(1@2) + 4 ⇒ 5@6 "point (1@2) 에 인자 4 와 함께 메시지 + 를 보낸다"


결국, 메시지는 다양한 객체로 보낼 수 있으며 각각의 객체는 메세지에 응답하는 각각의 메서드를 가지게 됩니다. 우리는 + 4 메시지에 응답하는 방법인, Smallinteger 3 또는 Point 1@2 를 별도로 취급하지 않습니다. 각 클래스들은, +를 사용할 자체 메서드를 갖고 있으며, 그 메서드를 사용하여 + 4 라는 메시지에 응답합니다.

메시지 보내기를 기초로한 스몰토크 모델의 결과로서 스몰토크는, 너무나 많은 일을 해야하는 절차적인 메서드보다는, 다른 객체에 작업을 넘기거나 작은 크기의 여러 메서드를 가지는 객체를 권장합니다.

Joseph Pelrine는 이 원리를 다음과 같이 간결하게 표현하였습니다:


다른 녀석에게 맏길 수 있는 일을 일부러 하지 마세요[1]


수많은 객체 지향 언어에서는 객체에 대한 정적 및 동적 연산을 제공하지만, 스몰토크에서는 동적 메시지 전송만 존재합니다. 정적 클래스 연산이 없는 대신,인스턴스, 클래스, 객체는 클래스에 메세지를 보내는 방법을 사용할 수 있습니다.

스몰토크에서 거의 모든 작업은 메시지 전송으로 이루어집니다. 하지만 몇가지 일부동작은 반드시 필요합니다:

  • 변수 선언은 메시지 전송이 아닙니다. 사실, 변수 선언은 실행되는 요소도 아닙니다. 변수를 선언하면 단지 객체 참조에 사용할 공간을 할당하는 일만 일어날 뿐입니다.
  • 할당은 메시지 전송이 아닙니다. 변수 할당은 변수를 선언한 범위내에서 "변수가 존재하도록" 하는 작업입니다.
  • 반환은 메시지 전송이 아닙니다. 계산된 결과를 간단하게 송신자로 반환하는 작업입니다.
  • 프리미티브는 메시지 전송이 아닙니다. 프리미티브는 가상머신에서 실행됩니다.

위의 몇 가지 예외를 제외하고, 거의 모든 작업은 메시지 전송으로 이루어집니다. 특별히,스몰토크의 클래스에서는 에서는 "공용 필드(public영역)"가 존재하지 않기 때문에, 다른 객체의 인스턴스 변수를 업데이트 하는 방법은, 객체에 메시지를 보내어 객체 내부의 필드를 업데이트하도록 메시지를 보내는것 외에는 없습니다. 물론, 객체의 모든 인스턴스 변수를 위해 setter와 getter 메서드를 제공하는 것은 좋은 객체지향 방식이 아닙니다. Joseph Perlrine은 이 내용을 매우 훌륭하게 표현했습니다.


누구도 당신의 데이터를 함부로 손대지 못하게 하십시오.


Notes

  1. 1.0 1.1 이부분의 내용을 참고 Cite error: Invalid <ref> tag; name ".EC.97.AD.EC.9E.90.EC.A3.BC1" defined multiple times with different content