- [Java] 정보 은닉과 캡슐화: 객체 지향 프로그래밍의 핵심 원칙2025년 06월 08일 21시 08분 53초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
정보 은닉과 캡슐화: 객체 지향 프로그래밍의 핵심 원칙
객체 지향 프로그래밍(OOP)에서 정보 은닉과 캡슐화는 자주 함께 언급되는 핵심 원칙이다. 두 개념은 서로 밀접하게 연결되어 있지만, 그 의미와 목적은 다르다. 이 글에서는 캡슐화와 정보 은닉을 명확히 구분하고, 이를 구현하는 실제 사례를 통해 OOP의 원칙을 올바르게 이해해보자.
1. 캡슐화(Encapsulation)
1.1 정의
캡슐화는 객체 지향 설계에서 관련된 데이터(속성)와 이 데이터를 다루는 메서드(행동)를 하나의 논리적 단위인 클래스로 묶고, 외부에는 필요한 기능만을 인터페이스 형태로 제공하는 설계 원칙이다. 단순히 변수와 함수를 물리적으로 한 클래스 안에 넣는 것만을 의미하지 않으며, 내부 구현은 감추고, 필요한 기능만 제공하는 명확한 경계를 설정하는 것이 중요하다.
1.2 목적
- 응집도(Cohesion) 향상: 관련 기능과 데이터를 한곳에 모아 관리하기 쉽다.
- 인터페이스 단순화: 외부에서 객체의 내부 구조나 복잡한 과정을 몰라도 사용할 수 있다.
- 유지보수성 향상: 내부 구현을 변경해도 외부 코드에 영향을 최소화할 수 있다.
1.3 예시: UserService 클래스
다음은 사용자 등록 기능을 담당하는
UserService클래스이다.public class UserService { private UserRepository userRepository; private PasswordEncoder passwordEncoder; private EmailService emailService; public User registerUser(UserRegistrationRequest request) { validateUserData(request); String encodedPassword = passwordEncoder.encode(request.getPassword()); User user = new User(request.getEmail(), encodedPassword); User savedUser = userRepository.save(user); sendWelcomeEmail(savedUser); return savedUser; } private void validateUserData(UserRegistrationRequest request) { // 유효성 검사 로직 } private void sendWelcomeEmail(User user) { // 이메일 발송 로직 } }위 예제에서
UserService클래스는 사용자 등록에 필요한 모든 데이터를 내부에 갖고 있고, 이를 다루는 기능도 포함하고 있다. 이처럼 관련 데이터와 기능이 하나의 논리적 단위로 묶여 있고, 외부에는registerUser()라는 간단한 인터페이스만 제공된다. 이러한 구조가 캡슐화가 잘 적용된 예이다.특히 주의할 점은
registerUser()메서드가 캡슐화를 구현하는 클래스 내부의 인터페이스 역할을 한다는 것이다. 캡슐화는 메서드 단위가 아니라 클래스 단위에서 이루어지며, 메서드는 그 구현을 도와주는 구성요소이다.2. 정보 은닉(Information Hiding)
2.1 정의
정보 은닉은 객체의 내부 구현 세부사항을 외부로부터 숨기고, 오직 정해진 인터페이스를 통해서만 상호작용하게 만드는 설계 기법이다. 보통
private,protected와 같은 **접근 제어자(access modifier)**를 사용해 구현된다.2.2 목적
- 데이터 무결성 보장: 외부에서 직접 필드를 변경하지 못하게 하여 상태를 안전하게 유지한다.
- 결합도(Coupling) 감소: 객체 간 의존도를 줄여 시스템을 느슨하게 연결한다.
- 구현 유연성 확보: 내부 구현을 변경해도 외부 인터페이스는 유지할 수 있다.
2.3 예시: BankAccount 클래스
public class BankAccount { private double balance; public void deposit(double amount) { if (amount > 0) { balance += amount; } } public boolean withdraw(double amount) { if (amount > 0 && amount <= balance) { balance -= amount; return true; } return false; } public double getBalance() { return balance; } }위 코드에서
balance필드는private으로 선언되어 외부에서 직접 접근할 수 없다. 대신deposit(),withdraw(),getBalance()메서드를 통해서만 접근이 가능하다. 이것이 정보 은닉의 대표적인 예이다.정보 은닉은 캡슐화를 가능하게 하는 구체적인 기법이며, 캡슐화가 적용된 클래스에서는 일반적으로 정보 은닉도 함께 적용된다.
3. 캡슐화와 추상화의 관계
**추상화(abstraction)**는 복잡한 시스템을 단순한 개념으로 표현하는 것이다. 내부 구현의 복잡성을 숨기고, 핵심적인 기능만 외부에 제공한다는 점에서 캡슐화와 유사한 목표를 가지며, 캡슐화와 함께 사용될 때 시너지를 낸다.
예시: 자동차 클래스
public class Car { private Engine engine; private FuelSystem fuelSystem; private BrakeSystem brakeSystem; private TransmissionSystem transmission; public void start() { if (fuelSystem.hasFuel()) { engine.ignite(); transmission.engage(); System.out.println("자동차 시동 완료"); } else { System.out.println("연료가 부족합니다."); } } public void accelerate() { engine.increasePower(); System.out.println("가속 중"); } public void brake() { brakeSystem.apply(); engine.decreasePower(); System.out.println("감속 중"); } }이 클래스는 캡슐화를 통해 자동차의 다양한 부품과 동작을 하나의 단위로 묶고 있으며, 추상화를 통해 시동, 가속, 감속이라는 단순한 인터페이스를 외부에 제공한다. 사용자는 내부에서 어떤 복잡한 로직이 실행되는지 몰라도
start(),accelerate(),brake()메서드만으로 자동차를 제어할 수 있다.4. 정리
개념 정의 역할 캡슐화 관련 데이터와 메서드를 하나의 단위(클래스)로 묶고, 외부에는 필요한 인터페이스만 제공하는 것 구조화와 인터페이스 제공 정보 은닉 내부 구현 세부사항을 감추고, 외부에서 직접 접근하지 못하도록 하는 것 구현 세부 보호 추상화 복잡한 로직을 단순한 개념으로 표현하고 외부에 단순한 인터페이스 제공 단순화와 명확한 사용 이 세 가지 개념은 객체 지향 설계의 핵심을 이루며, 잘 조화되었을 때 높은 응집도, 낮은 결합도, 유지보수성과 확장성이 뛰어난 소프트웨어 구조를 만들 수 있다.
728x90반응형'언어·프레임워크 > Java' 카테고리의 다른 글
[Java ] `System.identityHashCode()`와 `hashCode()` 메서드의 차이점 (1) 2025.06.14 [Java] 인터페이스 개념을 USB로 이해하기 (2) 2025.06.08 [Java] 자바에서 Iterator를 사용하는 이유 (0) 2025.03.01 [Java] 윈도우에서 여러개의 Java 버전 관리 하기 (0) 2024.07.26 [Java] 추상 클래스(Abstract Class)와 인터페이스(Interface) (0) 2024.02.02 다음글이 없습니다.이전글이 없습니다.댓글