[Java] Java 캡슐화

artp·2025년 10월 15일

java

목록 보기
31/32
post-thumbnail

캡슐화(Encapsulation)는 객체 지향 프로그래밍(OOP)의 4대 핵심 원칙(캡슐화, 상속, 다형성, 추상화) 중 하나입니다. 캡슐화란 데이터(속성)와 해당 데이터를 처리하는 메서드(기능)를 하나의 단위인 객체로 묶고, 데이터가 외부에서 직접 접근하는 것을 제한하는 것을 의미합니다.

이를 통해 객체의 내부 구현을 외부로부터 숨기고(정보 은닉, Information Hiding), 오직 외부에 공개된 메서드를 통해서만 데이터와 상호작용하도록 유도할 수 있습니다. 결과적으로 객체의 무결성(Integrity)을 보장하고, 유지보수성과 재사용성을 높일 수 있습니다.

쉽게 비유하자면, 캡슐화는 알약과 같습니다. 알약의 캡슐은 내부의 약 성분(데이터)을 보호하며, 우리는 캡슐을 통째로 삼키는(메서드 호출) 것만으로 약의 효능을 얻습니다. 내부 성분을 직접 다루지 않아도 되는 것과 같은 원리입니다.

캡슐화의 핵심: 무엇을 숨기고 무엇을 노출할 것인가?

캡슐화를 제대로 구현하려면 무엇을 숨기고(private) 무엇을 노출할지(public) 신중하게 결정해야 합니다. 이 결정의 기준은 "외부에서 꼭 필요한가?" 입니다.

1. 데이터(속성, 필드)는 반드시 숨겨라

캡슐화의 제1원칙은 모든 데이터(멤버 변수)를 private으로 선언하여 외부로부터 숨기는 것입니다.

만약 데이터가 public으로 공개되어 있다면, 어떤 외부 클래스라도 해당 객체의 데이터를 마음대로 변경할 수 있습니다. 이는 다음과 같은 심각한 문제를 야기합니다.

  • 데이터 무결성 훼손: 객체가 스스로 정한 유효성 검사(예: 나이는 0 이상)나 상태 변경 로직을 모두 무시하고 데이터가 변경될 수 있습니다.
  • 유지보수의 어려움: 데이터의 형식이 바뀌거나 이름이 변경되면, 이 데이터를 직접 참조하는 모든 외부 코드를 일일이 찾아 수정해야 합니다.

자동차 비유
우리가 자동차를 운전할 때, 엔진 내부의 부품이나 속도계를 직접 조작하지 않습니다. 대신 자동차가 제공하는 엑셀(메서드)을 밟으면, 자동차 내부의 복잡한 시스템이 알아서 속도를 조절합니다. 여기서 엔진 부품과 속도계는 데이터이고, 엑셀은 외부에 공개된 기능(메서드)입니다. 데이터에 직접 접근하는 것은 매우 위험하며, 객체가 제공하는 안전한 기능을 통해 접근해야 합니다.

데이터에 대한 접근은 반드시 해당 객체가 제공하는 공개된 메서드(주로 Getter/Setter)를 통해 이루어져야 합니다. 이를 통해 데이터 변경 전 유효성 검사를 하거나, 특정 로직을 수행하는 등 데이터의 일관성과 무결성을 유지할 수 있습니다.

2. 기능(메서드)은 필요한 것만 노출하라

객체의 모든 기능(메서드)을 외부에 공개할 필요는 없습니다. 많은 경우, 특정 기능은 객체 내부에서 다른 기능을 돕기 위한 보조적인 역할만 수행합니다.

  • Public 메서드: 외부 세계와의 소통 창구 역할을 하는 공식 인터페이스(API)입니다. 이 객체를 사용하는 다른 개발자들이 반드시 알아야 하고, 사용해야 하는 기능만 public으로 공개해야 합니다.
  • Private 메서드: 객체 내부에서만 사용되는 기능입니다. 주로 public 메서드의 로직이 너무 길고 복잡할 때, 코드를 더 작은 단위로 나누어 가독성을 높이거나 중복 코드를 제거하기 위해 사용됩니다. 이러한 내부 구현 로직은 외부에 노출할 필요가 없으며, 숨기는 것이 좋습니다.

자동차 비유
운전자는 자동차를 운행하기 위해 엑셀, 브레이크, 핸들, 기어와 같은 핵심 기능만 알면 됩니다. 자동차 내부에서 일어나는 복잡한 엔진 제어, 배기 가스 처리 등의 세부적인 기능까지 알 필요도 없고, 직접 조작할 수도 없습니다. 이처럼 사용자 입장에서 꼭 필요한 핵심 기능만 외부에 노출하고, 나머지는 모두 내부로 숨겨 복잡성을 낮춰야 합니다.

캡슐화의 완성: 접근 제어자 (Access Modifiers)

이러한 캡슐화 원칙을 프로그래밍 언어에서 구현할 수 있도록 지원하는 문법이 바로 접근 제어자입니다.

  • private: 외부로부터 데이터를 안전하게 숨깁니다.
  • public: 외부에 기능을 안전하게 공개합니다.
  • protected, default: 특정 관계(상속, 패키지)에 있는 클래스에게만 제한적으로 접근을 허용합니다.

좋은 캡슐화란?

데이터는 모두 숨기고(private), 기능은 꼭 필요한 것만 외부에 노출(public)하는 것입니다.

잘 설계된 캡슐화는 다음과 같은 장점을 제공합니다.

  • 객체의 자율성 및 무결성 보장: 객체 스스로 자신의 상태를 관리하고 보호합니다.
  • 낮은 결합도(Loose Coupling): 내부 구현이 변경되어도 외부에 영향을 주지 않으므로, 시스템의 다른 부분과 독립적으로 수정 및 개선이 가능합니다.
  • 높은 응집도(High Cohesion): 관련된 데이터와 기능이 하나의 단위로 묶여 있어 코드의 이해와 관리가 용이합니다.
  • 유지보수성 및 재사용성 향상: 모듈화가 잘 되어 있어 수정이 쉽고, 다른 시스템에서도 해당 객체를 쉽게 가져다 사용할 수 있습니다.
profile
donggyun_ee

0개의 댓글