Menu
Coddy logo textTech

여러 Trait 사용하기

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 52번째.

단일 trait도 유용하지만, 진정한 힘은 하나의 클래스에서 여러 trait를 결합할 때 발휘됩니다. PHP에서는 필요한 만큼 많은 trait를 포함할 수 있으므로, 클래스에 여러 소스의 기능을 한 번에 제공할 수 있습니다.

여러 trait를 사용하려면 use 키워드 뒤에 쉼표로 구분하여 나열하기만 하면 됩니다:

<?php
trait Timestampable {
    public function getTimestamp(): string {
        return date('Y-m-d H:i:s');
    }
}

trait Identifiable {
    private string $id;
    
    public function generateId(): void {
        $this->id = uniqid('id_');
    }
    
    public function getId(): string {
        return $this->id;
    }
}

class Post {
    use Timestampable, Identifiable;
    
    public function __construct(public string $title) {
        $this->generateId();
    }
}

$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();

출력:

id_6789abc123 - 2024-01-15 10:30:00

이제 Post 클래스에는 두 trait의 메서드가 모두 포함되어 있습니다. 각 trait는 고유한 기능을 제공합니다. Timestampable은 시간 관련 메서드를 제공하고, Identifiable은 고유 ID를 처리합니다. 이 접근 방식은 각 trait가 단일 책임에 집중하도록 하여 코드를 더욱 모듈화하고 재사용하기 쉽게 만듭니다.

두 trait에 같은 이름의 methods가 있으면 어떻게 될까요? 다음 레슨에서 살펴볼 conflict 상황입니다.

challenge icon

챌린지

쉬움

제품에 가격 책정 및 재고 관리 기능을 모두 제공하도록 여러 트레이트를 결합하는 제품 관리 시스템을 만들어 보겠습니다. 각 트레이트는 하나의 책임을 담당하며, product class는 두 트레이트 모두로부터 기능을 얻게 됩니다.

코드를 세 개의 파일로 구성합니다:

  • Priceable.php: 가격 책정 기능을 처리하는 Priceable 트레이트를 Create합니다. 트레이트에는 다음이 있어야 합니다:
    • private property $price (float)
    • 가격을 저장하는 setPrice(float $price) method
    • 가격을 반환하는 getPrice() method
    • 가격을 소수점 이하 2자리로 "$[price]" 형식으로 반환하는 getFormattedPrice() method
  • Stockable.php: 재고를 관리하는 Stockable 트레이트를 Create합니다. 트레이트에는 다음이 있어야 합니다:
    • private property $stock (integer)
    • 재고 수량을 저장하는 setStock(int $quantity) method
    • current stock을 반환하는 getStock() method
    • stock이 0보다 크면 true, otherwise false를 반환하는 isInStock() method
  • main.php: 두 트레이트 파일을 모두 포함하고 PriceableStockable 트레이트를 모두 사용하는 Product class를 Create합니다. constructor promotion을 사용하여 public $name property를 정의합니다. constructor는 price와 stock quantity도 accept하고, 트레이트 methods를 사용하여 이를 설정해야 합니다.

    세 가지 입력을 받습니다: product name, price, stock quantity입니다. 이 값으로 product를 Create하고 다음 네 줄을 Print합니다:

    • product name
    • formatted price (getFormattedPrice() 사용)
    • stock quantity
    • 재고가 있으면 "Available", 그렇지 않으면 "Out of stock"

이 예제는 여러 트레이트가 함께 작동하는 방식을 보여 줍니다. Product class는 한 트레이트에서 pricing capabilities를, 다른 트레이트에서 inventory management를 얻으므로 각 concern을 깔끔하게 분리하면서도 모든 기능을 갖춘 product로 결합할 수 있습니다.

직접 해보기

<?php
require_once 'Priceable.php';
require_once 'Stockable.php';

// TODO: Priceable와 Stockable 트레이트를 모두 사용하는 Product 클래스를 생성하세요
// public $name 속성에 생성자 프로모션을 사용하세요
// 생성자는 name, price, stock을 받고, 트레이트 메서드를 사용하여 price와 stock을 설정해야 합니다

class Product {
    // TODO: 여기에 트레이트를 사용하세요

    // TODO: $name에 대한 생성자 프로모션으로 생성자를 구현하세요
    // 그리고 트레이트 메서드를 사용하여 price와 stock을 설정하세요
}

// 입력 읽기
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));

// TODO: 입력 값으로 Product 인스턴스를 생성하세요

// TODO: 제품 이름을 출력하세요
// TODO: getFormattedPrice()를 사용하여 형식화된 가격을 출력하세요
// TODO: 재고 수량을 출력하세요
// TODO: 재고가 있으면 "Available"을 출력하고, 없으면 "Out of stock"을 출력하세요
?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러