객체 지향 프로그래밍에서 캡슐화란 객체의 데이터(속성)와 이를 처리하는 메서드를 하나의 단위로 묶어 외부로부터 보호하는 것을 의미한다.
자바는 대표적인 객체 지향 언어 중 하나이다. 객체 지향 언어의 특징 중 하나는 캡슐화 가 있다. 먼저 캡슐화에 대해 알아보겠다.
캡슐화의 정의는 말머리에 작성한 것처럼 객체의 속성과 이를 처리하는 메서드를 하나의 단위로 묶어 외부로부터 보호하는 것을 의미한다.
이 특성으로부터 우리는 다음과 같은 두 가지를 유추해볼 수 있다.
그 중 오늘은 Modifier를 통한 간단한 예제를 통해 캡슐화의 정보 은닉에 대해 알아보고자 한다.
그 전 자바의 Modifier에 대해 간단히 살펴보고 넘어가보자.

Static은 Field, Method와 함께 사용된다.
같이 사용되어지는 경우는 다음과 같다.

Final은 Class, Field, Method와 함께 사용된다. Final이라는 단어를 생각해보면 "최종"이라는 느낌이 들지 않는가? 우리는 "최종"이라고 된 것들을 수정하지 않는다. Java 관점에서 보자면, 재정의하지 않는다고 생각하면 된다.

Abstract는 "추상"이라는 뜻으로 실체 간의 공통되는 특성을 추출한 것을 말한다. 우리는 공통적인 특성을 추상 클래스에 선언하고 각각의 다른 점들만 구현체(Abstract 클래스를 상속 받는 클래스를 뜻한다.)에 작성한다면 하나의 객체나 메서드가 다양한 상태와 행위를 가질 수 있는 다형성을 구현해볼 수 있다.
이를 토대로 간단한 관리자 계정의 비밀번호를 취득하는 예제를 변화하며 개념을 살펴나가보자.
class Password {
int AdminPW = 12345;
public Password() {
} // Password 클래스의 기본 생성자
public int getAdminPW() {
return AdminPW; // AdminPW의 값 반환
}
}
public class AdminstratorPassword {
public static void main(String[] args) {
Password pwd = new Password();
System.out.println(pwd.AdminPW); // not good
pwd.AdminPW = 00000; // not good
}
}

다음 예제를 간단히 살펴보면 Password라는 클래스를 통해 비밀번호를 관리하고 AdminstratorPassword 클래스 안에서 pwd 변수를 선언하여 Password 인스턴스의 참조 값을 할당하고 있는 모습을 볼 수 있다.
이때 pwd.AdminPW로 누구든 인스턴스를 생성만 한다면 그 안의 비밀번호를 누구나 볼 수 있는 형태이고, 심지어 누구든 비밀번호를 바꿀 수 있어 좋지 못하다.
먼저 아무나 비밀번호를 볼 수 없게 인스턴스 변수를 private으로 지정하고 특정 1차 암호를 입력해야만 암호를 return할 수 있도록 코드를 개선해보겠다.
class Password {
private int AdminPW = 12345;
public Password() {
} // Password 클래스의 기본 생성자
public int getAdminPW(int pwd) {
if (pwd == 98765)
return AdminPW; // 1차 암호 98765입력 시 AdminPW의 값 반환
else
return 0;
}
}
public class AdminstratorPassword {
public static void main(String[] args) {
Password pwd = new Password();
System.out.println(pwd.AdminPW); // error
System.out.println(pwd.getAdminPW(777)); //결과: 0
System.out.println(pwd.getAdminPW(98765)); //결과: 12345
}
}

다음의 예제는 앞선 예제에서 Password의 인스턴스 변수를 private로 정의하고 1차 비밀번호를 입력해야지만 관리자 암호를 return할 수 있도록 개선한 코드이다.
private로 접근지정자를 설정했기 때문에 이제 Password 클래스로 pwd 인스턴스를 생성해도 직접 인스턴스 변수에 접근할 수 없다.
또한 1차 비밀번호 98765를 입력한 경우에만 관리자 암호를 return 받을 수 있고, 1차 비밀번호가 아닌 다른 비밀번호를 입력한 경우 관리자 암호를 return 받을 수가 없다.
하지만, 아직 누구든 Password 클래스를 통해 인스턴스를 생성하여 관리자 암호를 return 받을 수 있는 getAdminPW 메서드에 접근할 수 있다.
관리자 암호가 수정이 확실하게 불가하다는 가독성을 높이고, 아무나 함부로 Password 클래스로 인스턴스를 생성하지 못하도록 개선해보자.
class Password {
private final int AdminPW = 12345;
private Password() {
} //나만 접근이 가능한 private 생성자
public int getAdminPW(int secondPW) {
if (secondPW == 98765)
return AdminPW; // 1차 암호 98765입력 시 AdminPW의 값 반환
else
return 0;
}
public static Password getInstance (int firstPW) {
if (firstPW == 78901)
return new Password();
else
return null;
}
}
public class AdminstratorPassword {
public static void main(String[] args) {
Password pwd = new Password(); //error
Password pwd = Password.getInstance(78901); //인스턴스 생성
System.out.println(pwd.getAdminPW(777)); //결과: 0
System.out.println(pwd.getAdminPW(98765)); //결과: 12345
}
}

자식 클래스에서 super 키워드를 사용하면 부모의 인스턴스 변수에 접근할 수 있다. 상속을 불가하게 하려면 위에서 본 final 키워드를 사용할 수 있다.
또, 생성자는 new 연산자와 같이 사용되어 클래스로부터 인스턴스를 생성할 떄 호출되어 초기화를 진행한다. 생성자가 성공적으로 실행되지 않으면 인스턴스는 생성되지 않는다. private이 된다면 나만 인스턴스를 생성할 수 있기에 '아무나' 인스턴스를 생성할 수 없다.
이를 firstPW를 통해 1차 비밀번호를 아는 사람만이 인스턴스를 생성하여 2차 비밀번호까지 일치한 경우에만 관리자 비밀번호를 return 받을 수 있도록 개선해보았다.
좋은 정보 감사합니다!!! 오늘도 화이팅>_<~!!!💕💕💕