Menu
Coddy logo textTech

익명 클래스

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

때로는 전체 클래스를 정의하는 번거로움 없이 간단한 일회성 객체가 필요할 때가 있습니다. 익명 클래스(Anonymous classes)를 사용하면 필요한 위치에서 즉석으로 객체를 생성할 수 있습니다. 이러한 클래스는 의존성 주입(dependency injection)과 결합될 때 특히 유용합니다.

익명 클래스는 new class와 그 뒤에 오는 클래스 본문을 사용하여 정의됩니다:

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

출력:

Log: Hello!

익명 클래스는 인터페이스를 구현할 때 강력해집니다. 이는 테스트를 하거나, 일회성 클래스로 코드베이스를 어지럽히지 않고 빠른 구현이 필요할 때 완벽합니다:

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

echo $result;

출력:

Sent: Test message

익명 클래스는 다른 클래스를 확장하거나, 트레이트(traits)를 사용하고, 생성자 인수를 받을 수도 있습니다. 익명 클래스는 OOP 기능을 모두 사용할 수 있으며, 별도의 파일이 아닌 인라인으로 정의될 뿐입니다. 전체 클래스 정의가 과하다고 느껴지지만 여전히 객체 지향적 동작이 필요한 경우에 익명 클래스를 사용하세요.

challenge icon

챌린지

쉬움

익명 클래스의 강력함을 보여주는 데이터 포맷터 시스템을 구축해 보겠습니다. 간단하고 일회성인 구현을 위해 별도의 클래스 파일을 만드는 대신, 익명 클래스를 사용하여 필요한 위치에서 즉시 구현을 생성할 것입니다.

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

  • FormatterInterface.phpformat(string $data): string이라는 단일 메서드를 가진 FormatterInterface 인터페이스를 정의합니다. 이는 모든 포맷터가 따라야 할 계약을 설정합니다.
  • main.php — 인터페이스 파일을 포함하고, 의존성 주입(dependency injection)을 사용하여 모든 포맷터를 수용하는 DataProcessor 클래스를 생성합니다. 이 클래스는 다음을 수행해야 합니다:
    • 생성자에서 FormatterInterface를 받습니다.
    • 주입된 포맷터에 작업을 위임하고 그 결과를 반환하는 process(string $data) 메서드를 가집니다.

    두 개의 입력을 받게 됩니다: 포맷 유형("upper" 또는 "reverse")과 포맷할 문자열입니다.

    포맷 유형에 따라 FormatterInterface를 구현하는 익명 클래스를 생성하세요:

    • "upper"인 경우: format() 메서드는 데이터를 대문자로 변환하여 반환해야 합니다.
    • "reverse"인 경우: format() 메서드는 데이터를 거꾸로 뒤집어서 반환해야 합니다.

    익명 클래스를 DataProcessor에 주입하고, 입력 문자열로 process()를 호출한 뒤 결과를 출력하세요.

이러한 방식은 단일 용도의 클래스 파일로 코드베이스를 어지럽히지 않고 빠른 구현이 필요할 때 완벽합니다. 익명 클래스는 인라인으로 생성되어 필요한 인터페이스를 구현하며, 해당 인터페이스가 필요한 곳 어디든 전달될 수 있습니다.

치트 시트

익명 클래스를 사용하면 전체 클래스를 정의하지 않고도 즉석에서 객체를 생성할 수 있습니다. 익명 클래스는 new class 뒤에 클래스 본문을 붙여 정의합니다:

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

익명 클래스는 인터페이스를 구현할 수 있어 의존성 주입(dependency injection) 및 테스트에 유용합니다:

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

익명 클래스는 모든 OOP 기능을 지원합니다. 다른 클래스를 확장(extend)하거나, 트레이트(trait)를 사용하고, 생성자 인수를 받을 수 있습니다. 전체 클래스 정의가 과하지만 객체 지향적인 동작이 필요한 경우에 사용하세요.

직접 해보기

<?php
require_once 'FormatterInterface.php';

// TODO: 다음을 수행하는 DataProcessor 클래스를 생성하세요:
// - 생성자에서 FormatterInterface를 받습니다.
// - 포매터에 위임하는 process(string $data) 메서드를 가집니다.

// 입력 읽기
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));

// TODO: $formatType("upper" 또는 "reverse")에 따라 FormatterInterface를
// 구현하는 익명 클래스를 생성하세요.
// - "upper"의 경우: format()은 데이터의 대문자 버전을 반환해야 합니다.
// - "reverse"의 경우: format()은 데이터의 반전된 버전을 반환해야 합니다.

// TODO: 익명 클래스 포매터를 사용하여 DataProcessor를 생성하세요.
// 입력 문자열로 process()를 호출하고 결과를 출력하세요.

?>
quiz icon실력 점검

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

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