Encapsulation & Java Access Modifier

sith-call.dev·2022년 2월 22일
0

Java

목록 보기
2/6

Encapsulation - 캡슐화

객체지향의 4 가지 특성으로 캡!상추다 가 있음을 배웠다. 그 중에서 캡을 담당하는 캡슐화는 정보 은닉을 위한 것이다.
그렇다면 이러한 특성을 자바에서는 어떻게 구현하였을까? 바로 자바의 접근 제어자를 통해서 구현하였다.

Access Modifier

Access Modifiers - controls the access level

W3 School의 Java Modifier 정의를 보면 위와 같이 설명되어 있다.
정보를 은닉하기 위해선 접근의 정도를 제어해야 한다. 완전히 접근을 막으면, 정보는 은닉된다. 반대로 접근을 완전히 허용되면, 그 정보는 공개된다. 그래서 접근의 정도를 제어하는 명령으로 Access Modifier가 존재한다.

객체지향의 구성요소는 크게 클래스, 메서드, 애트리뷰트가 있다. 그래서 접근 제어를 이해하기 위해서 어떤 구성요소부터 접근을 하는지 순차적으로 파악할 필요가 있다.

그림에서 확인할 수 있듯이, 코드가 실행되는 지점에서 내가 원하는 클래스, 애트리뷰트, 메서드 어떤 것을 접근하는지 상관없이 제일 먼저 클래스에 접근해야 한다. 그래서 현재 코드가 실행되고 있는 클래스에 접근하게 되면, 모든 메서드, 애트리뷰트에 접근할 수 있다.

그리고 같은 패키지에 있지만 다른 클래스에 접근하는 경우, private를 제외하고 전부 접근할 수 있다.
조금 어려운 부분이 다른 패키지에 있는 다른 클래스에 접근하는 경우이다. 이때 default 클래스 같은 경우에는 아예 접근이 불가능하다. 그래서 default 클래스 내부에 public 메서드가 있더라도 접근할 수 없게 된다. (기억해라, 클래스부터 접근한다!)

public 클래스 같은 경우에는 다른 패지키, 다른 클래스인 경우에도 접근 가능하다. 그러나 그 안에 있는 메서드, 애트리뷰트들은 접근이 제어된다. 그래서 public 메서드, 애트리뷰트를 제외한 모든 메서드, 애트리뷰트에 접근이 불가능하다. 그러나 예외적으로 외부 패키지일지라도 접근을 시도하는 클래스가 접근을 하려는 클래스를 상속 받은 경우에는 protected 메서드, 애트리뷰트에 접근이 가능하다.

결론적으로는 접근 제어자를 이해하기 위해선, 구성요소 간의 접근 순서를 알아야 한다. 코드 실행 지점에서 패키지 -> 클래스 -> 메서드, 애트리뷰트 순으로 접근한다. 그래서 같은 패키지인지, 다른 패키지인지에 따라서 경우가 나뉜다. 그 다음 접근하려는 클래스가 public인지 default인지에 따라서 다시 경우가 나뉜다. 맨 마지막으로 메서드나 애트리뷰트가 private, default, protected, public인지에 따라서 최종적으로 접근 가능 여부가 판단되는 것이다.

profile
lim (time → ∞) Life(time) = LOVE

0개의 댓글