■ 접근 제한자(Access Modifier)
접근을 제한한다라는 뜻을 모르는 사람은 없습니다. 하지만 무엇 때문에 어떤 접근을 제한하는지를 알려고 하면 머리가 좀 아파옵니다. 기본적으로 소규모의 프로그램을 만들게 되면 딱히 중요할것 같지 않은데... 하지만 실무에서 수백개의 복잡한 클래스와 필드, 메소드, 생성자 연관관계와 공개유무등을 설정할때 꼭 필요한 부분입니다.
위 사진을 보시면 제일 큰 범위를 가지고 있는 public은 모든 접근을 허용하며, protected는 상속관계가 없는 다른 패키지 클래스를 차단합니다. dafault(프랜들리)는 다른 패키지 클래스를 전부 차단하고, private가 모든 외부에 있는 클래스의 접근을 차단하죠.
또한 각각 기본적으로 모든 접근 제한자가 필드와 생성자 메소드를 적용대상으로 하고 있지만 다른패키지에 있는 클래스를 제한하는건 public과 default 제한자만 해당됩니다.
■ public 제한자 (모든것이 접근가능)
카페로 비유하자면 가입을 안해도 볼 수 있는 전체공개글이 public에 해당합니다. 외부의 모든 클래스 및 생성자, 메소드, 필드로부터 접근을 완전히 허용하고, 다른 개발자들에게 라이브리처럼 공유하려고 한다면 public 접근 제한자를 사용하시면 됩니다.
먼저 동일 패키지에서 각 클래스간의 접근이 가능한것을 확인해봤는데요. test1클래스가 test2의 클래스의 접근을 허용하여 아무런 오류도 뜨지 않았습니다.
이번엔 다른 패키지에서 접근이 가능한지 확인을 해봤습니다. 패키지1의 test1클래스는 패키지2의 test3클래스에 import되어 접근이 가능해지면서 오류가 뜨지 않았네요. 한마디로 public 접근 제한자를 사용하면 모든 클래스에게 공개할 수 있다로 정리 해볼수 있겠습니다.
■ protected 제한자 (클래스 선언불가)
위에서 public은 모든게 허용되는 제한자라 비교를 위해 클래스가 접근가능한지만 알아봤었고, 아래사진과 같이 protected와 private는 클래스 선언자체가 불가능합니다.
그러므로 protected 접근 제한자는 같은 패키지에 속해있는 클래스에서 생성자와 메소드, 필드(객체)만 호출 할 수 있고, 다른 패키지에 있는 생성자, 메소드, 필드는 호출하지 못하지만 상속관계에 있는 클래스라면 예외로 호출이 가능합니다.
같은 패키지 안에 있는 클래스끼리는 호출을 허용하니 생략하도록 하고, 위 사진은 패키지가 다른 클래스에 있는 protected 생성자/메소드/필드를 가져오려면 상속을 받아 사용이 가능하게 한 예제입니다.
해석을 하자면... 패키지1에있는 test1클래스에서 다른 패키지에 있는 protected생성자를 가져오기 위해 test3 클래스를 상속받았더니 오류가 뜨지 않는거죠. 반대로 test3에 test1을 상속받고자 하면 오류가 생깁니다.
( ★ protected가 들어있는 클래스가 부모 클래스라면 가능 )
■ default 제한자 (앞에 생략되있는 접근제한자)
앞에 public이나 protected, private를 추가하지 않았다면 기본적으로 default 접근 제한자가 되어 다른 패키지와의 클래스 선언과 생성자/메소드/필드의 호출이 불가능해집니다. 물론 동일 패키지안에서는 모든게 허용됩니다.
동일 패키지간의 허용은 private(전체 비공개)말고 전부 허용이 가능하므로 다른 패키지간의 관계만을 따져보는게 좋다고 생각했습니다. 이번에도 해석하자면 test1클래스에 3번째 필드선언은 앞에 접근제한자가 생략되있는데 그것을 default 접근제한자로 부르고 다른패키지에 있는 test3클래스에서 호출해봤으나 접근이 불가하여 오류가 났습니다.
(★ default는 friedly(프랜들리)라고도 부른다고 하네요.)
■ private 제한자 (전부 접근 불가)
이건 그냥 게시판 글에서 비공개를 하면 글쓴이만 볼수있다로 비유가 가능하겠네요. 동일한 패키지든 다른 패키지든 전부 접근이 불가하도록 하는 최고로 강력한 접근 제한자입니다.
private는 무조건 클래스 내부에서만 사용이 가능하기 때문에 다른 예제를 만들지는 않고 총정리한 요약사진을 올려보도록 할게요. 클래스 내부에서는 모두 접근이 가능 / 동일 패키지에서는 private를 제외한 전부 접근 가능 / 다른 패키지에는 public을 제외한 나머지는 접근이 불가하다고 이해하시면 빠를듯하네요!!