4874777369_9df6288e24_z

php 5.4 부터 남몰래 trait 라는 묘한 기능이 생겼습니다.
그리고 이 trait 라는 기능은 php7 이 나오면서 더욱 활용성을 높였다는 기사도 나왔습니다.

흐음. 뭐지? 뭐길래?

미루고 미루던 트레이딩을 간만에 시작했습니다.

trait 라는 기능은 [상속없이 클래스 멤버에 추가] 라는 기능이 있습니다.

… What?!

이거 하나만으로도 객체 지향 에서는 센세이션입니다.

어째서?

객체 = class 라는 녀석은 전면적으로 ‘상속’ 을 전제로 사용됩니다.
물론 상속을 하지 않아도 사용되지만, 상속은 기본중에 기본입니다.

하지만 상속 이라는 기능은 분명 객체 지향을 대변하는 3속성 중 하나이지만, 잘못 쓰면 독이 됩니다.

애초에 100줄도 안되는 코드를 짤것이 아니면 상속이 복잡해 질 이유가 없습니다만, 상속은 하면 할 수록 복잡해집니다.

거기에 상속은 기본은 1:1 이 보통입니다. [다중 상속이 되는 쪽이 오히려 이상한 거다! 그런거시다!]

특히 JAVA에서는 다중 상속을 금지하고 돌려서 사용하는 수단을 사용 했지요.

이걸 말로 표현 해보면 이러합니다.

A 가 있어.
근데 B는 A를 닮게 만들었어. 그리고 B는 A보다 10cm 더 키가 크지.
그런데 C는 B를 닮았는데 5cm가 작아.
아참 E는 A를 본따 만들었는데 생긴건 전혀 달라.
그래서 F는 E와 C를 닮게 만들었지.

하여, Z는 F와 R을 합쳐서 만들어보니 전혀 이상해서. 다시 A를 수정 하기고 검토를…

계속 내려 가다보면 어디선가 꼬이는 것이다. 그런것이다. [생각 없는 상속의 문제]

즉 객체라는 것은 하나의 원본이 되는 속성을 물려 받아 오는 기능 인데, 이걸 서로 섞어서 받아오면 문제가 발생 합니다.
그리고 부모 상속 자식 상속으로 나뉘어서 위계질서(?)가 있어요.

아 서론이 길었네요.

그럼 trait 이거 뭐하는 애인지 밝혀 보죠.

설명은 이리 나와있습니다.

트레이트는 단일상속의 몇가지 한계를 줄이기 위해 고안되었습니다

트레이트는 기존의 상속을 확장하고, 수평적으로 동작을 내재화 할수 있도록 합니다.

가장 핵심이 되는 2줄 입니다.

수평적 동작. 이게 정답입니다.

상속. 즉 상위에서 하위로 내려가면서 되물림을 하는게 상속의 한계입니다.

trait 는 수평적으로 속성을 땡겨옵니다.

상속이 아닙니다. 땡겨 온다는 말이 더 정확해 보입니다.


trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}

}

class MyHelloWorld {
use Hello;
public function getWorld() {
return $this->world;
}
}

$obj = new MyHelloWorld();
echo $obj->sayHelloWorld();
//출력 hello

가장 간단한 사용법입니다.

MyHelloWorld 라는 클래스는 extends 이라는 상속을 받지 않고
use 를 사용하여 네임스페이스를 통해 Hello 에 접근 한 것입니다.

이걸 기존에 그냥 상속받는 코드로 바꾸면 이렇습니다.


class Hello {
....
}

class MyHelloWorld extends Hello {
....
}

윅? 그럼 그냥 평소대로 쓰면 안되나요?
잠시 멘붕 옴.

설명에도 나와있듯이 더 쉽게 사용하기 위해 수평적인 trait 가 등장 한겁니다.

활용 예시를 들자면 trait 는 수평적인 접근을 하기에, 어디든 달라 붙을수 있는 공용 class 라고 보시는게 맞습니다.

있을 겁니다. 있을 거에요.
대략 80%는 common 이라는 class를 기본으로 상속 받아서 쓰고 싶지만, 이러기 위해서는 매번 extends 를 받거나 다중 상속이 될 경우 implements 를 써야만 했던 불편했던 일이!

수평적 상속이 되는 객체.
어디든 use 키워드 하나로 쉽게 접근 가능한 독특한 객체.

적극적으로 사용해보면 기존에 없던 새로운 개념의 디자인 패턴이 등장 할것 같군요.

상속하지 마세요 trait 하세요!

답글 남기기