oo::object — 클래스 계층의 루트 클래스
oo::object — 클래스 계층의 루트 클래스
TclOO의 모든 객체는 결국 하나의 공통 조상에서 와요. 그것이 바로 oo::object예요. 클래스도 결국 객체이기 때문에, 모든 클래스도 oo::object의 인스턴스라는 점이 재미있답니다.
본문
package require TclOO
oo::object method ?arg ...?
클래스 계층
oo::object
설명
oo::object 클래스는 객체 계층의 루트 클래스예요. 모든 객체는 이 클래스의 인스턴스예요. 클래스는 그 자체가 객체이므로, 그것들도 이 클래스의 인스턴스예요. 객체는 항상 이름으로 참조되며, 정체성(identity)을 유지하면서 이름을 바꿀 수 있어요.
객체의 인스턴스는 oo::object 객체 자체의 create나 new 메서드로 만들 수도 있고, 그 메서드를 서브클래스 객체 중 어느 것에서 호출해서 만들 수도 있어요. 자세한 내용은 oo::class를 참고해요. 개별 객체의 구성(즉 인스턴스 전용 메서드, 믹스인 클래스 등)은 oo::objdefine 명령으로 제어할 수 있어요.
각 객체에는 고유한 네임스페이스(인스턴스 네임스페이스)가 연관되어 있어요. 이 네임스페이스는 객체의 모든 인스턴스 변수를 담고, 객체의 메서드(객체 클래스의 메서드 포함)가 호출될 때마다 현재 네임스페이스가 돼요. 객체가 파괴되면 그 인스턴스 네임스페이스도 삭제돼요. 인스턴스 네임스페이스에는 객체의 my 명령이 들어 있는데, 객체의 비공개(non-exported) 메서드를 호출하거나, 객체의 이름 변경을 가로질러 지속되는 호출용 객체 참조를 만들 때 사용할 수 있어요.
생성자 / 소멸자
oo::object 클래스는 명시적인 생성자나 소멸자를 정의하지 않아요.
공개 메서드
oo::object 클래스는 다음 공개 메서드를 지원해요.
obj destroy
이 메서드는 호출된 객체 obj를 파괴하고, 과정에서 객체 클래스의 소멸자를 호출해요. rename으로 객체 명령을 삭제하는 것과 동등해요. 이 메서드의 결과는 항상 빈 문자열이에요.
비공개 메서드
oo::object 클래스는 다음 비공개 메서드를 지원해요.
obj eval ?arg ...?
이 메서드는 인수 arg들을 concat과 같이 이어 붙인 다음, 결과 스크립트를 obj에 고유하게 연관된 네임스페이스에서 평가하고, 평가 결과를 돌려줘요.
이 컨텍스트에서는 my나 self 같은 객체 내부 명령도 호출할 수 있다는 점을 기억해 두세요.
obj unknown ?methodName? ?arg ...?
이 메서드는 object obj에 대해 메서드 methodName을 호출하려는 시도가 실패했을 때 호출돼요. 사용자가 메서드에 제공한 인수는 arg 인수로 주어져요. methodName이 없으면, 객체가 메서드 이름 없이(또는 다른 인수 없이) 호출된 경우예요.
기본 구현(즉 oo::object 클래스가 정의한 것)은 객체가 공개된 이름으로 호출되었는지, my 명령을 통해서인지에 따라, 객체가 지원하는 메서드를 상세히 설명하는 적절한 오류를 생성해요.
obj variable ?varName ...?
이 메서드는 각각 varName이라는 변수가 객체 obj의 고유 네임스페이스에서 호출자의 컨텍스트로 연결되도록 준비해요. 즉, 프로시저 안에서 호출되면 그 객체의 네임스페이스 변수가 프로시저의 지역 변수와 연결돼요. 각 varName 인수에는 네임스페이스 구분자가 있으면 안 돼요. 결과는 빈 문자열이에요.
obj varname varName
이 메서드는 객체 obj의 고유 네임스페이스에 있는 변수 varName의 전역 한정 이름을 돌려줘요.
obj <cloned> sourceObjectName
이 메서드는 oo::object 명령이 한 객체의 상태를 다른 객체로 복사할 때 사용해요. 소스 객체(sourceObjectName)의 네임스페이스의 프로시저와 변수를 현재 객체로 복사하는 역할을 해요. 다른 유형의 명령이나 변수의 트레이스는 복사하지 않아요. 필요한 경우 서브클래스에서 이 메서드를 오버라이드해 추가할 수 있어요.
예제
객체의 기본 사용을 보여주는 예시예요.
set obj [oo::object new]
$obj foo → error "unknown method foo"
oo::objdefine $obj method foo {} {
my variable count
puts "bar[incr count]"
}
$obj foo → prints "bar1"
$obj foo → prints "bar2"
$obj variable count → error "unknown method variable"
$obj destroy
$obj foo → error "unknown command obj"
더 알아보기
my— 현재 객체의 메서드를 호출해요oo::class— 클래스 정의와 생성