📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 01 추상 클래스, 인터페이스

2025. 8. 4. 13:56프로그램/PHP 중급

📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 01 추상 클래스, 인터페이스

📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 01 추상 클래스, 인터페이스

 

지난 주에 #PHP #객체_지향_프로그래밍(OOP)의 #기본 개념과 #상속에 대해 학습했습니다. 이번 주에는 OOP의 더 심화된 개념인 #추상_클래스(Abstract Classes)와 #인터페이스(Interfaces)에 대해 알아보겠습니다. 이 두 가지는 #유연하고 #확장_가능하며 #견고한_객체_지향_설계_패턴을 구축하는 데 필수적인 요소입니다.


추상 클래스 (Abstract Classes)

#추상_클래스는 그 자체로는 객체를 생성할 수 없지만, 다른 클래스들이 #상속받아_사용할_수_있는_뼈대_클래스입니다. 추상 클래스는 #추상_메서드(Abstract Methods)와 일반 메서드, 속성을 모두 포함할 수 있습니다.

주요 특징:

  • abstract 키워드: 클래스 선언 앞에 abstract 키워드를 붙여 추상 클래스임을 명시합니다.
  • 객체 생성 불가: 추상 클래스는 new 연산자를 사용하여 직접 인스턴스화할 수 없습니다. 반드시 자식 클래스가 이를 상속받아 구현해야 합니다.
  • 추상 메서드 포함 가능: 추상 메서드는 선언만 있고 구현(본문)이 없는 메서드입니다. abstract 키워드를 사용하여 선언하며, 세미콜론(;)으로 끝납니다.
  • 강제 구현: 추상 클래스를 상속받는 자식 클래스는 부모의 모든 추상 메서드를 반드시 구현해야 합니다. 만약 자식 클래스가 부모의 모든 추상 메서드를 구현하지 않으면, 그 자식 클래스도 추상 클래스가 되어야 합니다.
  • 일반 메서드 및 속성 포함: 추상 클래스는 추상 메서드 외에 일반(구현된) 메서드와 속성도 가질 수 있습니다.

사용 목적:

  • 강제성 부여: 특정 메서드를 자식 클래스에서 반드시 구현하도록 강제하여, 일관된 구조와 동작을 보장합니다.
  • 공통 기능 제공: 추상 클래스에 일반 메서드를 정의하여, 모든 자식 클래스에서 공통적으로 사용할 기능을 제공할 수 있습니다.
  • 템플릿 메서드 패턴: 특정 작업의 큰 틀(템플릿)은 추상 클래스에서 정의하고, 세부적인 단계는 추상 메서드로 남겨두어 자식 클래스에서 구현하게 할 때 유용합니다.

예시:

PHP
 
<?php
// 추상 클래스 정의
abstract class Animal {
    public $name;

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

    // 추상 메서드: 자식 클래스에서 반드시 구현해야 함
    abstract public function makeSound();

    // 일반 메서드: 자식 클래스에서 재사용 가능
    public function eat() {
        echo "{$this->name}이(가) 먹이를 먹습니다.". PHP_EOL;
    }
}

// 추상 클래스를 상속받는 자식 클래스
class Dog extends Animal {
    public function makeSound() {
        echo "{$this->name}이(가) 멍멍 짖습니다.". PHP_EOL;
    }

    public function fetch() {
        echo "{$this->name}이(가) 공을 물어옵니다.". PHP_EOL;
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "{$this->name}이(가) 야옹야옹 웁니다.". PHP_EOL;
    }
}

// Animal 클래스는 직접 인스턴스화 할 수 없음 (오류 발생)
// $animal = new Animal("동물");

$dog = new Dog("바둑이");
$dog->makeSound(); // 멍멍 짖습니다.
$dog->eat();       // 먹이를 먹습니다.
$dog->fetch();     // 공을 물어옵니다.

echo PHP_EOL;

$cat = new Cat("나비");
$cat->makeSound(); // 야옹야옹 웁니다.
$cat->eat();       // 먹이를 먹습니다.
?>

인터페이스 (Interfaces)

#인터페이스는 클래스가 구현해야 할 #메서드의_목록만_정의합니다. 인터페이스는 속성을 가질 수 없으며, 모든 메서드는 기본적으로 #추상_메서드입니다. 즉, 인터페이스는 특정 클래스가 가져야 할 #기능_집합에_대한_규약(Contract)을 정의합니다.

