Java
05 캡슐화란?
lunina
2024. 12. 29. 22:05
캡슐화(Encapsulation)란 객체 지향 프로그래밍의 기본 원칙 중 하나로, 데이터(필드)와 그 데이터를 조작하는 메서드(행동)를 하나의 단위로 묶고, 외부에서 직접 접근하지 못하도록 제한하여 데이터의 무결성을 보장하는 개념
즉, 객체의 데이터를 안전하게 보호하고, 외부와의 상호작용을 메서드로 제한함으로써 코드의 안정성과 유지보수성을 높이는 데 중요한 역할을 한다. 자바에서는 접근 제어자(private, protected, public)와 getter/setter를 통해 캡슐화를 구현합니다.
- 정보 은닉:
- 클래스 내부의 데이터를 외부에서 직접 접근하지 못하게 하고, 필요한 경우 메서드를 통해서만 접근할 수 있다.
- 주로 private 접근 제어자를 사용하여 필드(멤버 변수)를 보호
- Getter와 Setter 사용:
- 데이터를 읽거나 수정하기 위해 getter와 setter 메서드를 제공합니다. 이로써 데이터에 접근하거나 수정할 때 추가적인 검증 로직을 쉽게 구현
- 데이터 보호:
- 외부 코드가 객체의 내부 상태를 무분별하게 변경하지 못하도록 방지
코드 예시
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;
}
}
}
주요 특징 및 장점
- 유지보수 용이:
- 데이터가 외부에서 직접 접근할 수 없으므로 내부 구현을 변경하더라도 외부 코드에 영향을 미치지 않는다.
- 데이터 무결성 보장:
- 잘못된 데이터가 객체에 저장되지 않도록 setter 메서드에서 유효성 검사를 구현할 수 있다.
- 모듈화:
- 객체의 내부 구조를 숨기고, 외부에 필요한 인터페이스만 제공함으로써 객체를 독립적으로 설계하고 사용할 수 있다.
- 보안 강화:
- 중요한 데이터를 캡슐화하여 접근 권한을 제한함으로써 보안을 강화.
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