728x90
반응형
캡슐화(Encapsulation) 란?
캡슐화(Encapulation)는 객체 지향 프로그래밍(OOP)의 중요한 개념으로 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어 외부에서의 접근을 제한하는 것이다. 즉, 객체 내부의 속성이나 행위(상세한 구현)를 숨기고 외부에서 접근할 수 없도록(외부에서는 오직 특정 메서드를 통해서만 객체의 상태를 조작할 수 있도록)하는 것이다.
→ 정보 은닉(Information Hiding) : 프로그램의 세부적 구현 내용을 외부에 드러나지 않도록 감추는 것
외부에 공개되기에 민감한 로직이 있는 프로그램에서 (결제 프로그램 등) 캡슐화가 이루어지지 않는다면, 악용할 수 있어 보안적으로 문제가 생길 수 있다. 또한 외부에서 내부 속성에 접근하여 사용하게 되면, 결합도가 높아지고 응집도가 낮아져서 다른 객체의 영향을 받을 수 있기 땨문에 유지보수가 힘들 수도 있다.
어떤 것을 숨겨야 할까?
1. 데이터 은닉
객체에는 속성와 기능이 있는데 캡슐화에서는 꼭 속성을 숨겨야 한다.
객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다. (접근자 메서드: getter, setter 등)
2. 최소한의 노출
기능도 외부에서 사용하지 않고, 내부에서만 사용한다면 숨겨야 한다. 즉, 사용자가 필요로 하는 기능만 외부로 노출하고, 나머지 기능은 모두 내부로 숨겨야 한다.
캡슐화를 하기 위해 접근 제어자를 사용한다.
접근 제어자
접근 제어자를 사용해서 접근 권한을 지정할 수 있다.
- private : 동일한 클래스 안에서만 접근 가능
- default (package-private) : 동일한 패키지 안에서만 접근 가능 (접근 제어자를 명시하지 않을 때)
- protected : 동일한 패키지 안에서 접근 가능하고, 다른 패키지라도 상속받은 하위 클래스에서도 접근 가능
- public : 모든 객체에서 접근 가능
예제)
public class Animal {
private String name;
private int age;
// 생성자
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
// 정보 은닉된 멤버 변수에 접근하는 메서드들
public String getName() {
return name;
}
public void setName(String name) {
// 유효성 검사
if (name != null && !name.isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
// 유효성 검사
if (age > 0) {
this.age = age;
}
}
// 동물의 소리를 출력하는 메서드
public void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
- private 으로 선언된 필드는 외부에서 직접 접근할 수 없다.
private String name;
private int age; - 메서드를 통해 해당 멤버 변수로 접근할 수 있다.
getName(), setName(), getAge(), setAge()
public class Main {
public static void main(String[] args) {
//객체 생성
Animal myPet = new Animal("댕댕이", 3);
// 캡슐화된 멤버 변수에 접근
System.out.println("이름: " + myPet.getName());
System.out.println("나이: " + myPet.getAge());
// 캡슐화된 메서드를 통한 값 변경
myPet.setName("캣츠");
myPet.setAge(4);
// 동물의 소리 출력
myPet.makeSound();
}
}
- 컴파일 에러(Compile Error): myPet.name = "고양이";
멤버 변수를 private으로 막았기 때문에 외부에서 직접적으로 변수에 접근할 수 없다.
728x90
반응형
'CS > Java' 카테고리의 다른 글
[Java] 스트림(Stream) (0) | 2024.02.19 |
---|---|
[Java] 람다식 (lambda expression)/함수형 인터페이스(FunctionalInterface)/메서드 참조(Method reference) (0) | 2024.02.19 |
댓글