[Java] 객체지향 - 캡슐화

서연·2025년 4월 24일

Java

목록 보기
19/36

캡슐화

  • 객체의 정보를 외부에서 직접 접근하지 못하게 보호하는 개념이다.
  • 클래스 혹은 객체의 캡슐화는 접근제어자를 통해서 구현할 수 있다.

캡슐화가 필요한 이유

  • 캡슐화를 통해 정보를 보호하고 필요한 경우에만 안전하게 접근할 수 있도록 한다.

접근제어자(Access Modifier)

  • 접근제어자는 클래스, 변수, 메서드, 생성자의 접근 범위를 제한하는 키워드이다.
접근제어자클래스 내부패키지 내부상속한 클래스전체 공개
public
protected
default
private

데이터 접근 - 게터(Getter)와 세터(Setter)

✅ 캡슐화가 된 데이터에 접근 방법

  • 캡슐화가 잘 적용된 클래스는 내부 데이터를 private으로 보호하고 있다.
  • 데이터 조회나 변경이 필요한 경우 안전하게 접근하기 위해 게터세터 메서드를 사용한다.

✅ 게터(Getter) 활용법

  • 데이터를 안전하게 접근하기 위해 사용된다.
public class Person { 
    private String secret;
    
    public String getSecret() {
		    return this.secret; // ✅ 객체의 secret 속성 반환
    }
}
public class Main {
    public static void main(String[] args) {
		    Person p1 = new Person();
		    p1.secret; // ❌ 직접 접근 불가능
		    String newSecret = p1.getSecret(); // ✅ 게터를 활용해 접근가능
    }
}

✅ 세터(Setter) 활용법

  • 데이터를 안전하게 설정/변경하기 위해 사용된다.
public class Person { 
    private String secret;
    
    public void setSecret(String secret) {
		    this.secret = secret; // ✅ secret 속성 설정 및 변경
    }
}
public class Main {
    public static void main(String[] args) {
		    Person p1 = new Person();
		    p1.secret = "password"; // ❌ 직접접근, 변경 불가능
		    p1.setSecret("newPassword"); // ✅ 세터를 활용해 접근, 변경가능
    }
}

⚠️ 무분별한 세터

public class DataStore {
    String store;
}
DataStore dataStore = new DataStore();
dataStore.store = "B"; // ❌ 의문의 핵폭발 발생!
  • store 변수에 문자열 "B"가 들어오면 핵폭발이 발생하는 시스템이다.

해결책 1: 접근제어자로 데이터 보호

public class DataStore {

    private String store; 
}
DataStore dataStore = new DataStore();
dataStore.store = "B"; // ❌ 컴파일 오류! 직접 접근 불가!
  • store 변수에 private 접근제어자를 설정하면 외부에서 직접 변경할 수 없게 되어 핵폭발을 막을 수 있다.
  • 하지만 데이터를 아예 사용할 수 없게 되었다. 어떤 데이터도 저장할 수 없다면 이 클래스는 쓸모가 없어진다.

해결책 2: 세터 추가

public class DataStore {
    private String store; 
    
    public void setStore(String data) {
        this.store = data;
    }
}
DataStore dataStore = new DataStore();
dataStore.setStore("B"); // ❌ 다시 핵폭발 발생!
  • store 변수는 private 이지만 세터를 통해 외부에서 값을 변경할 수 있다.
  • 하지만 다시 "B"를 넣으면 핵폭발이 발생한다.

해결책 3: 안전한 데이터 설정 로직을 추가

public class DataStore {
    private String store; 
    
    public void setStore(String data) {
        if ("B".equals(data)) {
            System.out.println("❌ 'B'는 입력할 수 없습니다!");
        } else {
		        this.store = data;
        }
    }
}
  • "B"가 입력되면 입력할 수 없다는 메세지를 제공한다.
  • 데이터는 안전하게 저장되고 원하지 않는 값이 들어오는 것도 막을 수 있다.

0개의 댓글