oo::copy — 객체와 클래스의 복사본 만들기
oo::copy — 객체와 클래스의 복사본 만들기
객체나 클래스가 이미 만들어져 있는데, 그와 같은 구성을 가진 독립적인 복사본이 필요할 때가 있어요. oo::copy는 기존 객체나 클래스를 그대로 복제해서 새 이름의 객체/클래스를 만들어 주는 명령입니다.
본문
oo::copy sourceObject ?targetObject? ?targetNamespace?*
oo::copy 명령은 객체나 클래스의 복사본을 만듭니다. 복사할 객체/클래스의 이름인 sourceObject와, 만들 객체/클래스의 이름인 targetObject(절대 정규화 이름이 아니면 현재 네임스페이스에 상대적으로 해석됨), 그리고 객체의 내부 상태(my 명령 등)를 담을 네임스페이스 이름인 targetNamespace를 받아요. targetNamespace는 반드시 존재하지 않는 네임스페이스를 가리켜야 합니다.
targetObject나 targetNamespace가 생략되거나 빈 문자열로 주어지면 새 이름이 선택돼요. 이름은 지정하지 않는 한 oo::class의 new 메서드와 같은 알고리즘으로 선택됩니다.
복사된 객체는 원본 객체와 같은 클래스이며, 모든 객체별 메서드를 복사합니다. 클래스라면 그 클래스의 클래스 메서드도 모두 복사하지만, 인스턴스는 복사되지 않아요.
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