Java

05 캡슐화란?

lunina 2024. 12. 29. 22:05

캡슐화(Encapsulation)란 객체 지향 프로그래밍의 기본 원칙 중 하나로, 데이터(필드)와 그 데이터를 조작하는 메서드(행동)를 하나의 단위로 묶고, 외부에서 직접 접근하지 못하도록 제한하여 데이터의 무결성을 보장하는 개념

즉, 객체의 데이터를 안전하게 보호하고, 외부와의 상호작용을 메서드로 제한함으로써 코드의 안정성과 유지보수성을 높이는 데 중요한 역할을 한다. 자바에서는 접근 제어자(private, protected, public)와 getter/setter를 통해 캡슐화를 구현합니다.

 

  1. 정보 은닉:
    • 클래스 내부의 데이터를 외부에서 직접 접근하지 못하게 하고, 필요한 경우 메서드를 통해서만 접근할 수 있다.
    • 주로 private 접근 제어자를 사용하여 필드(멤버 변수)를 보호
  2. Getter와 Setter 사용:
    • 데이터를 읽거나 수정하기 위해 getter와 setter 메서드를 제공합니다. 이로써 데이터에 접근하거나 수정할 때 추가적인 검증 로직을 쉽게 구현
  3. 데이터 보호:
    • 외부 코드가 객체의 내부 상태를 무분별하게 변경하지 못하도록 방지

코드 예시

public class Person {
    // 필드 (private으로 선언하여 외부에서 직접 접근 불가능)
    private String name;
    private int age;

    // Getter (필드 값을 읽기 위한 메서드)
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Setter (필드 값을 설정하기 위한 메서드)
    public void setName(String name) {
        // 데이터 유효성 검사 로직 추가 가능
        if (name != null && !name.isEmpty()) {
            this.name = name;
        }
    }

    public void setAge(int age) {
        if (age > 0) { // 나이는 0보다 커야 한다는 조건 추가
            this.age = age;
        }
    }
}

주요 특징 및 장점

  1. 유지보수 용이:
    • 데이터가 외부에서 직접 접근할 수 없으므로 내부 구현을 변경하더라도 외부 코드에 영향을 미치지 않는다.
  2. 데이터 무결성 보장:
    • 잘못된 데이터가 객체에 저장되지 않도록 setter 메서드에서 유효성 검사를 구현할 수 있다.
  3. 모듈화:
    • 객체의 내부 구조를 숨기고, 외부에 필요한 인터페이스만 제공함으로써 객체를 독립적으로 설계하고 사용할 수 있다.
  4. 보안 강화:
    • 중요한 데이터를 캡슐화하여 접근 권한을 제한함으로써 보안을 강화.

getter와 setter 가 뭔데?


getter와 setter는 객체 지향 프로그래밍에서 캡슐화를 구현하기 위해 사용되는 메서드이며ㅏ데이터에 접근하고 수정할 때 이 메서드를 사용해 데이터를 안전하게 관리할 수 있다.

1. Getter : 값을 가져오는 메서드

  • 필드(멤버 변수)의 값을 읽기 위해 사용하는 메서드
  • 보통 get필드명() 형식으로 메서드를 작성한다.
public String getName() {
    return name;
}

위의 getName 메서드는 name 필드 값을 반환합니다.


2. Setter :  설정하는 메서드

  • 필드(멤버 변수)의 값을 설정(변경)하기 위해 사용하는 메서드
  • 보통 set필드명(매개변수) 형식으로 메서드를 작성한다.
  • 필요한 경우 값을 설정하기 전에 유효성 검사를 수행할 수 있다.
public void setName(String name) {
    if (name != null && !name.isEmpty()) { // 유효성 검사
        this.name = name;
    }
}

위의 setName 메서드는 유효한 값만 name 필드에 저장


3. 왜 사용하나요?

  • 필드를 private으로 숨기고, 대신 getter와 setter 메서드를 통해서만 간접적으로 접근하게 함으로써 데이터의 무결성을 유지
  • 외부에서 데이터를 마음대로 바꾸거나 읽을 수 없도록 보호

4. 전체 예제

public class Person {
    // private 필드 (캡슐화)
    private String name;
    private int age;

    // Getter
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Setter
    public void setName(String name) {
        if (name != null && !name.isEmpty()) { // 유효성 검사
            this.name = name;
        } else {
            System.out.println("Invalid name");
        }
    }

    public void setAge(int age) {
        if (age > 0) { // 나이는 0보다 커야 함
            this.age = age;
        } else {
            System.out.println("Invalid age");
        }
    }
}

5. 사용 예제

public class Main {
    public static void main(String[] args) {
        Person person = new Person();

        // Setter로 값 설정
        person.setName("John");
        person.setAge(25);

        // Getter로 값 가져오기
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

출력:

Name: John
Age: 25