본문으로 바로가기

TclOO는 Tc 오브젝트 지향 프로그래밍을 위한 확장 패키지 입니다. Incr Tcl 이나 XOTcl 등, Tcl에서 오브젝트 지향 프로그래밍을 위한 계속적인 시도가 있었지만, Tcl 코어에는 받아들여지지 않았습니다. Tcl/Tk 최초 작성자인 John Ousterhout 박사는 Tcl에서의 오브젝트 지향 도입을 달가워하지 않았고, 또한 Incr Tcl을 코어에 도입하기 위한 TIP #6: Include [Incr Tcl] in the Core Tcl distribution 이 반대표들로 무산되기도 했습니다. 이때는 오브젝트 지향 도입을 달가워하지 않았고, 시대의 흐름상 어쩔수 없이 도입을 해야 한다면, 확장 패키지 형태로 사용자들에게 여러 오브젝트 지향 확장패키지 사용의 선택권을 주고 싶었는지도 모릅니다. 그러나 Tcl 고유의 오브젝트 지향 시스템 도입에 대한 의견은 끊임없이 이어져왔습니다. 마침내 TIP #257: Object Orientation for Tcl 이 2008년 5월 30일에 TCT 멤버들의 투표로 채용이 되었습니다. 이 팁이 최초 등록된것은 2005년 9월 26일이므로 3년가까이 채결된것입니다. 어쨌든 Tcl8.6a1 부터 TclOO 오브젝트 지향 시스템이 Tcl 코어에 등록이되는 최초의 버전이 되었습니다. 아래는 TclOO에 대해 정리를 해보았습니다. 현재 TclOO는 0.6 버전까지 개선되었으며, 최신의 Tcl8.6b1 버전에 포함되어 있습니다.

oo::object 커맨드

oo::object method ? arg ...? : oo::object는 오브젝트 계층의 루트 클래스

명령 설명
constructor 생성자
destructor 소멸자
obj destroy 오브젝트 삭제
obj eval ? arg ...? obj 고유의 네임스페이스의 스크립트로서 수행한다.
obj unknown methodName ? arg ...? 메쏘드 methodName을 수행하고, 실패시 자동 호출된다.
obj variable varName ? varName ...? obj 오브젝트 내에서 사용 가능한 변수를 선언한다.
obj varname varName 글로벌 변수명으로 돌려준다.

 

위 설명의 예제입니다.

oo::class create summation {
        constructor {} {
                my variable v
                set v -1
                my eval { set v 0 }

                puts "변수 v의 초기값은 $v 입니다."
                puts "글로벌 변수 [my varname v] 로 엑세스 가능합니다."
        }

        method add x {
                my variable v
                incr v $x
                puts "변수 v에 $x 을 더합니다."
        }

        method value {} {
                my variable v
                return "변수 v의 값은 $v 입니다."
        }

        method unknown args {
                puts "알수 없는 메쏘드 $args 입니다."
        }

        destructor {
                my variable v
                puts "마지막 값은 $v 입니다."
        }
}

set sum [summation new]
$sum oops
$sum add 10
puts [$sum value]
$sum add 20
puts [$sum value]
$sum destroy

oo:define, oo:objdefine 커맨드

명령 설명
oo::define class defScript oo::define 커맨드는 클래스의 설정시, oo::objdefine 커맨드는 오브젝트의 설정시 사용된다.
oo::define class subcommand arg ? arg ...?
oo::objdefine object defScript
oo::objdefine object subcommand arg ? arg ...?

oo::define 의 서브 커맨드

명령 설명
constructor argList bodyScript 클래스의 생성자를 생성하거나 엡데이트를 한다. 생성자에서 상위 클래스의 생성자를 호출하는 경우는 next 커맨드를 사용한다.
deletemethod name ? name ...? 클래스에서 name 메소드를 삭제한다.
destructor bodyScript 클래스의 소멸자를 생성하거나 엡데이트를 한다. 생성자에서 상위 클래스의 소멸자를 호출하는 경우는 next 커맨드를 사용한다.
export name ? name ...? 클래스의 메소드 name을 export한다.
filter ? methodName ...?  
forward name cmdName ? arg ...?  
method name argList bodyScript  
mixin ? className ...?  
renamemethod fromName toName  
self subcommand arg ...
self script
 
superclass className ? className ...?  
unexport name ? name ...?  

oo::objdefine 의 서브 커맨드

명령 설명
class className  
deletemethod name? name ...  
export name? name ...?  
filter? methodName ...?  
forward name cmdName? arg ...?  
method name argList bodyScript  
mixin? className ...?  
renamemethod fromName toName  
unexport name? name ...?  

class 커맨드

...

my 커맨드

...

next 커맨드

...

self 커맨드

... 계속...