은닉화와 캡슐화는 앞으로 객체를 활용함에 있어 필수적으로 이해하고 있어야 하는 개념으로, 개념의 명칭보다는 내용을 알고 있는 것이 중요하다.
또한, 앞서 공부했던 접근지정자와 패키지에 대한 이해가 선행되어야 한다.
참고) 패키지와 import
참고) 접근지정자(접근제한자)
위 링크를 참고하며 은닉화와 캡슐화에 대해 알아보자.
package kr.s14.object.capsule;
class Capsule{
//<은닉화>
private int a;
//캡슐화
public void setA(int n) {
if(n >= 0) {
a = n;
}else {
System.out.println("음수는 허용되지 않습니다.");
}
}
public int getA() {
return a;
}
}
public class CapsuleMain {
public static void main(String[] args) {
Capsule cap = new Capsule();
cap.setA(100); //데이터 저장
System.out.println(cap.getA());//데이터 호출
cap.setA(-20);
System.out.println(cap.getA());
}
}
은닉화 : 데이터 보호를 목적으로 접근지정자를 private으로 설정, 같은 클래스 내에서만 접근할 수 있도록 설정하는 것을 말한다.
ex. private int a;
그동안 작성해왔던 int a;와 같은 코드는 접근지정자가 default로, 이는 생략 가능하다.
캡슐화 : 은닉화한 요소에는 직접 접근할 수가 없기 때문에 부가적인 요소를 만든 후 이를 통해서만 접근이 가능한데, 이렇게 대신 접근해줄 수 있는 (접근 가능한) 메서드를 만드는 것을 캡슐화라고 한다.
ex. public void setA(int n) {
또한, 은닉화 시 직접 출력하는 것에도 어려움이 있기에 대신 출력해줄 수 있는 메서드도 만들어 주어야 한다.
ex. public int getA() { → 다른 클래스에서는 getA 메서드를 활용해 값을 반환하는 형태로 출력함
CapsuleMain 클래스에서 Capsule 클래스의 객체를 생성, 은닉화된 변수 a를 활용하고자 할 경우
1) 변수 a의 접근지정자가 private이므로 원칙적으로는 다른 클래스(CapsuleMain)에서 호출이 불가능하다.
2) 하지만 이때, setA() 메서드를 이용해 인자를 넘겨주고,
3) getA() 메서드를 이용해 데이터를 호출해 출력하는 것은 가능하다.
만약 변수 a의 접근지정자가 default였다면, a에 음수도 대입이 가능했다.
ex. cap.a = -10;, System.out.println(cap.a);
하지만 은닉화 한 변수 a는 메서드를 통해서만 접근이 가능하며, setA() 메서드 내에서는 if문을 통해 자연수일 경우에만 int a에 대입 가능하게 되어 있다.
public void setA(int n) {
if(n >= 0) {
a = n;
}else {
System.out.println("음수는 허용되지 않습니다.");
}
}
따라서 위 예제의 출력 결과는 다음과 같다.
출력)
100
음수는 허용되지 않습니다.
100

*메인 영역에는 이미 public이라는 접근지정자가 존재하기 때문에 그 하위에 있는 지역 변수에는 접근지정자를 붙일 수 없다.