Menu
Coddy logo textTech

생성자 프로모션 (8.0)

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

PHP 8.0은 클래스를 정의할 때 상용구 코드(boilerplate code)를 획기적으로 줄여주는 기능인 생성자 프로모션(constructor promotion)을 도입했습니다. 프로퍼티를 별도로 선언하고 생성자에서 할당하는 대신, 한 단계에서 두 작업을 모두 수행할 수 있습니다.

여러분이 사용해 온 전통적인 방식은 다음과 같습니다:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

생성자 프로모션(constructor promotion)을 사용하면, 생성자 매개변수에 직접 접근 제어자를 추가할 수 있습니다:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

$product = new Product("Laptop", 999.99);
echo $product->getInfo();

출력:

Laptop: $999.99

생성자 매개변수 앞에 private, protected 또는 public을 추가함으로써, PHP는 자동으로 속성을 생성하고 값을 할당합니다. 동일한 생성자 내에서 프로모션된 매개변수와 일반 매개변수를 혼합하여 사용할 수 있으며, 필요한 경우 생성자 본문 내에 로직을 여전히 추가할 수 있습니다.

핵심 포인트: 생성자 프로모션(Constructor promotion)은 반복적인 속성 선언과 할당을 제거하여, 완전한 캡슐화 제어를 유지하면서도 클래스를 더 깔끔하고 읽기 쉽게 만들어 줍니다.

challenge icon

챌린지

쉬움

생성자 프로모션(constructor promotion)의 우아함을 보여주는 연락처 관리 시스템을 구축해 보겠습니다. 상용구 코드(boilerplate code)를 제거하면서도 적절한 캡슐화를 유지하는 깔끔하고 현대적인 PHP 클래스를 만들게 됩니다.

코드는 두 개의 파일로 구성됩니다:

  • Contact.php — 생성자 서명에서 직접 모든 속성을 정의하기 위해 생성자 프로모션을 사용하는 Contact 클래스를 생성합니다. 연락처는 다음을 포함해야 합니다:
    • private $name 속성 (string)
    • private $email 속성 (string)
    • 기본값이 "Not provided"인 private $phone 속성 (string)
    생성자 프로모션 구문을 사용하세요 — 별도의 속성 선언은 필요하지 않습니다! "[name] | [email] | [phone]"를 반환하는 public 메서드 getFullDetails()를 추가하세요. 또한 "Contact: [name]"를 반환하는 getSummary() 메서드도 추가하세요.
  • main.php — Contact 파일을 포함합니다. 이름, 이메일, 전화번호의 세 가지 입력을 받게 됩니다. 두 개의 Contact 인스턴스를 생성하세요:
    • 첫 번째 연락처는 세 가지 값(이름, 이메일, 전화번호)을 모두 사용해야 합니다.
    • 두 번째 연락처는 이름과 이메일만 사용해야 합니다 (기본 전화번호 값에 의존).
    네 줄을 출력하세요:
    • 첫 번째 연락처의 전체 상세 정보 (full details)
    • 첫 번째 연락처의 요약 (summary)
    • 두 번째 연락처의 전체 상세 정보 (full details)
    • 두 번째 연락처의 요약 (summary)

생성자 프로모션을 통해 속성을 정의하고, 가시성을 설정하고, 타입을 선언하고, 값을 할당하는 이 모든 과정을 단일하고 가독성 있는 생성자 서명 내에서 어떻게 처리하는지 확인해 보세요. 기본값이 있는 선택적 phone 파라미터는 프로모션된 파라미터가 일반 파라미터와 마찬가지로 기본값과 원활하게 작동함을 보여줍니다.

치트 시트

PHP 8.0은 접근 제어자를 생성자 매개변수에 추가하여 클래스 속성을 직접 선언하고 초기화할 수 있는 생성자 홍보(constructor promotion) 기능을 도입했습니다.

기존 방식:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}

생성자 홍보를 사용한 방식:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}

$product = new Product("Laptop", 999.99);

생성자 매개변수 앞에 private, protected 또는 public을 추가하면 PHP가 자동으로 속성을 생성하고 값을 할당합니다.

홍보된 매개변수에 기본값을 사용할 수 있습니다:

<?php
class Contact {
    public function __construct(
        private string $name,
        private string $email,
        private string $phone = "Not provided"
    ) {}
}

생성자 홍보는 일반 매개변수와 혼합하여 사용할 수 있으며, 필요한 경우 생성자 본문 안에 로직을 여전히 추가할 수 있습니다.

직접 해보기

<?php

require_once 'Contact.php';

// 입력 읽기
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));

// TODO: 세 가지 값(이름, 이메일, 전화번호)을 모두 사용하여 첫 번째 연락처 생성

// TODO: 이름과 이메일만 사용하여 두 번째 연락처 생성 (기본 전화번호 사용)

// TODO: 첫 번째 연락처의 전체 상세 정보 출력

// TODO: 첫 번째 연락처의 요약 정보 출력

// TODO: 두 번째 연락처의 전체 상세 정보 출력

// TODO: 두 번째 연락처의 요약 정보 출력

?>
quiz icon실력 점검

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

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