oo::copy — 객체와 클래스의 복사본 만들기

oo::copy — 객체와 클래스의 복사본 만들기

객체나 클래스가 이미 만들어져 있는데, 그와 같은 구성을 가진 독립적인 복사본이 필요할 때가 있어요. oo::copy는 기존 객체나 클래스를 그대로 복제해서 새 이름의 객체/클래스를 만들어 주는 명령입니다.

출처: oo::copy manual page

본문

oo::copy sourceObject ?targetObject? ?targetNamespace?*

oo::copy 명령은 객체나 클래스의 복사본을 만듭니다. 복사할 객체/클래스의 이름인 sourceObject와, 만들 객체/클래스의 이름인 targetObject(절대 정규화 이름이 아니면 현재 네임스페이스에 상대적으로 해석됨), 그리고 객체의 내부 상태(my 명령 등)를 담을 네임스페이스 이름인 targetNamespace를 받아요. targetNamespace는 반드시 존재하지 않는 네임스페이스를 가리켜야 합니다.

targetObjecttargetNamespace가 생략되거나 빈 문자열로 주어지면 새 이름이 선택돼요. 이름은 지정하지 않는 한 oo::classnew 메서드와 같은 알고리즘으로 선택됩니다.

복사된 객체는 원본 객체와 같은 클래스이며, 모든 객체별 메서드를 복사합니다. 클래스라면 그 클래스의 클래스 메서드도 모두 복사하지만, 인스턴스는 복사되지 않아요.

targetObject가 생성되고 모든 구성 정의(메서드, 필터, mixin 등)가 복사된 뒤, targetObject* 메서드가 호출됩니다. 이는 관련 변수 트레이스를 설치하는 등 생성된 객체를 맞춤 설정할 수 있게 하려는 것이에요. 주어지는 유일한 인자는 sourceObject입니다. 이 메서드(oo::object의) 기본 구현은 sourceObject 네임스페이스의 프로시저와 변수를 targetObject의 네임스페이스로 그냥 복사합니다. 이 메서드 호출이 성공 결과를 리턴하지 않으면(즉 오류나 다른 예외) targetObject는 삭제되고 오류가 리턴돼요.

oo::copy 명령의 결과는 새 객체나 클래스의 완전히 정규화된 이름입니다.

예시

객체를 만들고 복사한 뒤 원본을 수정하고, 복사본이 정말 복사본인지 보여줍니다.

oo::object create src
oo::objdefine src method msg {} {puts foo}
oo::copy src dst
oo::objdefine src method msg {} {puts bar}
src msg              → prints "bar"
dst msg              → prints "foo"

더 알아보기

  • oo::class, oo::define, oo::object — 객체/클래스 생성과 구성
  • 키워드: clone, copy, duplication, object