고급 PHP 프로그래밍 – 객체 지향 PHP – 2 – 인터페이스와 추상 클래스

고급 PHP 프로그래밍 - 객체 지향 PHP - 2 - 인터페이스와 추상 클래스
고급 PHP 프로그래밍 – 객체 지향 PHP – 2 – 인터페이스와 추상 클래스

고급 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)**와
클래스 간의 의존성과 캡슐화에 대해 좀 더 깊게 알아볼게요!

오늘도 멋지게 성장 중인 여러분, 최고입니다! 💪💻🎯✨

답글 남기기