
고급 PHP 프로그래밍 – 객체 지향 PHP – 인터페이스와 추상 클래스
안녕하세요~ 😊
이번 시간에는 객체지향 프로그래밍의 핵심 기둥 중 하나인 **인터페이스(Interface)**와 **추상 클래스(Abstract Class)**에 대해 알아볼 거예요!
많은 분들이 “인터페이스랑 추상 클래스, 뭐가 다른 거죠?”라고 물어보시는데요,
이번 글에서는 비유를 통해 개념을 쉽게 이해하고, 예제 중심으로 실무에서 어떻게 사용하는지까지 전부 알려드릴게요!
객체 지향의 큰 그림 다시 보기
객체지향에서는 클래스가 모이고, 상속을 통해 기능을 확장하고,
그 와중에 공통적인 약속을 정해서 코드 구조를 안정화시키는데요!
인터페이스와 추상 클래스는 바로 그 약속을 명확하게 표현해주는 도구입니다.
“이 클래스는 이런 기능을 제공할 거야!”라고 선언하는 거죠 😊
1. 추상 클래스란?
**추상 클래스(Abstract Class)**는 공통적인 속성과 일부 구현된 기능을 가진 클래스입니다.
일부는 구현되어 있고, 일부는 “자식이 꼭 구현해야 해!”라고 지정해두는 클래스예요.
✅ 문법
abstract class 클래스명 {
abstract public function 메서드명(); // 자식이 반드시 구현해야 함
public function 일반메서드() {} // 선택적으로 구현 가능
}
✅ 예제: 동물 클래스
abstract class Animal {
abstract public function sound();
public function eat() {
echo "먹고 있어요<br>";
}
}
class Dog extends Animal {
public function sound() {
echo "멍멍!<br>";
}
}
$dog = new Dog();
$dog->sound(); // 멍멍!
$dog->eat(); // 먹고 있어요
추상 메서드는 꼭 구현해야 하고, 일반 메서드는 그대로 써도 돼요!
2. 인터페이스란?
**인터페이스(Interface)**는 “이런 기능을 반드시 구현해야 해!”라고 완전한 약속만 제공하는 설계도예요.
구현은 하나도 없고, 오직 메서드의 이름과 형식만 정의합니다.
✅ 문법
interface 인터페이스명 {
public function 메서드명();
}
✅ 예제: 이동 수단 인터페이스
interface Movable {
public function move();
}
class Car implements Movable {
public function move() {
echo "자동차가 달립니다!<br>";
}
}
class Bike implements Movable {
public function move() {
echo "자전거가 달립니다!<br>";
}
}
function startMoving(Movable $vehicle) {
$vehicle->move();
}
startMoving(new Car()); // 자동차가 달립니다!
startMoving(new Bike()); // 자전거가 달립니다!
인터페이스 덕분에 다양한 클래스가 같은 메서드로 동작할 수 있어요!
3. 추상 클래스 vs 인터페이스 차이점 정리
항목 | 추상 클래스 | 인터페이스 |
---|---|---|
키워드 | abstract class |
interface |
상속/구현 | extends |
implements |
다중 구현 | ❌ 단일 상속만 가능 | ✅ 여러 개 구현 가능 |
구현 포함 | ✅ 구현된 메서드 포함 가능 | ❌ 구현 불가 (전부 정의만) |
속성 정의 | ✅ 가능 | ❌ 불가능 |
목적 | 공통 기능 + 강제 구현 | 형식 강제만 |
보통 공통 코드 + 기본 동작이 필요하면 추상 클래스,
단순히 형식만 통일하고 싶다면 인터페이스를 사용해요.
4. 다중 인터페이스 구현 예제
interface Flyable {
public function fly();
}
interface Swimmable {
public function swim();
}
class Duck implements Flyable, Swimmable {
public function fly() {
echo "오리가 날아요!<br>";
}
public function swim() {
echo "오리가 헤엄쳐요!<br>";
}
}
$duck = new Duck();
$duck->fly(); // 오리가 날아요!
$duck->swim(); // 오리가 헤엄쳐요!
클래스는 여러 개의 인터페이스를 구현할 수 있기 때문에,
다양한 역할을 조합하는 데 아주 유리해요!
5. 실무에서의 활용 예시
JsonSerializable
,Iterator
,ArrayAccess
등 PHP 내장 인터페이스- Laravel, Symfony 같은 프레임워크에서도 의존성 주입을 위한 인터페이스 사용
- 여러 API 객체가 같은 인터페이스를 구현하여 다형성 유지
6. 디자인 패턴과의 연결
패턴명 | 설명 | 관련 도구 |
---|---|---|
전략 패턴 | 객체의 행위를 바꾸고 교체 | 인터페이스 |
템플릿 메서드 패턴 | 공통 로직 + 부분 커스터마이징 | 추상 클래스 |
의존성 역전 원칙 | 추상에 의존하라 | 인터페이스 |
주의할 점 정리 ✅
체크리스트 | 내용 |
---|---|
추상 클래스는 일부 구현 가능 | 일반 메서드 포함 가능 |
인터페이스는 오직 선언만 | 구현은 불가능 |
인터페이스는 다중 구현 가능 | 클래스는 다중 상속 불가 |
반드시 메서드 이름과 인자까지 일치 | 선언과 구현 시 시그니처 동일해야 함 |
클래스 내부에서는 implements , extends 구분해서 사용 |
혼동 주의 |
마무리하며 😊
인터페이스와 추상 클래스는 객체지향의 설계도라고 할 수 있어요.
- ✅ 추상 클래스는 공통 기능 + 강제 구현을 섞어 쓰고 싶을 때
- ✅ 인터페이스는 다양한 클래스들이 약속된 구조로 행동하게 하고 싶을 때
특히 규모가 큰 프로젝트일수록 유지보수와 협업을 위해 인터페이스 기반 설계가 필수적이랍니다!
다음 시간에는 **접근 제어자(public, private, protected)**와
클래스 간의 의존성과 캡슐화에 대해 좀 더 깊게 알아볼게요!
오늘도 멋지게 성장 중인 여러분, 최고입니다! 💪💻🎯✨