데이터와 메서드를 하나의 객체로 묶어 외부에서 접근할 수 없도록 보호. 필요한 경우에만 접근할 수 있는 방법 제공.
객체 내부의 세부 구현을 숨기고(public) 외부에서는 정해진 인터페이스(메서드)만을 통해 접근하도록 제한.
데이터 보호 : 클래스 내부 데이터를 외부에서 직접 접근하지 못하게 하고, 필요한 경우 메서드를 통해서만 접근. 접근 제한자 이용
정보 은닉 : 외부 객체는 내부의 구현을 알 필요가 없음. 변경이 필요할 때 내부 로직만 수정하면 되므로 유지보수성 향상
Getter, Setter : Getter 메서드로 데이터를 읽을 수 있고, Setter 메서드로 데이터를 수정할 수 있도록 제한. Setter에서 데이터 유효성을 검증할 수 있어 잘못된 데이터의 입력 방지.
public class Person {
// 캡슐화된 속성 (private)
private String name;
private int age;
// Getter 메서드
public String getName() {
return name;
}
// Setter 메서드 (유효성 검증 포함)
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be null or empty");
}
this.name = name;
}
// Getter 메서드
public int getAge() {
return age;
}
// Setter 메서드 (유효성 검증 포함)
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
this.age = age;
}
}
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()); // Name: John
System.out.println("Age: " + person.getAge()); // Age: 25
}
}