R's Hacking Daily Log

php 객체 지향 프로그램 (5) 본문

PHP

php 객체 지향 프로그램 (5)

hanhxx 2023. 7. 18. 23:10

Step :: Trait 

Trait이라는 기능은 앞에서 배운 클래스와 인터페이스 그 사이 어딘가...!

추상 클래스인 듯 아닌 듯 한 애매한 기능이다. 

 

다중 상속의 문제점을 줄이고 공통적으로 사용하는 메서드 & 멤버 변수를 재사용하기 위해 

설계된 기능이다 보니 "클래스, 인터페이스와 뭐가 다르지?"라는 애매모호함을 느낄 것이다. 

 

 

인터페이스와는 달리 함수의 내용을 정의 & 구현을 할 수 있지만 

인터페이스처럼 함수를 정의만 해둘 수도 있다.

 

추상 클래스처럼 비추상 메서드 & 추상 메서드를 포함할 수도 있고 추상 메서드만 정의할 수도 있다. 

말 그대로 이 기능 저 기능을 가져다가 입맛대로 쓸 수 있는 기능이라 보면 된다. 

 

어떻게 활용할 수 있을 지 이해를 돕기 위해 코드를 살펴보도록 하자. 

<?php

trait Sound {
    abstract public function sound();

    public function introduce() {
        echo "{$this->type} {$this->name} 출발합니다.<br/>";
    }
}

클래스와 동일하게 trait keyword를 사용하면 trait를 생성할 수 있다. 

 

trait Sound는 추상 메서드인 sound() & 비추상메서드인 introduce()를 포함하고 있다.

이처럼 trait는 추상클래스가 아님에도 불구하고 추상 메서드를 포함하는 게 가능하다. 

 

 

class Train {
    public string $type;
    public string $name;

    use Sound;

    public function sound() {
        echo "뿌-뿌-<br/>";
    }
}

class Bus {
    public string $type;
    public string $name;

    use Sound;

    public function sound() {
        echo "빵빵~<br/>";
    }
}

다음으로 클래스 Train & Bus를 생성한다. 

각 클래스는 멤버 변수 type & name을 갖고 있으며 trait를 선언했기 때문에 sound()를 구현할 수 있다. 

 

trait는 공통적으로 사용되는 부분을 정의 OR 구현해놓고 클래스에서 가져다 쓰는 느낌으로 활용된다. 

trait를 사용하고 싶을 때는 [ use keyword + Trait_NAME ] 형식으로 작성하면 끝!

 

trait에서 함수 sound를 추상 메서드로 정의해놨기 때문에 각 클래스에서 trait를 선언 후 

클래스에 알맞게 함수 내용을 구현하고 있는 걸 볼 수 있다. 

 

 

$train = new Train();
$train->type = "train";
$train->name = "H11";
$train->sound();
$train->introduce();

$bus = new Bus();
$bus->type = "bus";
$bus->name = "8301";
$bus->sound();
$bus->introduce();

Train & Bus class의 객체를 만들어주고 멤버 변수 값을 할당한다.

객체 train & bus의 sound 함수를 호출하면 위에서 구현한 대로 경적 소리가 출력될 것이다.

 

introduce 함수 같은 경우는 this를 활용해 객체의 type & name을 반영한 문구가 출력되는 데

trait를 가져와서 사용했기 때문에 클래스 내에서 작성하지 않아도 문제없이 실행된다.

 

상속받은 경우 부모 클래스의 함수를 자유롭게 호출할 수 있는 원리와 같다고 볼 수 있다. 

 

 

결과를 보면 train 객체의 문구가 출력되고 bus 객체의 문구가 출력된 걸 볼 수 있다.

 

 

살펴본 바와 같이 trait는

이미 구현된 함수를 상속받듯이, 인터페이스에 정의해 둔 함수를 작성하듯이,

추상 클래스가 가질 만한 추상 메서드를 정의하듯이 이리저리 사용할 수 있는 기능이라 할 수 있다! 

'PHP' 카테고리의 다른 글

php 예외 처리  (0) 2023.07.19
php 객체 지향 프로그램 (6)  (0) 2023.07.18
php 객체 지향 프로그램 (4)  (0) 2023.07.16
php 객체 지향 프로그램 (3)  (0) 2023.07.13
php 객체 지향 프로그램 (2)  (0) 2023.07.12
Comments