이 글에서는 PHP 객체 지향 프로그래밍(OOP)에서 가장 중요한 설계 패턴 중 하나인 PHP 인터페이스를 활용하는 방법을 자세히 살펴보겠습니다.
인터페이스란 무엇인가?
인터페이스(Interface)를 사용하면 메서드가 내부적으로 어떻게 구현되는지에 대한 복잡한 과정을 신경 쓰지 않고도, 클래스가 반드시 구현해야 하는 공개(public) 메서드를 미리 지정해 둘 수 있습니다. 즉, 인터페이스는 메서드의 이름과 매개변수까지만 정의할 수 있을 뿐 메서드의 실제 내용은 정의할 수 없으며, 인터페이스를 구현하는 모든 클래스는 해당 인터페이스에 선언된 모든 메서드를 반드시 구현해야 합니다.
인터페이스는 클래스와 비슷한 방식으로 선언하지만, class 키워드 대신 interface 키워드를 사용하고 메서드 본문은 작성하지 않는다는 점이 다릅니다.
예제 1: 기본적인 인터페이스 구현
간단한 예제를 통해 인터페이스를 선언하고 구현하는 방법을 확인해 보겠습니다.
<?php
interface MyInterface {
public function getName();
public function getAge();
}
class MyClass implements MyInterface {
public function getName() {
echo "My name A".'<br>';
}
public function getAge(){
echo "My Age 12";
}
}
$obj = new MyClass;
$obj->getName();
$obj->getAge();
?>
출력 결과:
My name A
My Age 12
설명:
위 예제에서는 getName()과 getAge() 두 개의 메서드를 내용 없이 선언한 인터페이스 MyInterface를 정의했습니다. 그런 다음 MyClass가 이 인터페이스를 구현(implements)하여, 요구 사항에 맞게 각 메서드의 실제 동작을 작성했습니다.
인터페이스의 주요 특징
- 인터페이스의 메서드는 본문(내용)이 없으며, 이는 곧 인터페이스의 메서드가 추상 메서드임을 의미합니다.
- 인터페이스의 모든 메서드는 public 가시성 범위를 가져야 합니다.
- 클래스는 단 하나의 클래스만 상속받을 수 있지만, 하나 이상의 인터페이스를 동시에 구현할 수 있다는 점에서 인터페이스는 클래스와 다릅니다.
- 인터페이스 내부에는 변수를 선언할 수 없습니다(상수만 허용됩니다).
참고: 다중 상속 구현하기
인터페이스를 활용하면 다중 상속을 구현할 수 있습니다. 클래스는 오직 하나의 클래스만 상속(extends)할 수 있지만, 여러 개의 인터페이스를 동시에 구현(implements)할 수 있기 때문입니다.
예제 2: 인터페이스 상속으로 다중 상속 구현
간단한 예제로 직접 확인해 보겠습니다.
<?php
interface a {
public function printData();
}
interface b {
public function getData();
}
interface c extends a, b {
public function addData();
}
class d implements c {
public function printData(){
echo "I am printing";
}
public function getData(){
echo "I am reading data";
}
public function addData(){
echo "I am adding";
}
}
$myobj = new d();
$myobj->printData();
$myobj->addData();
?>
출력 결과:
I am printing
I am adding
설명:
여기서는 세 개의 인터페이스(a, b, c)를 선언했습니다. 이때 인터페이스 c는 앞선 두 인터페이스 a와 b를 상속(extends)합니다. 이후 클래스 d는 인터페이스 c만 구현했지만, c가 a와 b를 상속하고 있기 때문에 세 인터페이스에 선언된 모든 메서드(printData, getData, addData)를 클래스 d에서 사용할 수 있습니다. 이처럼 인터페이스를 활용하면 PHP에서도 다중 상속과 같은 효과를 얻을 수 있습니다.