코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP Interfaces

PHP 인터페이스(Interfaces): 클래스 간의 일관된 설계 제공


  • *PHP 인터페이스(Interfaces)**는 **객체 지향 프로그래밍(OOP)**에서 클래스 간의 일관된 설계를 제공하는 구조입니다. 인터페이스는 클래스가 구현해야 할 메서드의 목록을 정의하며, 인터페이스 자체는 구현되지 않고 선언만 할 수 있습니다. 인터페이스를 사용하면 서로 다른 클래스들이 공통된 방식으로 동작하게 할 수 있어, 코드의 일관성유연성을 높입니다.

이 가이드에서는 PHP 인터페이스의 개념, 정의 방법, 인터페이스의 특징실용적인 예제를 다룹니다.


1. PHP 인터페이스의 개념

  • *인터페이스(Interface)**는 클래스가 반드시 구현해야 하는 메서드의 집합을 정의합니다. 인터페이스는 메서드의 선언만 포함하며, 실제 구현은 클래스에서 이루어집니다. 이를 통해 다양한 클래스가 동일한 방식으로 동작하도록 강제할 수 있습니다.

1.1 인터페이스의 특징

  • 구현되지 않은 메서드만 포함하며, 구현은 클래스에서 이루어집니다.
  • 하나의 클래스가 여러 인터페이스구현할 수 있습니다.
  • 다중 상속을 지원하지 않는 PHP에서, 다중 구현을 가능하게 합니다.
  • 인터페이스는 객체로 직접 인스턴스화할 수 없습니다.

2. PHP에서 인터페이스 정의

인터페이스는 interface 키워드를 사용해 정의하며, 클래스는 implements 키워드를 사용해 인터페이스를 구현합니다.

2.1 인터페이스 정의 및 구현

<?php
// 인터페이스 정의
interface Animal {
    public function makeSound();  // 인터페이스 메서드는 구현하지 않고 선언만 함
}

// 인터페이스를 구현하는 클래스
class Dog implements Animal {
    public function makeSound() {
        return "Bark";
    }
}

class Cat implements Animal {
    public function makeSound() {
        return "Meow";
    }
}

// 객체 생성 및 인터페이스 메서드 호출
$dog = new Dog();
echo $dog->makeSound();  // 결과: Bark

$cat = new Cat();
echo $cat->makeSound();  // 결과: Meow
?>

설명:

  • interface: Animal 인터페이스는 makeSound() 메서드를 선언하지만, 구현은 하지 않습니다.
  • implements: DogCat 클래스는 Animal 인터페이스를 구현하며, 인터페이스의 메서드인 **makeSound()*를 구체적으로 정의합니다.
  • 다양한 클래스같은 인터페이스를 사용해 서로 다른 방식으로 동작하도록 할 수 있습니다.

3. 인터페이스의 주요 특징

3.1 인터페이스의 특징 요약

  • 구현 강제: 인터페이스를 구현한 클래스는 인터페이스에 선언된 모든 메서드를 반드시 구현해야 합니다.
  • 다중 구현 가능: 하나의 클래스는 여러 인터페이스를 동시에 구현할 수 있습니다.
  • 상수 포함 가능: 인터페이스는 상수를 포함할 수 있지만, 속성(변수)은 포함할 수 없습니다.

4. 인터페이스의 다중 구현

PHP에서 클래스는 다중 상속을 지원하지 않지만, 여러 인터페이스를 동시에 구현할 수 있습니다. 이를 통해 클래스가 다양한 역할을 수행할 수 있도록 구성할 수 있습니다.

4.1 다중 인터페이스 구현

<?php
// 첫 번째 인터페이스
interface Flyable {
    public function fly();
}

// 두 번째 인터페이스
interface Swimmable {
    public function swim();
}

// 클래스를 두 개의 인터페이스로부터 구현
class Duck implements Flyable, Swimmable {
    public function fly() {
        return "The duck is flying.";
    }

    public function swim() {
        return "The duck is swimming.";
    }
}

// 객체 생성 및 메서드 호출
$duck = new Duck();
echo $duck->fly();  // 결과: The duck is flying.
echo $duck->swim();  // 결과: The duck is swimming.
?>

설명:

  • Duck 클래스는 FlyableSwimmable 인터페이스를 동시에 구현하며, 다중 인터페이스 구현이 가능합니다.
  • 인터페이스를 구현함으로써 Duck 클래스는 날 수 있고 헤엄칠 수 있는 객체로 동작합니다.

5. 인터페이스와 추상 클래스의 차이점

인터페이스추상 클래스는 모두 공통된 인터페이스를 제공하지만, 몇 가지 중요한 차이점이 있습니다.

5.1 인터페이스와 추상 클래스 비교

