PHP 5부터 객체 지향 프로그래밍(OOP) 패러다임이 도입되면서, 실시간 PHP 애플리케이션에서 코드를 재사용하고 체계적으로 관리할 수 있게 되었습니다.
객체 지향 모델의 핵심 개념에는 클래스(class), 객체(object), 캡슐화(encapsulation), 다형성(polymorphism), 추상 클래스와 final 클래스 및 메서드, 인터페이스, 상속 등이 있습니다.
이 글에서는 그중에서도 많은 초보 개발자들이 혼동하기 쉬운 추상화(Abstraction)와 캡슐화(Encapsulation)의 핵심 차이점을 자세히 살펴보겠습니다.
캡슐화(Encapsulation)란?
- 캡슐화는 데이터 멤버(변수)와 구현 세부 사항을 '클래스'라는 하나의 단위로 묶는 기법입니다. 즉, 클래스는 내부에 포함된 변수와 메서드로 구성됩니다.
- 캡슐화는 클래스 내부의 데이터 멤버를 외부로부터 보호하는 메커니즘입니다. 최종 사용자가 데이터에 직접 접근할 수 없습니다.
- 한 클래스의 데이터 멤버(변수)는 다른 클래스에서 직접 접근할 수 없으며, 오직 해당 클래스 자신의 메서드를 통해서만 접근이 가능합니다.
- 캡슐화는
private,protected같은 접근 제어자(access modifier)를 사용하여 구현됩니다. - 캡슐화는 웹 애플리케이션의 복잡도를 줄이고, 데이터 무결성과 보안을 유지하는 데 활용됩니다.
캡슐화 예제 코드
<?php
class BankAccount {
private $balance = 0;
public function deposit($amount) {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function getBalance() {
return $this->balance;
}
}
?>
위 예제처럼 변수를 private으로 선언하면 외부에서 직접 수정할 수 없고, 반드시 공개된(public) 메서드를 통해서만 접근하게 됩니다. 이것이 바로 캡슐화입니다.
추상화(Abstraction)란?
- 추상화는 배경에 있는 복잡한 세부 사항은 감추고, 꼭 필요한 핵심 기능만 표현하는 구조를 의미합니다.
- 추상화는 구현 세부 사항을 최종 사용자에게 숨기고, 어떻게(how)가 아닌 무엇(what)만 보여주는 기술입니다.
- 추상화는 클래스와 함께 다형성 개념을 구현하는 데 활용됩니다. 추상 클래스 안에서는 메서드를 선언만 할 수 있으며, 일반적으로 이를 상속받은 파생 클래스가 실제 동작을 구현합니다.
- 추상 클래스는 인스턴스화(instantiation)할 수 없으므로, 최종 사용자가 직접 접근하는 것이 불가능합니다.
- 추상화는 애플리케이션의 복잡도를 낮추고, 코드의 재사용성과 확장성을 높이는 데 사용됩니다.
추상화 예제 코드
<?php
abstract class Animal {
// 선언만 존재하는 추상 메서드
abstract public function makeSound();
}
class Dog extends Animal {
public function makeSound() {
echo "멍멍!";
}
}
class Cat extends Animal {
public function makeSound() {
echo "야옹!";
}
}
?>
추상 클래스 Animal은 직접 객체를 만들 수 없지만, 각 파생 클래스가 makeSound()를 서로 다르게 구현함으로써 유연하고 확장 가능한 구조를 만들 수 있습니다.
추상화 vs 캡슐화 핵심 차이점 비교
| 구분 | 캡슐화(Encapsulation) | 추상화(Abstraction) |
|---|---|---|
| 목적 | 데이터와 메서드를 하나의 단위로 묶어 외부로부터 보호 | 불필요한 세부 사항을 숨기고 핵심 기능만 노출 |
| 구현 방식 | private, protected 접근 제어자 사용 | abstract 클래스, 인터페이스(interface) 사용 |
| 초점 | 데이터 보안 및 무결성 | 설계의 단순화 및 유연성 |
| 인스턴스 생성 | 일반 클래스이므로 인스턴스 생성 가능 | 추상 클래스는 인스턴스화 불가 |
| 효과 | 내부 상태 보호, 부작용 방지 | 복잡도 감소, 코드 재사용성 향상 |
정리
캡슐화는 '데이터를 어떻게 보호할 것인가'에 초점을 맞춘 개념이고, 추상화는 '사용자에게 무엇을 보여줄 것인가'에 초점을 맞춘 개념입니다. 두 개념은 서로 대립하는 것이 아니라 상호 보완적으로 사용되며, PHP에서 잘 설계된 객체 지향 애플리케이션을 만들기 위해 반드시 함께 이해해야 하는 핵심 요소입니다.