[Java] 4가지 접근제어자(Access Modifier)의 차이

java_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를 은닉하게 되면

      1. Object 간의 결합도가 낮아져 재사용이 용이해진다.
      2. Object의 내부의 정보가 손실되는 것을 방지할 수 있다.
        • get, set method 등을 통해서만 접근하여야함으로 쉽게 접근을 제한할 수 있따.
      3. Object의 Data field를 외부에 노출시키지도록하여 보안을 유지할 수 있다.
        • 큰 서비스에서 정보 유출은 정말 치명적일 수 있다.
      4. Class 변형을 통제하여 Project의 복잡성을 낮출 수 있다.

      등의 장점이 있을 수 있다. (물론 코드는 길어져 시간이 더 오래 걸릴 수 있지만 디버깅 때문에 시간이 길어지는 것에 비하면 아무것도 아니다… )

    • 다시 주제로 돌아가면 private 접근제어자를 Member Variables에 사용하면 Class 내부에서만 사용이 가능하고 외부에서 사용시 반드시 get, set method 등을 통하여 Member Variables를 변경해야함으로 위와 같은 은닉화이 혜택을 누릴 수 있다.

      Difference-Between-Class-and-Instance-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. 글이 쓰다보니 용두사미가 된 것 같은데, 나중에 더 많이 배우게 되면 추가해야겠다…

Tags:

Categories:

Updated:

Leave a comment