Tcl의 오브젝트 지향 OTcl

admin의 아바타

http://otcl-tclcl.sourceforge.net/otcl/
ftp://ftp.tns.lcs.mit.edu/pub/otcl/README.html

OTcl은 MIT에서 개발된 Tcl의 오브젝트 지향 확장 패키지입니다.
유명한 ns2 네트워크 시뮬레이터에서 사용중이기도 합니다. 그럼 본론으로 들어갑니다. :)

클래스 정의

Class classname -superclass superclassname

superclassname은 슈퍼 클래스 이름을 나열한 리스트입니다. 예를 들어 클래스 SuperClass로 부터 클래스 SubClass를 파생한 경우는 아래와 같습니다.

package require OTcl
 
Class SuperClass
Class SubClass -superclass SuperClass

인스탄스의 생성과 소멸

다음은 생성 방법입니다.

classname instname
or
set refvar [new classname]

아래는 소멸 방법입니다.

delete instname
delete $refvar

인스탄스 메쏘드 정의

인스탄스의 메쏘드를 정의시 instproc 커맨드를 사용합니다.

MyClass instproc methodname {arg1 arg2...} {
        method body
}

인스탄스 메쏘드의 호출

인스탄스 메쏘드 호출 방법은 아래와 같습니다.

인스탄스 메쏘드이름 인자1 인자2 ...

MyClass instance
instance methodname These are args

혹은

set instref [new MyClass]
$instref methodname These are args

생성자, 소멸자 및 인스탄스 변수 정의

생성자와 소멸자를 정의시 initdestroy의 이름을 갖는 메쏘드로 정의 합니다.

package require OTcl
 
MyClass instproc init {args} {
    $self set [fieldname] [initialval] # 인스탄스 변수의 정의와 초기화
    eval $self next $args               # 슈퍼클래스의 생성자 호출
}

단, 부모의 생성자는 자동으로 호출 되지 않기 때문에, 아래와 같이 명시적으로 호출해줄 필요가 있습니다. 소멸자도 마찬가지 입니다.

eval $self next $args ;#인자가 있는 경우
eval $self next       ;#인자가 없는 경우

최상위 클래스(-superclass를 특별히 지정하지 않아도)라도, 소멸자로부터 부모 소멸자를 호출하지 않으면 안되는데, 오브젝트가 삭제되지 않고 메모리에 계속 남아있게 되기 때문입니다.

MyClass instproc destroy {} {
    body...
    eval $self next ;# 슈퍼클래스의 소멸자 호출
}

클래스의 상속에 따른 메쏘드의 오버로드

기본 클래스의 메쏘드와 같은 이름의 메쏘드를 파생 클래스로 재 정의하는 것 을 할수 있습니다. 기본 클래스의 메쏘드를 호출하는 경우는, 파생된 클래스 메쏘드 안에서

eval $self next [args]

를 사용합니다. 단, 메쏘드를 다중 정의를 하는것은 불가능합니다.

인스탄스 변수의 참조

메쏘드 내부에서 변수를 참조시에는 instvar 커맨드를 사용합니다. 또한 메쏘드 안에서 자신의 인스탄스 변수를 참조시는 특수한 변수 $self를 사용합니다.

package require OTcl
 
Class MyClass
 
MyClass instproc setField {val} {
    $self instvar m_field
    set m_field $val
    # $self set m_field $val 동일
}
 
MyClass instproc getField {} {
    $self instvar m_field
    return $m_field
    # return [$self set m_field] 동일
}

클래스의 밖에서 참조시 더욱 간단합니다.

package require OTcl
 
Class MyClass
 
set instance [new MyClass]
 
$instance set m_field 0               ;# set
set fieldVal [$instance set m_field]  ;# get

클래스 메쏘드 정의

클래스 메쏘드는 클래스 오브젝트에 직접 proc를 사용하여 정의합니다.

클래스 변수 정의

클래스 오브젝트의 인스탄스 변수로써 정의는 다음과 같이 합니다.

MyClass set s_classVar 0

클래스 변수의 참조

직접 참조시에는 다음과 같이 합니다.

set someVar [MyClass set s_classVar]

인스탄스 메쏘드 안에서 직접 참조하는 경우는, 현재 인스탄스의 클래스 오브젝를 가리키고 있는 특수한 변수 $class를 사용합니다.

package require OTcl
 
Class MyClass
 
MyClass instproc getClassVar {} {
    return [$class set s_classVar]
    # $class instvar s_classVar; return $s_classVar 동일
}
MyClass instproc setClassVar {val} {
    $class set s_classVar $val
    # $class instvar s_classVar; set s_classVar $val 동일
}

메타 데이타

오브젝트의 메타 데이타를 얻는것도 가능합니다.

class info commans
or
instance info command

MyClass의 모든 인스탄스 메쏘드를 리스트로 받는 방법은 다음과 같습니다.

MyClass info instprocs

오브젝트의 인스탄스 변수를 리스트로 받는 방법은 다음과 같습니다.

MyClass a
a info vars