Java] Information hiding, 정보 은닉

Access Control Specifiers, 접근 제어 지시자

지시자 클래스 내부 동일 패키지 상속받은 클래스 이외의 영역
public 🟢 🟢 🟢 🟢
protected 🟢 🟢 🟢 ✖️
default 🟢 🟢 ✖️ ✖️
private 🟢 ✖️ ✖️ ✖️

인스턴스 변수는 정보은닉의 대상으로 외부에서는 허용한 메서드(Access Method)를 통해 간접 접근을 이용하여야 한다.

이를 통해 동일한 클래스 명을 사용할 수 있게 경로(Path)를 나눠서 사용할수도 있으며, 외부에서 클래스 내부의 정보에 함부록 접근하지 못하도록 한다.

  • 동일 클래스명 사용 가능(패키지 이용)
  • 클래스 내부 정보 함부록 접근 방지
  • 클래스 내부 데이터 잘못된 사용으로 인한 오류 방지

클래스가 default로 생성, 생성자가 public이라면?

동일 패키지에서만 인스턴스가 생성 가능하다.

이처럼, 더 큰 범위가 어떠한 접근 제어 지시자를 가지고 있는지 확인하고 그 아랫 범위들이 사용 목적에 맞게 설정되어야한다.

어떤 클래스를 public으로 선언할까?

public으로 클래스가 선언된다면 모든 영역에서 사용이 가능하기에 다른 Class가 동일 이름을 가지지 못한다.

클래스를 public으로 구현할 때는 주로, 라이브러리를 만들 때이다.

간단한 더하기 빼기 계산기를 만들어보자.

Calculator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package taejunejoung.calc;

public class Calculator {
private Adder adder;
private Subtractor subtractor;

public Calculator() {
adder = new Adder();
subtractor = new Subtractor();
}

public int addNum(int num1, int num2) {
return adder.addNum(num1, num2);
}

public int subNum(int num1, int num2) {
return subtractor.subNum(num1, num2);
}

public void showOperating() {
System.out.println("덧셈 횟수: " + adder.getAddCnt());
System.out.println("뺄셈 횟수: " + subtractor.getSubCnt());
}
}

Adder.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package taejunejoung.calc;

class Adder {
private int addCnt;

Adder() {
addCnt = 0;
}

int addNum(int num1, int num2) {
addCnt++;
return num1 + num2;
}

int getAddCnt() {
return addCnt;
}
}

Subtractor.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package taejunejoung.calc;

class Subtractor {
private int subCnt;

Subtractor() {
subCnt = 0;
}

int subNum(int num1, int num2) {
subCnt++;
return num1 - num2;
}

int getSubCnt() {
return subCnt;
}
}

CalcTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package taejunejoung.calc;

public class CalcTest {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.addNum(5,3)); //8
System.out.println(calc.subNum(5,3)); //2
System.out.println(calc.addNum(7,0)); //7

calc.showOperating();
//덧셈 횟수: 2
//뺄셈 횟수: 1
}
}

다른 Class들은 (default)로 사용하여 패키지 내에서만 사용할 수 있게 만들고, 하나의 Class만을 접근할 수 있게 Public으로 두었다. 노출할 Class만 public으로 두는 것이 좋다.

  • 유지보수가 편하다.

    변경되는 클래스의 범위를 최소화

  • 작은 크기의 클래스를 다른 클래스의 정의에도 활용할 수 있다.