💁♀️ 캡슐화(Encapsulation)란,
결합도를 낮추기 위해 필드의 직접 접근을 제한하고 public 메소드를 이용해서 간접적으로 접근하여 사용할 수 있도록 만든 기술
🙋 잠깐 ! 필드(Field)부터 짚고 갑시다 !
💁 클래스에 포함된 변수를 의미하며 즉, 객체의 속성을 정의하는 공간
👉 '전역변수', '속성', '인스턴스 변수'라고도 부름
- 필드(전역변수) 생성
: 접근제한자 자료형 필드명; ex) private char gender; private int age;
- 필드(전역변수) 접근법
: 레퍼런스변수명.필드명 ex) cheese.gender cheese.age
- 필드에 직접 접근하여 변수처럼 사용
ex) cheese.gender = '남'; cheese.age = 2;
🙅 BUT, 이렇게 필드에 직접적으로 접근할 시 문제점이 발생
- 필드에 올바르지 않은 값이 들어가도 통제가 불가능
- 클래스의 일부를 수정하면 사용하는 곳에서도 전부 함께 수정해야하는 부담
(유지보수성 저하)
💁 클래스 혹은 클래스의 멤버(필드, 메소드)에 참조 연산자로 접근할 수 있는 범위를 제한하기 위한 키워드
public
: 모든 패키지에 접근 허용
protected
: 동일 패키지에 접근 허용. 단, 상속 관계에 있는 경우 다른 패키지에서도 접근 가능
default
: 동일 패키지에서만 접근 허용 (작성하지않는 것이 default)
private
: 해당 클래스 내부에서만 접근 허용
위의 4가지 접근 제한자는 클래스의 멤버(필드, 메소드)에 모두 사용 가능
단, 클래스 선언 시 사용하는 접근 제한자는 public
과 default
만 가능
public class Monster {
>>> 필드에 접근 제한자를 붙여 직접 접근을 막음
private String name;
private int hp;
>>> 간접 접근할 수 있는 메소드를 작성
public void setInfo(String info) {
this.name = info;
}
public void setHp(int hp) {
if(hp > 0) {
this.hp = hp;
} else {
this.hp = 0;
}
}
public String getInfo() {
return "몬스터의 이름은 " + this.name + "이고, 체력은 " + this.hp + "입니다.";
}
}
public class Application {
public static void main(String[] args) {
Monster monster = new Monster();
>>> 직접 접근이 막혔기 때문에 The field Monster.name is not visible 컴파일 에러
// monster.name = "프랑켄슈타인";
// monster.hp = -200;
>>> 메소드로 간접 접근하기
monster.setInfo("프랑켄슈타인");
monster.setHp(-200);
System.out.println(monster.getInfo());
}
}
💻 Mini Console
몬스터의 이름은 프랑켄슈타인이고, 체력은 0입니다.
📌 Ref.
* 선언한 필드대로 공간은 생성되어 있지만 직접 접근할 수 없고 public으로 접근을 허용한 메소드만 이용할 수 있도록 함
이를 캡슐화(encapsulation)라고 함
- 유지보수성 증가를 위해
- 클래스 작성 시 특별한 목적이 아니면 캡슐화가 기본 원칙