어제 오늘 내일

[Java] 캡슐화(Encapsulation)란? 본문

IT/Java

[Java] 캡슐화(Encapsulation)란?

hi.anna 2025. 12. 27. 00:56

Java의 캡슐화(Encapsulation)는 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로,
객체의 데이터(필드)를 외부에서 직접 접근하지 못하도록 숨기고, 필요한 경우 메서드를 통해서만 접근하도록 만드는 것을 의미합니다.
이를 통해 데이터 보호, 잘못된 접근 방지, 유지보수성 향상 등의 효과를 얻을 수 있습니다.

 

1. 캡슐화의 핵심 개념

캡슐화는 크게 두 가지 원칙으로 구성됩니다.

  1. 필드(변수)를 private으로 감추기 (정보 은닉)
  2. getter/setter 같은 공개된 메서드를 통해 접근하도록 제한하기

예:

private int age;       // 외부에서 직접 접근 불가
public int getAge() {  // 메서드를 통해서만 접근
    return age;
}
public void setAge(int age) {
    this.age = age;
}

이렇게 하면 데이터를 언제든지 보호하거나 유효성 검사 로직을 추가할 수 있습니다.

 

2. 왜 캡슐화가 필요할까?

✔ 잘못된 데이터 변경 방지

직접 필드를 수정하는 것을 막고, setter에서 유효성 검사를 적용할 수 있습니다.

✔ 내부 구조 숨기기

객체 내부의 동작 방식이 외부에 노출되지 않아 코드가 안전해짐.

✔ 유지보수성과 확장성 향상

내부 구현이 바뀌어도 외부 코드는 그대로 사용할 수 있음.

✔ 객체 일관성 유지

값 변경 시 조건 검사를 수행하여 객체가 올바른 상태를 유지하도록 함.

 

3. 캡슐화 예제

잘못된 예: 필드를 public으로 사용

class Person {
    public int age;
}

문제점

  • 외부에서 누구나 마음대로 값을 변경할 수 있음
  • 유효성 검사나 보호 로직을 적용할 수 없음

올바른 캡슐화 예

class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0) {               // 유효성 검사
            System.out.println("나이는 0보다 작을 수 없습니다.");
            return;
        }
        this.age = age;
    }
}

사용:

Person p = new Person();
p.setAge(20); // 정상 설정
p.setAge(-5); // 경고 메시지 출력

 

4. 캡슐화 + 접근 제어자

캡슐화는 접근 제어자와 밀접하게 연관됩니다.

제어자 의미 캡슐화에 사용 여부
private 클래스 내부에서만 접근 ✔ 핵심
default 같은 패키지에서만 접근
protected 상속 + 같은 패키지 접근
public 어디서든 접근 가능 getter/setter에서 사용

캡슐화의 핵심은 필드 = private, 메서드 = public 형태의 구조입니다.

 

5. 캡슐화를 더 쉽게 하는 도구 (Lombok)

Lombok을 사용하면 getter/setter를 자동 생성해 편하게 캡슐화를 적용할 수 있습니다.

@Getter
@Setter
class Person {
    private int age;
}

 

6. 전체 예제

class BankAccount {
    private int balance;

    public int getBalance() {  // 조회
        return balance;
    }

    public void deposit(int amount) {  // 입금
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(int amount) { // 출금
        if (amount > 0 && balance >= amount) {
            balance -= amount;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount acc = new BankAccount();
        acc.deposit(1000);
        acc.withdraw(300);
        System.out.println(acc.getBalance()); // 700
    }
}

설명

  • balance는 외부에서 직접 조작 불가
  • 메서드를 통해서만 안전하게 입·출금 가능
  • 객체의 상태를 안정적으로 유지

 

7. 정리

  • 캡슐화 = 데이터 보호 + 접근 제어 + 안전한 메서드 제공
  • 필드는 private으로 감추고, 메서드로만 접근하게 함
  • 객체의 안정성, 유지보수성, 확장성을 크게 향상시키는 중요한 개념

 

 

반응형
Comments