self — 메서드 호출 내부 관찰
self — 메서드 호출 내부 관찰
객체 지향 Tcl(TclOO)에서 메서드가 실행되는 동안, 지금 이 메서드가 어떻게 호출됐는지에 대한 정보를 얻고 싶을 때가 있어요. self는 바로 그런 목적을 위한 명령이에요. 메서드, 생성자, 소멸자 안에서만 사용할 수 있고, 현재 호출 체인에 관한 여러 가지 사실을 알려줘요.
출처: 문서
본문
문법
package require TclOO
self ?subcommand?
self 명령은 메서드 호출 문맥 안에서(즉 메서드, 생성자, 소멸자 본문 안에서)만 써야 해요. 메서드가 자신이 어떻게 호출됐는지에 대한 정보를 발견하는 데 사용돼요. subcommand 인자를 받아 어떤 종류의 정보를 원하는지 알려주는데, 생략하면 self object를 호출한 것과 같은 결과가 나와요.
서브커맨드
self call — 현재 호출 체인을 구현하는 데 사용된 메서드 구현들을 설명하는 두 요소 리스트를 반환해요. 첫 번째 요소는 현재 메서드에 대해 info object call이 보고하는 것과 같아요(다만 생성자와 소멸자 안에서도 유용한 값을 보고하는데, 그 이름들은 각각 <constructor>와 <destructor>로 보고돼요). 두 번째 요소는 첫 번째 요소의 리스트에 대한 인덱스로, 어떤 실제 구현이 현재 실행 중인지 나타내요(맨 처음 실행되는 구현은 항상 인덱스 0이에요).
self caller — 메서드가 다른 객체의 메서드 안에서 호출됐다면, 이 서브커맨드는 포함하는 객체와 메서드를 설명하는 세 요소 리스트를 반환해요. 첫 번째 요소는 메서드를 선언한 객체 또는 클래스를 설명하고, 두 번째 요소는 포함 메서드가 호출된 객체의 이름, 세 번째 요소는 메서드의 이름이에요(<constructor>/<destructor>로 생성자/소멸자를 나타내요).
self class — 현재 메서드가 정의된 클래스의 이름을 반환해요. next로 메서드 구현 체인을 따라가면서 이 값은 바뀌고, 메서드가 객체에 정의됐다면 이 호출은 실패할 거예요. 현재 객체의 클래스가 필요하면 이렇게 쓰면 돼요:
info object class [self object]
self filter — 필터 안에서 호출하면 필터를 설명하는 세 요소 리스트를 반환해요. 첫 요소는 필터를 선언한 객체 또는 클래스의 이름(필터 구현을 제공한 객체/클래스와 다를 수 있음), 둘째 요소는 선언 주체가 객체인지 클래스인지를 나타내는 object 또는 class, 셋째 요소는 필터의 이름이에요.
self method — 현재 메서드의 이름을 반환해요(<constructor>/<destructor>로 생성자/소멸자를 나타내요).
self namespace — 메서드가 호출된 객체의 고유 네임스페이스 이름을 반환해요.
self next — 호출 체인의 끝이 아닌 메서드(즉 next 명령이 실제 메서드 구현을 호출할 곳)에서 호출하면, 메서드 호출 체인의 다음 요소를 설명하는 두 요소 리스트를 반환해요. 첫 요소는 호출 체인의 다음 부분을 선언하는 클래스나 객체의 이름, 둘째 요소는 메서드의 이름이에요. 호출 체인의 끝에 있는 메서드에서 호출하면 빈 문자열을 반환해요.
self object — 메서드가 호출된 객체의 이름을 반환해요.
self target — 필터 구현 안에서 호출하면, 필터링되는 메서드를 설명하는 두 요소 리스트를 반환해요. 첫 요소는 메서드의 선언자 이름, 둘째 요소는 메서드의 실제 이름이에요.
예제
self의 기본 사용법으로 현재 객체에 대한 정보를 제공하는 예제예요:
oo::class create c {
method foo {} {
puts "this is the [self] object"
}
}
c create a
c create b
a foo → prints "this is the ::a object"
b foo → prints "this is the ::b object"
메서드 호출 체인이 어떻게 생겼는지, 그리고 체인을 따라가면서 인덱스가 어떻게 바뀌는지 보여주는 예제예요:
oo::class create c {
method x {} {
puts "Cls: [self call]"
}
}
c create a
oo::objdefine a {
method x {} {
puts "Obj: [self call]"
next
puts "Obj: [self call]"
}
}
a x → Obj: {{method x object method} {method x ::c method}} 0
→ Cls: {{method x object method} {method x ::c method}} 1
→ Obj: {{method x object method} {method x ::c method}} 0
더 알아보기
info: 인터프리터와 객체 정보next: 호출 체인의 다음 메서드 구현으로 진행