Menu
Coddy logo textTech

매직 메서드 소개

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

매직 메서드(Magic methods)는 PHP의 특수 메서드로, 이중 밑줄(__)로 시작하며 특정 이벤트나 동작에 반응하여 PHP에 의해 자동으로 호출됩니다. 여러분은 이미 그중 두 가지인 __construct()__destruct()를 사용해 보았습니다.

이 메서드들을 사용하면 PHP의 내부 동작에 연결하여 객체가 일반적인 작업에 반응하는 방식을 사용자 정의할 수 있습니다.

예를 들어, 객체를 출력하려고 하면 어떤 일이 일어날까요? 또는 존재하지 않는 속성에 접근하면 어떻게 될까요? 매직 메서드(Magic methods)는 이러한 상황을 제어할 수 있게 해줍니다.

가장 자주 사용되는 매직 메서드들을 간략하게 살펴보겠습니다:

메서드트리거 시점
__construct()객체가 생성될 때
__destruct()객체가 소멸될 때
__toString()객체가 문자열로 사용될 때
__get()정의되지 않은 속성에 접근할 때
__set()정의되지 않은 속성을 설정할 때
__call()정의되지 않은 메서드를 호출할 때
__clone()객체가 복제될 때
<?php
class Book {
    public function __construct(
        private string $title
    ) {}
    
    public function __toString(): string {
        return "Book: " . $this->title;
    }
}

$book = new Book("PHP Mastery");
echo $book;

출력:

Book: PHP Mastery

__toString()이 없으면, 객체를 echo하려고 할 때 오류가 발생합니다. 이 매직 메서드는 이 동작을 가로채서 대신 문자열 표현을 반환합니다. 이어지는 강의에서 각 매직 메서드에 대해 자세히 살펴보겠습니다.

challenge icon

챌린지

쉬움

매직 메서드를 소개하는 영화 카탈로그 시스템을 만들어 보겠습니다. 영화 데이터를 초기화하기 위해 __construct()를 사용하고, 객체가 출력될 때 깔끔한 문자열 표현을 제공하기 위해 __toString()을 사용하는 Movie 클래스를 만들게 됩니다.

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

  • Movie.php — 카탈로그의 영화를 나타내는 Movie 클래스를 생성합니다. 생성자 프로모션(constructor promotion)을 사용하여 $title (string), $director (string), $year (integer)에 대한 private 속성을 정의하세요. "[title] ([year]) - Directed by [director]" 형식의 문자열을 반환하도록 __toString() 매직 메서드를 구현하세요. 이를 통해 별도의 메서드를 호출하지 않고도 영화 객체를 직접 echo할 수 있습니다.
  • main.php — Movie 파일을 포함합니다. 영화 제목, 감독 이름, 개봉 연도의 세 가지 입력을 받게 됩니다. 이 값들을 사용하여 Movie 인스턴스를 생성하세요 (연도는 정수로 변환합니다). 그런 다음 영화 객체를 직접 echo하기만 하면 됩니다. 그러면 __toString() 메서드가 자동으로 호출되어 출력을 생성합니다.

__toString()의 마법은 객체가 문자열 컨텍스트에서 사용될 때마다 PHP가 자동으로 이를 호출한다는 점입니다. echo $movie->getInfo();라고 쓰는 대신 간단히 echo $movie;라고 작성하면 PHP가 변환을 처리해 줍니다. 이를 통해 객체를 훨씬 더 직관적으로 다룰 수 있습니다.

치트 시트

매직 메서드(Magic methods)는 PHP에서 두 개의 밑줄(__)로 시작하는 특별한 메서드로, 특정 이벤트나 동작에 반응하여 PHP에 의해 자동으로 호출됩니다.

일반적인 매직 메서드:

메서드호출 시점
__construct()객체가 생성될 때
__destruct()객체가 소멸될 때
__toString()객체가 문자열로 사용될 때
__get()정의되지 않은 속성에 접근할 때
__set()정의되지 않은 속성을 설정할 때
__call()정의되지 않은 메서드를 호출할 때
__clone()객체가 복제될 때

__toString() 메서드는 객체의 문자열 표현을 반환합니다:

<?php
class Book {
    public function __construct(
        private string $title
    ) {}
    
    public function __toString(): string {
        return "Book: " . $this->title;
    }
}

$book = new Book("PHP Mastery");
echo $book; // 출력: Book: PHP Mastery

__toString()이 없으면 객체를 echo하려고 할 때 오류가 발생합니다. 매직 메서드는 이 동작을 가로채어 객체가 문자열 컨텍스트에서 사용될 수 있도록 합니다.

직접 해보기

<?php

require_once 'Movie.php';

// 입력 읽기
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));

// TODO: 입력 값을 사용하여 Movie 인스턴스 생성

// TODO: movie 객체를 직접 출력 (__toString() 메서드가 자동으로 호출됨)

?>
quiz icon실력 점검

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

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