캡슐화(Encapsulation)는 객체 지향 프로그래밍(OOP)의 4대 핵심 원칙(캡슐화, 상속, 다형성, 추상화) 중 하나입니다. 캡슐화란 데이터(속성)와 해당 데이터를 처리하는 메서드(기능)를 하나의 단위인 객체로 묶고, 데이터가 외부에서 직접 접근하는 것을 제한하는 것을 의미합니다.
이를 통해 객체의 내부 구현을 외부로부터 숨기고(정보 은닉, Information Hiding), 오직 외부에 공개된 메서드를 통해서만 데이터와 상호작용하도록 유도할 수 있습니다. 결과적으로 객체의 무결성(Integrity)을 보장하고, 유지보수성과 재사용성을 높일 수 있습니다.
쉽게 비유하자면, 캡슐화는 알약과 같습니다. 알약의 캡슐은 내부의 약 성분(데이터)을 보호하며, 우리는 캡슐을 통째로 삼키는(메서드 호출) 것만으로 약의 효능을 얻습니다. 내부 성분을 직접 다루지 않아도 되는 것과 같은 원리입니다.
캡슐화를 제대로 구현하려면 무엇을 숨기고(private) 무엇을 노출할지(public) 신중하게 결정해야 합니다. 이 결정의 기준은 "외부에서 꼭 필요한가?" 입니다.
캡슐화의 제1원칙은 모든 데이터(멤버 변수)를
private으로 선언하여 외부로부터 숨기는 것입니다.
만약 데이터가 public으로 공개되어 있다면, 어떤 외부 클래스라도 해당 객체의 데이터를 마음대로 변경할 수 있습니다. 이는 다음과 같은 심각한 문제를 야기합니다.
자동차 비유
우리가 자동차를 운전할 때, 엔진 내부의 부품이나 속도계를 직접 조작하지 않습니다. 대신 자동차가 제공하는 엑셀(메서드)을 밟으면, 자동차 내부의 복잡한 시스템이 알아서 속도를 조절합니다. 여기서 엔진 부품과 속도계는 데이터이고, 엑셀은 외부에 공개된 기능(메서드)입니다. 데이터에 직접 접근하는 것은 매우 위험하며, 객체가 제공하는 안전한 기능을 통해 접근해야 합니다.
데이터에 대한 접근은 반드시 해당 객체가 제공하는 공개된 메서드(주로 Getter/Setter)를 통해 이루어져야 합니다. 이를 통해 데이터 변경 전 유효성 검사를 하거나, 특정 로직을 수행하는 등 데이터의 일관성과 무결성을 유지할 수 있습니다.
객체의 모든 기능(메서드)을 외부에 공개할 필요는 없습니다. 많은 경우, 특정 기능은 객체 내부에서 다른 기능을 돕기 위한 보조적인 역할만 수행합니다.
public으로 공개해야 합니다.public 메서드의 로직이 너무 길고 복잡할 때, 코드를 더 작은 단위로 나누어 가독성을 높이거나 중복 코드를 제거하기 위해 사용됩니다. 이러한 내부 구현 로직은 외부에 노출할 필요가 없으며, 숨기는 것이 좋습니다.자동차 비유
운전자는 자동차를 운행하기 위해 엑셀, 브레이크, 핸들, 기어와 같은 핵심 기능만 알면 됩니다. 자동차 내부에서 일어나는 복잡한 엔진 제어, 배기 가스 처리 등의 세부적인 기능까지 알 필요도 없고, 직접 조작할 수도 없습니다. 이처럼 사용자 입장에서 꼭 필요한 핵심 기능만 외부에 노출하고, 나머지는 모두 내부로 숨겨 복잡성을 낮춰야 합니다.
이러한 캡슐화 원칙을 프로그래밍 언어에서 구현할 수 있도록 지원하는 문법이 바로 접근 제어자입니다.
private: 외부로부터 데이터를 안전하게 숨깁니다.public: 외부에 기능을 안전하게 공개합니다.protected, default: 특정 관계(상속, 패키지)에 있는 클래스에게만 제한적으로 접근을 허용합니다.데이터는 모두 숨기고(
private), 기능은 꼭 필요한 것만 외부에 노출(public)하는 것입니다.
잘 설계된 캡슐화는 다음과 같은 장점을 제공합니다.