SPRING&BOOT

캡슐화(Encapsulation)

jki09871 2024. 8. 28. 12:00
캡슐화(Encapsulation)는 객체지향 프로그래밍의 핵심 원칙 중 하나로, 객체의 데이터(필드)와 행위(메서드)를 결합하여 객체 내부에 감추고, 외부에는 필요한 부분만 노출하는 방식을 말한다. 이 포스트에서는 캡슐화가 무엇인지, 왜 중요한지, 그리고 실제 코드 예제를 통해 캡슐화를 어떻게 구현할 수 있는지 상세하게 살펴본다.

캡슐화의 정의와 중요성

캡슐화는 객체의 상세한 구현 내용을 숨기는 것을 목적으로 한다. 이를 통해 객체의 내부 데이터를 보호하고, 외부의 잘못된 사용으로부터 객체를 보호할 수 있다. 또한, 객체의 사용 방법만을 외부에 노출시키므로, 사용자는 객체가 '무엇'을 할 수 있는지만 알면 되고, 객체가 '어떻게' 그 일을 하는지는 알 필요가 없다. 이런 특성 때문에 캡슐화는 객체지향 설계의 기본이 되며 다음과 같은 이점을 제공한다.

  1. 모듈화: 객체의 내부 구현을 외부와 독립적으로 만들어, 시스템의 각 부분을 독립적으로 개발할 수 있다.
  2. 은닉화: 객체의 복잡한 내부 구현을 숨기고, 필요한 부분만 인터페이스로 제공함으로써 사용의 단순성을 제공한다.
  3. 재사용성 및 유지보수성 향상: 객체가 잘 정의된 인터페이스를 통해 상호작용하므로, 내부 구현 변경이 외부에 영향을 미치지 않아 재사용성과 유지보수성이 향상된다.

캡슐화 구현 예제

다음은 은행 계좌를 모델링한 간단한 Java 클래스로, 캡슐화를 구현하는 방법을 보여준다.

public class 은행계좌 {
    private double 잔액;  // 계좌 잔액은 외부에서 직접 접근할 수 없도록 private으로 선언

    public 은행계좌(double 초기잔액) {
        if (초기잔액 < 0) {
            throw new IllegalArgumentException("초기 잔액은 음수가 될 수 없습니다.");
        }
        this.잔액 = 초기잔액;
    }

    public double 잔액확인() {
        return 잔액;
    }

    public void 입금(double 금액) {
        if (금액 < 0) {
            throw new IllegalArgumentException("입금 금액은 음수가 될 수 없습니다.");
        }
        잔액 += 금액;
    }

    public void 출금(double 금액) {
        if (금액 < 0) {
            throw new IllegalArgumentException("출금 금액은 음수가 될 수 없습니다.");
        }
        if (금액 > 잔액) {
            throw new IllegalArgumentException("잔액이 부족합니다.");
        }
        잔액 -= 금액;
    }
}

이 클래스에서 은행계좌 클래스는 자신의 잔액을 스스로 관리하며, 외부의 잘못된 사용으로부터 데이터를 보호합니다. 입금(입금)과 출금(출금) 메서드를 통해서만 잔액이 변경되며, 이 메서드들은 금액이 음수인 경우에 예외를 발생시키는 등의 검증 로직을 포함합니다.

 

결론

캡슐화는 객체의 구현을 숨기고, 사용 인터페이스만을 노출하여, 객체의 사용을 단순하고 안전하게 만든다. 이는 개발자가 시스템의 각 부분을 독립적으로 개발하고 유지보수할 수 있게 하며, 전체적인 시스템의 안정성과 품질을 높이는 데 기여한다. 따라서, 캡슐화는 소프트웨어 설계에서 매우 중요한 개념이며, 객체지향 프로그래밍에서 깊이 이해하고 활용해야 할 원칙 중 하나다.