항목 인터페이스 추상 클래스
인스턴스화 가능 여부 인스턴스화 불가능 인스턴스화 불가능
메서드 구현 여부 메서드는 선언만 가능, 구현 불가 메서드 구현 가능 (일부 메서드만 추상 메서드로 선언 가능)
다중 상속 가능 여부 다중 구현 가능 다중 상속 불가
속성(변수) 포함 여부 속성 포함 불가 속성 포함 가능
구현 강제 여부 모든 메서드는 구현하는 클래스에서 반드시 구현해야 함 추상 메서드는 구현해야 하지만, 일반 메서드는 그대로 사용할 수 있음
키워드 interface abstract

5.2 인터페이스와 추상 클래스의 사용 예

<?php
// 인터페이스 정의
interface Drawable {
    public function draw();
}

// 추상 클래스 정의
abstract class Shape {
    abstract public function area();
}

// 자식 클래스에서 인터페이스와 추상 클래스 둘 다 구현
class Circle extends Shape implements Drawable {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function area() {
        return pi() * $this->radius * $this->radius;
    }

    public function draw() {
        return "Drawing a circle.";
    }
}

$circle = new Circle(5);
echo $circle->area();  // 결과: 78.539816339745
echo $circle->draw();  // 결과: Drawing a circle.
?>

설명:

  • 인터페이스는 클래스가 구현해야 할 메서드를 정의하며, 다중 구현이 가능합니다.
  • 추상 클래스상속받은 클래스에서만 사용할 수 있으며, 일부 메서드는 자식 클래스에서 구현해야 합니다.

6. 인터페이스 상수

인터페이스는 상수를 포함할 수 있으며, 구현하는 클래스에서 해당 상수를 사용할 수 있습니다. 인터페이스 상수는 상속받은 모든 클래스에서 공유됩니다.

6.1 인터페이스 상수 사용 예

<?php
interface Configurable {
    const MAX_SIZE = 100;  // 상수 선언

    public function configure($size);
}

class Product implements Configurable {
    public function configure($size) {
        if ($size > self::MAX_SIZE) {
            return "Size exceeds the maximum allowed size.";
        } else {
            return "Size is within the limit.";
        }
    }
}

$product = new Product();
echo $product->configure(120);  // 결과: Size exceeds the maximum allowed size.
?>

설명:

  • 인터페이스에 선언된 상수는 변경할 수 없으며, 상속받은 클래스에서 사용 가능합니다.
  • *self::MAX_SIZE*로 상수에 접근할 수 있습니다.

7. 인터페이스 실용 예제

7.1 결제 시스템 구현

<?php
// 결제 인터페이스 정의
interface PaymentGateway {
    public function processPayment($amount);
}

// PayPal 클래스는 PaymentGateway 인터페이스를 구현
class PayPal implements PaymentGateway {
    public function processPayment($amount) {
        return "Processing $amount through PayPal.";
    }
}

// Stripe 클래스는 PaymentGateway 인터페이스를 구현
class Stripe implements PaymentGateway {
    public function processPayment($amount) {
        return "Processing $amount through Stripe.";
    }
}

// 결제 처리 함수
function makePayment(PaymentGateway $gateway, $amount) {
    echo $gateway->processPayment($amount);
}

$paypal = new PayPal();
$stripe = new Stripe();

makePayment($paypal, 100);  // 결과: Processing 100 through PayPal.
makePayment($stripe, 200);  // 결과: Processing 200 through Stripe.
?>

설명:

  • PaymentGateway 인터

페이스는 결제 시스템의 공통된 메서드를 정의하며, 각 결제 시스템은 다른 방식으로 결제를 처리할 수 있습니다.

  • makePayment() 함수는 인터페이스를 타입 힌트로 사용하여, 다양한 결제 시스템을 유연하게 처리할 수 있습니다.

8. 인터페이스 사용 시 장점

  • 다형성(Polymorphism): 여러 클래스가 동일한 인터페이스를 구현하면, 같은 방식으로 호출할 수 있습니다. 이를 통해 코드의 유연성이 증가하고, 다형성을 구현할 수 있습니다.
  • 다중 구현: 하나의 클래스가 여러 인터페이스를 구현할 수 있어, 다양한 역할을 수행하는 클래스를 만들 수 있습니다.
  • 유지보수성: 인터페이스는 일관된 설계를 제공하여, 변경 사항이 있을 때 하위 클래스에서만 수정하도록 합니다.

요약

PHP **인터페이스(Interfaces)**는 클래스가 구현해야 할 공통된 메서드의 집합을 정의하여, 코드의 일관성유연성을 높이는 데 사용됩니다. 인터페이스는 구현되지 않은 메서드만 선언하며, 구현은 이를 상속받는 클래스에서 이루어집니다. 다중 구현이 가능하고, 공통된 인터페이스를 통해 다형성을 지원하여 여러 클래스를 동일한 방식으로 처리할 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com