주요 특징:

  • interface 키워드: 인터페이스 선언 앞에 interface 키워드를 붙입니다.
  • 메서드만 정의: 인터페이스는 메서드 시그니처(이름, 매개변수, 반환 타입)만 정의하며, 구현(본문)은 없습니다. 속성을 가질 수 없습니다.
  • 상수 포함 가능: 인터페이스는 상수를 가질 수 있습니다. (PHP 5.3부터)
  • implements 키워드: 클래스가 인터페이스를 구현할 때는 implements 키워드를 사용합니다.
  • 다중 구현: PHP 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있습니다. (반면, 클래스는 단 하나의 부모 클래스만 상속받을 수 있습니다.)
  • 강제 구현: 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 반드시 public으로 구현해야 합니다.

사용 목적:

  • 행동 규약 정의: 특정 역할을 수행하는 클래스들이 가져야 할 공통된 행동(메서드)을 강제하여, 일관된 API를 구축합니다.
  • 다형성(Polymorphism) 구현: 여러 클래스가 동일한 인터페이스를 구현하면, 해당 인터페이스 타입으로 객체를 참조하고 동일한 메서드 호출로 다양한 객체를 다룰 수 있습니다. 이는 #다형성 구현의 핵심입니다.
  • 결합도 낮추기: 구체적인 클래스에 의존하는 대신 인터페이스에 의존함으로써, 시스템의 #결합도를 낮추고 #유지보수성 및 #테스트_용이성을 높입니다.

예시:

PHP
 
<?php
// 인터페이스 정의
interface Logger {
    public function log(string $message);
}

// 인터페이스를 구현하는 클래스 1
class FileLogger implements Logger {
    private $logFile;

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

    public function log(string $message) {
        file_put_contents($this->logFile, date('Y-m-d H:i:s') . " [FILE] " . $message . PHP_EOL, FILE_APPEND);
        echo "파일에 로그 기록: {$message}". PHP_EOL;
    }
}

// 인터페이스를 구현하는 클래스 2
class DatabaseLogger implements Logger {
    public function log(string $message) {
        // 실제 데이터베이스 로직 (생략)
        echo "데이터베이스에 로그 기록: {$message}". PHP_EOL;
    }
}

// 다형성 활용 예시
function processLog(Logger $logger, string $msg) {
    $logger->log($msg);
}

$fileLogger = new FileLogger('application.log');
$dbLogger = new DatabaseLogger();

processLog($fileLogger, "애플리케이션 시작."); // 파일에 로그 기록
processLog($dbLogger, "사용자 로그인 성공.");  // 데이터베이스에 로그 기록
?>

추상 클래스와 인터페이스의 차이점 및 공통점

특징 추상 클래스 인터페이스
목적 IS-A 관계 (종류) 기반의 상속 계층 구조를 만듦, 부분 구현 및 공통 기능 제공 CAN-DO 관계 (역할/능력) 기반의 행동 규약 정의
구현 여부 추상 메서드(선언) + 일반 메서드(구현) 가능 오직 메서드 선언만 가능 (모든 메서드는 추상)
속성 속성 가질 수 있음 속성 가질 수 없음 (상수는 가능)
접근 제어자 public, protected, private 모두 사용 가능 모든 메서드는 암묵적으로 public
상속/구현 extends로 단일 상속만 가능 implements로 다중 구현 가능
인스턴스화 직접 인스턴스화 불가 직접 인스턴스화 불가
Sheets로 내보내기

공통점:

  • 모두 직접 인스턴스화할 수 없습니다.
  • 다른 클래스에서 상속/구현하여 사용해야 합니다.
  • 추상 메서드를 포함할 수 있어 자식/구현 클래스에서 특정 메서드를 강제로 구현하게 할 수 있습니다.

#추상_클래스와 #인터페이스는 #PHP #객체_지향_설계에서 #유연성과 #확장성을 부여하는 중요한 도구입니다. 이들을 적절히 활용하면 #코드의_재사용성을 높이고 #유지보수가 용이하며, #다형성을 통해 #견고한_애플리케이션을 구축할 수 있습니다. 다음 주에는 #디자인_패턴의 개념을 소개하며, 이들이 어떻게 실제 코드 설계에 적용되는지 더 자세히 알아보겠습니다.

 

 

 

속도, 안정성 확실. 끊김없이 빠른 VPN. 고품질 브이피엔 무료체험!

https://xn--299ao67b9qbmsf04c.net/

 

VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN

국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이

vpn.luzensoft.com