트레이트 – 15.조합 트레이트

클래스가 트레이트를 조합할 수 있는 것처럼 다른 트레이트도 트레이트를 조합할 수 있습니다. 트레이트 정의에서 하나 이상의 트레이트를 조합함으로써, 다른 트레이트에 정의된 멤버의 일부 또는 전부를 사용할 수 있습니다.

트레이트 자체는 독자적으로 구성에 참여할 수 있지만, 트레이트는 상속 트리의 일부가 아닙니다. 즉, 트레이트를 상속할 수 없도록 함으로서, 트레이트와 클래스를 혼동하거나, 트레이트의 오용을 피할 수 있도록 하였습니다.

조합 트레이트의 스코프

앞 ‘코드 재사용 메커니즘’ 글에서 트레이트는 컴파일할 때, 복사·붙여넣기 메커니즘에 따라 클래스에 조합되기 때문에 컴파일한 후에는 트레이트의 존재가 사라진다고 했습니다. 이러한 메커니즘은 트레이트가 트레이트에 조합되는 조합 트레이트에서도 그대로 적용됩니다. 위 예제에서 컴파일은 아래와 같이 n, n+1, n+2 …  순서로 진행됩니다.

MyHelloWorld 클래스의 구성 및 컴파일 순서

컴파일 순서대로 복사·붙여넣기 메커니즘을 적용하면, 컴파일 n 단계가 끝나면 트레이트 Hello, World는 트레이트 HelloWorld에 조합된 후 스코프에서 사라집니다. 즉, 트레이트 HelloWorld에서 트레이트 Hello와 World 멤버에 접근할 수 없습니다. 의미상 소스 코드가 아래와 같이 수정되는 단계입니다.

이어서, 컴파일 n+1 단계가 끝나면 트레이트 HelloWorld는 클래스 MyHelloWorld에 조합된 후 스코프에서 사라집니다. 즉, 클래스 MyHelloWorld에서 트레이트 HelloWorld 멤버에 접근할 수 없습니다. 의미상 소스 코드가 아래와 같이 수정되는 단계입니다.

결국 컴파일 n+1 단계가 끝나면, 트레이트 Hello, World, HelloWorld는 소스상에서 제거되고 위의 예제 코드와 같이 클래스 MyHelloWorld 소스만 남게 됩니다. 이후 컴파일이 끝나면 이 소스를 가지고 객체가 생성되고($o = new MyHelloWorld()), $o->sayHello()와 $o->sayWorld()에 의해 ‘Hello ‘, ‘World!’가 출력됩니다.

답글 남기기