IMCAT.DEV
로그인 가입
PHP 중급 객체지향

PHP 인터페이스와 추상 클래스

PHP 인터페이스와 추상 클래스 — 중급

인터페이스와 추상 클래스

1. 도입 (왜 배워야 하는가)

PHP에서 인터페이스와 추상 클래스는 객체지향 프로그래밍(OOP)의 중요한 구성 요소입니다. 이 두 가지 개념을 이해하면 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있습니다. 예를 들어, 복잡한 시스템을 개발할 때 각 구성 요소의 역할을 명확히 하고, 서로 다른 클래스들이 일관된 방식으로 동작하도록 할 수 있습니다.

반면, 이 개념들을 모른다면 코드가 복잡해지고, 각 클래스 간의 관계가 어지러워져 결국 유지보수가 어려워질 수 있습니다. 또한, 같은 기능을 가진 여러 클래스에서 중복 코드가 발생하여, 코드의 품질이 떨어지고 버그 발생 확률이 높아집니다.

2. 핵심 개념 설명

인터페이스

인터페이스는 클래스가 구현해야 하는 메소드의 집합을 정의합니다. 인터페이스는 메소드의 시그니처(메소드 이름, 매개변수, 반환 타입)만 포함하고, 실제 구현은 구현하는 클래스에서 담당합니다.

비유: 인터페이스는 레시피와 같습니다. 레시피에는 어떤 재료와 방법이 필요한지만 명시되어 있고, 실제 요리는 각 요리사가 자신만의 스타일로 만들어야 합니다.

추상 클래스

추상 클래스는 인스턴스를 생성할 수 없는 클래스입니다. 추상 클래스는 하나 이상의 추상 메소드를 가질 수 있으며, 이 메소드들은 서브클래스에서 반드시 구현해야 합니다. 또한, 일반 메소드와 속성도 포함할 수 있습니다.

비유: 추상 클래스는 자동차의 기본 설계도와 같습니다. 설계도에는 기본적인 구조가 있으며, 각 자동차 제조사는 이 설계도를 바탕으로 자신만의 자동차를 생산합니다.

용어정의
인터페이스메소드 시그니처만 정의된 계약
추상 클래스일부 메소드가 정의된 클래스, 인스턴스화 불가

3. 기본 코드 예제

// 인터페이스 정의
interface Animal {
    public function makeSound();
}

// 인터페이스 구현
class Dog implements Animal {
    public function makeSound() {
        return "멍멍";
    }
}

// 인터페이스 구현
class Cat implements Animal {
    public function makeSound() {
        return "야옹";
    }
}

// 객체 생성 및 메소드 호출
$dog = new Dog();
echo $dog->makeSound(); // 멍멍

$cat = new Cat();
echo $cat->makeSound(); // 야옹

실행 결과:

멍멍야옹
  • Animal 인터페이스를 정의합니다. 이 인터페이스에는 makeSound 메소드가 정의되어 있습니다.
  • Dog 클래스가 Animal 인터페이스를 구현하며, makeSound 메소드를 오버라이드하여 "멍멍"을 반환합니다.
  • Cat 클래스도 Animal 인터페이스를 구현하며, "야옹"을 반환합니다.
  • 각각의 객체를 생성하고 makeSound 메소드를 호출하여 소리를 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰의 결제 시스템

    쇼핑몰에서 결제 시스템을 구현할 때 PaymentMethod라는 인터페이스를 만들고, CreditCard, PayPal, BankTransfer 클래스가 이를 구현하게 할 수 있습니다. 이렇게 하면 새로운 결제 방식을 추가할 때 기존 코드를 변경할 필요 없이 새로운 클래스를 추가하면 됩니다.

    interface PaymentMethod {
        public function pay($amount);
    }
    
    class CreditCard implements PaymentMethod {
        public function pay($amount) {
            return "$amount 원이 신용카드로 결제되었습니다.";
        }
    }
    
    class PayPal implements PaymentMethod {
        public function pay($amount) {
            return "$amount 원이 페이팔로 결제되었습니다.";
        }
    }

    예제 2: 도형의 면적 계산

    도형의 면적을 계산하는 프로그램에서 Shape라는 추상 클래스를 만들고, Circle, Rectangle 클래스가 이를 상속받아 각각의 면적 계산 로직을 구현할 수 있습니다.

    abstract class Shape {
        abstract public function area();
    }
    
    class Circle extends Shape {
        private $radius;
    
        public function __construct($radius) {
            $this->radius = $radius;
        }
    
        public function area() {
            return pi()  $this->radius  $this->radius;
        }
    }
    
    class Rectangle extends Shape {
        private $width;
        private $height;
    
        public function __construct($width, $height) {
            $this->width = $width;
            $this->height = $height;
        }
    
        public function area() {
            return $this->width * $this->height;
        }
    }

    5. 흔한 실수와 주의사항

    실수 1: 인터페이스에서 메소드 구현

  • 잘못된 코드:
  • interface Vehicle {
        public function start() {
            // 구현할 수 없음
        }
    }
  • 올바른 코드:
  • interface Vehicle {
        public function start(); // 구현 없음
    }

    실수 2: 추상 클래스의 인스턴스 생성

  • 잘못된 코드:
  • abstract class Animal {
        abstract public function makeSound();
    }
    
    $animal = new Animal(); // 오류 발생
  • 올바른 코드:
  • class Dog extends Animal {
        public function makeSound() {
            return "멍멍";
        }
    }
    
    $dog = new Dog(); // 정상 작동

    6. 정리

  • 인터페이스는 계약을 정의하며, 구현체에서 메소드를 구현해야 한다.
  • 추상 클래스는 기본적인 구조를 제공하며, 일부 메소드는 서브클래스에서 반드시 구현해야 한다.
  • 특정 디자인 패턴을 적용해 코드의 재사용성과 유지보수성을 높일 수 있다.
  • 다음에 학습하면 좋은 주제

  • 디자인 패턴: 전략 패턴, 공장 패턴
  • PHP의 트레이트 (Trait) 사용법
  • 의존성 주입 (Dependency Injection) 패턴