IMG-LOGO
공지사항 :

PHP Interface

lmkfox - 2025-09-14 06:29:24 13 Views 0 Comment

1. 기본 개념

  • interface는 클래스가 어떤 메서드를 가져야 하는지 강제합니다.

  • 인터페이스는 다중 구현이 가능합니다. (클래스는 여러 인터페이스를 implements할 수 있음)

  • 클래스는 implements 키워드를 사용하여 인터페이스를 구현합니다.

  • 인터페이스 안에서 선언되는 메서드는 항상 public이어야 하며, 구현 클래스에서도 반드시 public으로 구현해야 합니다.

  • 인터페이스도 다른 인터페이스를 extends하여 확장할 수 있습니다. (다중 상속 가능)


2. 기본 문법

interface Logger {
    public function log(string $message): void;
}

class FileLogger implements Logger {
    public function log(string $message): void {
        file_put_contents("app.log", $message.PHP_EOL, FILE_APPEND);
    }
}

class ConsoleLogger implements Logger {
    public function log(string $message): void {
        echo $message . PHP_EOL;
    }
}
function process(Logger $logger) {
    $logger->log("작업 실행됨");
}

process(new FileLogger());
process(new ConsoleLogger());

위 예제에서 Logger 인터페이스는 log() 메서드를 강제하며, 어떤 로거 구현체를 넘겨주든 동일한 방식으로 사용할 수 있습니다. (다형성)


3. 주요 특징

(1) 인터페이스 상속

interface A {
    public function foo();
}
interface B extends A {
    public function bar();
}

class C implements B {
    public function foo() {}
    public function bar() {}
}

  • 인터페이스끼리 extends 할 수 있으며, 다중 상속도 가능합니다.

  • 클래스가 B를 구현하면 A의 메서드도 모두 구현해야 합니다.

(2) 다중 구현

interface Readable { public function read(); }
interface Writable { public function write(); }

class FileStream implements Readable, Writable {
    public function read() {}
    public function write() {}
}

  • PHP는 클래스 다중 상속을 지원하지 않지만, 인터페이스는 여러 개 구현할 수 있습니다.

(3) 상수 정의 (PHP 5.3+)

interface Status {
    public const OK = 200;
    public const NOT_FOUND = 404;
}

class Response implements Status {
    public function getStatusMessage(int $code): string {
        return match($code) {
            self::OK => "Success",
            self::NOT_FOUND => "Not Found",
            default => "Unknown"
        };
    }
}

  • 인터페이스에 상수를 정의할 수 있고, 구현 클래스에서 그대로 사용할 수 있습니다.

  • 단, 오버라이드(값 재정의)는 불가합니다.

(4) 인터페이스의 프로퍼티 (PHP 8.1+)

  • PHP 8.1부터 인터페이스에 readonly 프로퍼티를 정의할 수 있습니다.

interface HasId {
    public function getId(): int;
}

  • 그러나 일반 프로퍼티 선언은 허용되지 않고, 구현 클래스에서 구현해야 합니다. (실제 데이터 저장은 클래스가 담당)

(5) 타입 힌팅과 인터페이스

인터페이스는 타입 선언에 자주 사용됩니다.

function connect(Logger $logger) {
    $logger->log("연결 시도");
}

  • Logger 타입을 받는 함수는 Logger를 구현한 어떤 객체든 받을 수 있습니다.


4. 

abstract class

와의 차이

구분

Interface

Abstract class

목적

“계약” 정의

기본 구현 + 확장 포인트 제공

메서드 구현

불가능 (PHP 8.0 이전은 전부 추상)

추상 메서드 + 일반 메서드 혼합 가능

프로퍼티

직접 저장 불가 (PHP 8.1에서 readonly 제한적 지원)

인스턴스 변수 가질 수 있음

상속/구현

다중 구현 가능

클래스는 단일 상속만 가능

상수

정의 가능

정의 가능


5. 실무에서의 사용 예

  • 로깅, 캐싱, DB 연결, 메시지 큐 등 교체 가능성이 있는 모듈의 공통 API를 정의할 때

  • DI(의존성 주입) 패턴에서 인터페이스 기반으로 설계하여 구현체를 유연하게 교체할 때

  • 테스트 작성 시 Mock 객체를 쉽게 만들 수 있도록 계약을 정의할 때


6. 베스트 프랙티스

  1. 외부에 노출되는 서비스 API는 인터페이스로 정의 → 구현체 교체가 쉬움.

  2. 너무 세세한 인터페이스는 피하라 → 지나친 분리보다는 실제 사용에 맞는 수준으로 정의.

  3. 구현 클래스 이름보다 인터페이스 이름을 기반으로 코딩 → 느슨한 결합(loose coupling) 유지.


결론

  • interface는 PHP에서 클래스가 반드시 따라야 할 규약을 정의하는 수단이다.

  • 다형성을 구현하고, 의존성을 줄이며, 확장 가능한 코드를 작성할 수 있게 한다.

  • PHP 8.1 이후로는 더 많은 기능(상수, readonly 프로퍼티 지원 등)이 추가되어, 점점 더 강력한 역할을 하고 있다.


댓글