2025. 8. 4. 13:56ㆍ프로그램/PHP 중급
📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 01 추상 클래스, 인터페이스

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

#추상_클래스는 그 자체로는 객체를 생성할 수 없지만, 다른 클래스들이 #상속받아_사용할_수_있는_뼈대_클래스입니다. 추상 클래스는 #추상_메서드(Abstract Methods)와 일반 메서드, 속성을 모두 포함할 수 있습니다.
주요 특징:
- abstract 키워드: 클래스 선언 앞에 abstract 키워드를 붙여 추상 클래스임을 명시합니다.
- 객체 생성 불가: 추상 클래스는 new 연산자를 사용하여 직접 인스턴스화할 수 없습니다. 반드시 자식 클래스가 이를 상속받아 구현해야 합니다.
- 추상 메서드 포함 가능: 추상 메서드는 선언만 있고 구현(본문)이 없는 메서드입니다. abstract 키워드를 사용하여 선언하며, 세미콜론(;)으로 끝납니다.
- 강제 구현: 추상 클래스를 상속받는 자식 클래스는 부모의 모든 추상 메서드를 반드시 구현해야 합니다. 만약 자식 클래스가 부모의 모든 추상 메서드를 구현하지 않으면, 그 자식 클래스도 추상 클래스가 되어야 합니다.
- 일반 메서드 및 속성 포함: 추상 클래스는 추상 메서드 외에 일반(구현된) 메서드와 속성도 가질 수 있습니다.
사용 목적:
- 강제성 부여: 특정 메서드를 자식 클래스에서 반드시 구현하도록 강제하여, 일관된 구조와 동작을 보장합니다.
- 공통 기능 제공: 추상 클래스에 일반 메서드를 정의하여, 모든 자식 클래스에서 공통적으로 사용할 기능을 제공할 수 있습니다.
- 템플릿 메서드 패턴: 특정 작업의 큰 틀(템플릿)은 추상 클래스에서 정의하고, 세부적인 단계는 추상 메서드로 남겨두어 자식 클래스에서 구현하게 할 때 유용합니다.
예시:
<?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
// 인터페이스 정의
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로 다중 구현 가능 |
| 인스턴스화 | 직접 인스턴스화 불가 | 직접 인스턴스화 불가 |
공통점:
- 모두 직접 인스턴스화할 수 없습니다.
- 다른 클래스에서 상속/구현하여 사용해야 합니다.
- 추상 메서드를 포함할 수 있어 자식/구현 클래스에서 특정 메서드를 강제로 구현하게 할 수 있습니다.
#추상_클래스와 #인터페이스는 #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
'프로그램 > PHP 중급' 카테고리의 다른 글
| 📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 03 정적 속성/메서드 (static) (0) | 2025.08.07 |
|---|---|
| 📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 02 트레이트 (Trait) (0) | 2025.08.06 |
| 📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 04 상속 (extends) (0) | 2025.08.01 |
| 📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 03 캡슐화 (public, private, protected) (0) | 2025.07.30 |
| 📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 02 생성자 (__construct) (0) | 2025.07.29 |