[Java] 4가지 접근제어자(Access Modifier)의 차이
Table 1. Java의 접근제어자 간의 포함관계를 나타낸 도식 (credit: https://opentutorials.org/course/1223/6061)
자바의 4가지 접근제어자의 관계는 위의 도식과 같다. 개인적으로 자바 코드를 짜면서 느낀 쓰임새는 다음과 같다.
기본적으로 자바의 접근제어자는 주로 encapculation을 위하여 사용된다. encapsulation의 목적은 보안이 될 수도있고 프로그램의 구조 혹은 설계의 문제일 수도 있다. 개인적으로 사용해본 접근제어자들의 쓸모는 아래와 같다.
-
private
-
Class안의 data field를 은닉화 하기 위하여 사용한다.
-
은닉화에 대하여 논하기 전 간단히 자바의 변수 체계에 대하여 정리하면 다음과 같다.
1) 자바는 기본적으로 Class로 이루어져있고,
2) 이 Class 안에서도 method 밖에 있는 변수를 Member Variables라 하고,
3) method안의 변수를 Local Variable라고 한다.
4) Member Variables는 다시 아래의 그림과 같이
(1) Instance 생성여부와 관계없이 Class 자체에 내장되어 있는 Class Varialbes와
(2) new를 통하여 instance를 생성하면 사용할 수 있는 Instance Variables로 나눌 수 있다.
-
그렇다면 왜 Encapsulation을 왜 하는걸까? Class의 Data field를 은닉하게 되면
- Object 간의 결합도가 낮아져 재사용이 용이해진다.
- Object의 내부의 정보가 손실되는 것을 방지할 수 있다.
- get, set method 등을 통해서만 접근하여야함으로 쉽게 접근을 제한할 수 있따.
- Object의 Data field를 외부에 노출시키지도록하여 보안을 유지할 수 있다.
- 큰 서비스에서 정보 유출은 정말 치명적일 수 있다.
- Class 변형을 통제하여 Project의 복잡성을 낮출 수 있다.
등의 장점이 있을 수 있다. (물론 코드는 길어져 시간이 더 오래 걸릴 수 있지만 디버깅 때문에 시간이 길어지는 것에 비하면 아무것도 아니다… )
-
다시 주제로 돌아가면 private 접근제어자를 Member Variables에 사용하면 Class 내부에서만 사용이 가능하고 외부에서 사용시 반드시 get, set method 등을 통하여 Member Variables를 변경해야함으로 위와 같은 은닉화이 혜택을 누릴 수 있다.
-
(credit: https://www.differencebetween.com/difference-between-class-and-vs-instance-variables/)
- default
- Java Code를 보면 default라는 이름의 접근제어자를 본 적이 있는가? 필자는 개인적으로 아직까지는 없다. 많은 분들 또한 없을 수 있다고 생각한다. 왜냐하면 class나 method 앞에 아무것도 적지 않으면 default라는 접근제어자가 compile시 자동으로 생성되기 때문이다.
- 같은 package 즉, 같은 folder 안에 있다면 서로 접근이 가능하다. 만약 같은 folder에서 알고리즘 문제를 풀 때 아무런 접근제어자가 없는(=default) Class 2개가 같은 이름을 가진다면, 두 class는 서로 호출 범위를 공유하기 때문에 Error가 뜰 것이다.
- protected
- default의 범위에 더불어 extends 등으로 상속한 subclass에서까지 사용이 가능하다.
- public
- 다른 package에서도 사용이 가능하다.
- Library 안의 호출을 목적으로 하는 class, method는 다른 Package에서 호출이 되어 사용될 수 있어야하기 때문에 public이여야 한다.
- “public static main(Sting[] args){}”라는 main method를 많이들 작성해 보았을 것이다. 이는 Java의 Runtime interpreter가 가장 먼저 main method를 찾아서 실행하는데 이때 이 main method는 반드시 수행되어야 하기 때문에 public으로 어디서든 접근가능하게 열어놓은 것이라고 생각한다.
ps. 글이 쓰다보니 용두사미가 된 것 같은데, 나중에 더 많이 배우게 되면 추가해야겠다…
Leave a comment