본문 바로가기

JAVA

[JAVA] 캡슐화란?

🛡️ 캡슐화 (Encapsulation)

캡슐화데이터(속성, 필드)와 그 데이터를 다루는 메서드(기능)를 하나로 묶고, 외부로부터 접근을 제한하는 것을 의미한다.

캡슐화의 주된 목적은 데이터의 무결성(Integrity)을 보호하고, 코드의 응집도(Cohesion)를 높이며, 결합도(Coupling)를 낮춰 유지보수와 재사용성을 향상시키는 데에 있다.

1. 데이터를 숨겨라 (Information Hiding)

객체의 속성(데이터)은 대부분 private 접근 제어자를 사용하여 외부에서 직접 접근하거나 변경할 수 없도록 숨긴다.

왜 데이터를 숨겨야 할까?

  • 만약 객체의 내부 데이터가 외부에 노출되어 아무나 직접 수정할 수 있다면, 예상치 못한 값으로 데이터가 변경되어 프로그램에 오류가 발생할 수 있다. (예: 은행 계좌 잔액(balance)이 public이라면, 누구나 account.balance = -100;처럼 유효하지 않은 값으로 직접 설정할 수 있게 된다.)
  • 내부 데이터 구조가 변경되더라도, 데이터를 조작하는 메서드만 수정하면 되므로, 외부에서는 변경 사실을 알 필요가 없어진다.
  • 데이터가 변경될 때마다 특정 조건을 만족하는지(예: 잔액이 0보다 커야 함) 메서드 내부에서 유효성 검사를 수행하여 잘못된 데이터가 저장되는 것을 막을 수 있다.

음악 플레이어를 비유로 들자면, 우리가 플레이어를 사용할 때, 플레이어의 내부 회로나 전원부 데이터를 직접 조작하지 않는다. 그저 직관적으로 '전원 버튼'을 누르면 전원이 켜지고 '볼륨 조절 버튼'을 통해서 높이거나 낮출 뿐인데, 이 버튼들이 바로 public 메서드에 해당한다고 할 수 있다.

객체의 데이터는 반드시 객체가 제공하는 public 메서드를 통해서만 간접적으로 접근, 조작해야 한다.

2. 기능을 숨겨라 (Method Hiding)

모든 메서드를 외부에 노출할 필요는 없다. 클래스 내부에서만 사용되고, 외부에 직접 제공할 필요 없는 복잡한 로직이나 중간 단계의 기능은 private 접근 제어자를 사용하여 숨기는 것이 좋다.

  • 사용자 관점의 단순성 제공: 사용자(다른 개발자) 입장에서는 복잡한 내부 동작을 알 필요 없이, 필요한 public 메서드만 호출하여 기능을 사용하면 된다. 이는 인터페이스를 단순화하고 사용 편의성을 높일 수 있다.
  • 내부 구현 변경의 자유: private 메서드는 언제든지 내부 구현이 변경되어도 외부에 영향을 주지 않으므로, 개발자는 더 자유롭게 코드를 리팩토링하고 개선할 수 있다.

🤝 접근 제어자와 캡슐화의 관계

접근 제어자는 캡슐화를 구현하는 구체적인 도구다. private, protected, default, public이라는 제어자를 사용하여 데이터와 기능의 접근 범위를 명시적으로 제어함으로써 캡슐화의 원칙을 지킬 수 있다. 캡슐화는 데이터를 안전하게 보호할 뿐만 아니라, 객체의 사용법을 단순화하고, 코드의 유지보수성을 크게 향상시키는 중요한 객체 지향 원칙이다.