우리가 정보, 즉 인스턴스 변수를 은닉하기 위해서는 인스턴스 변수 앞에 private선언을 해주었는데 이러한 키워드를 통틀어서 우리는 접근 수준 지시자(Access - Level - Modifier)라고 한다. 접근 수준 지시자가 하는 역할은 말 그대로 접근 허용 수준을 결정할 때 사용된다. 접근 수준 지시자에는 4가지 종류가 있다
1 . public
2 . protected
3 . private
4 . default
그렇다면 접근 수준 지시자는 아무데서나 쓸수 있을까? 아니다. 접근 수준 지시자를 선언할 수 있는 두가지 유형이 있다
1 . 클래스 : public, default만 선언 가능
2 . 인스턴스 변수와 메소드 : public default protected private 모두 선언 가능
우선 클래스에서 선언할 수 있는 public, default를 살펴 보자.
클래스를 선언할 때 'public class' 라고 선언하기도 하고 'class'라고 선언하기도 한다. 이 두개의 차이점은 무엇일까? 'public class'같은 경우에는 해당 클래스가 속한 패키지 뿐만 아니라 다른 위치에서 생성된 클래스에서도 해당 클래스의 인스턴스를 생성할 수 있다. 반면 'class'(이것이 class의 default접근 수준 지시자가 선언된 형태이다)라고 선언된 경우에는 자신이 속한 패키지 이외의 클래스에서 해당 클래스에 대한 인스턴스 생성이 불가능하다. 결론적으로 정리해보면 다음과 같다.
class에서의 접근 수준 지시자 특징
*default : 해당 클래스가 속한 이외의 패키지에서는 해당 클래스에 대한 인스턴스를 생성할 수 없다
*public : 해당 클래스가 속한 이외의 패키지에서도 해당 클래스에 대한 인스턴스를 생성할 수 있다.
그렇다면 이에대한 예시를 살펴보자.
필자가 다음과 같이 서로 다른 두 패키지에서 각각의 클래스를 생성해 주었다고 가정하자.
a라는 패키지 안에는 test라는 클래스에서 다음과 같이 선언해 주었다고 하자. default라는 접근 수준 지시자가 있는 test1이라는 class와 pulic이라는 접근 수준 지시자가 선언된 test라는 클래스가 있다고
하자. 하나 주의할 점이 있다. 자바의 불변의 법칙중 하나인데, 첫번째로 선언되는 public class의 이름은 해당 클래스 파일의 명과 동일해야한다. 즉 만약 해당 클래스 파일 이름이 a라고 한다면 a라는 클래스 파일 안에 처음으로 생성되는 public class의 이름도 a가 되어야 한다는 것이다.
해당 클래스를 생성하였다면 b라는 패키지의 qwer파일을 들어가보자.
우선적으로 b라는 클래스의 qwer 클래스 파일을 보면 rt라는 메소드에서는 위의 a라는 패키지의 test라는 클래스를, nm이라는 메소드에서는 test1이라는 클래스의 인스턴스에 대해 각각 참조를 한다. 우선 rt메소드 부터 보면 public선언을 한 test클래스에 대해서는 참조를 하여도 아무런 오류가 나오지 않는다. 하지만 반면 nm메소드에서는 default를 선언한 test1클래스를 참조하기 위해 a.test1이라고 한 결과 오류 문구로 분류되는것을 볼 수 있다. 이것이 클래스에서의 접근 수준 지시자 public, default의 차이점이다.
다시한번 정리하면 클래스에서의 접근 수준 지시자에 있어서 만약 default를 선언하였다면 자신의 패키지 이외의 패키지에서는 해당 클래스를 참조할수 없는 반면 public을 선언해 주었다면 해당 클래스가 선언된 패키지 뿐만 아니라 외부 위치의 패키지에서도 해당 클래스를 참조할 수 있는것이다.
그 다음 인스턴스 멤버에 대해서의 접근 수준 지시자를 보자. 인스턴스 멤버란 인스턴스 변수, 메소드를 통틀어서 말한다. 인스턴스 멤버 접근에 대한것은 우선 private, public과 default형태만 보고 protected에 대해서는 추후 클래스 상속을 하면서 함께 다루도록 하겠다.
인스턴스 멤버에서의 접근 수준 지시자의 특징
*public : 어디서든 접근이 가능하다
*default : 동일 패키지로 묶인 클래스 내에서만 접근이 가능하다
*private : 해당 인스턴스 변수가 선언된 동일 클래스에서만 접근을 가능하게 하며, 인스턴스 직접적인 접근을 못하게 해준다.
이에 대한 예시를 살펴보자. 단 private는 앞에서 다루었기에 다루지 않는다.
이번에도 동일하게 a라는 패키지와 b라는 패키지를 만들고 각각 qw, er이라는 클래스를 생성해 주었다고 가정하자.
해당 클래스에서는 우선 a라는 메소드는 public 접근 수준 지시자가 붙었으며 This is A라는 문장을 출력하는 인스턴스메소드이다. 반면 b라는 메소드는 default 접근 수준 지시자가 붙었으며 This is B라는 문장을 출력하는 인스턴스 메소드이다. 이번에는 b패키지의 er 클래스 파일을 살펴보자.
b패키지의 er이라는 메소드를 보면 우선 a패키지의 qw 클래스를 r로 참조한 다음 해당 클래스의 인스턴스 메소드 a,b를 참조하려는 모습이 보인다. a를 참조하는 곳은 아무런 오류 표시가 나오지 않지만 b는 오류가 나오는것을 볼 수 있다. 이는 즉 인스턴스 멤버에 대해서 public이 붙은 경우에는 위의 클래스에서의 접근 수준 지시자와 동일하게 자신이 속한 패키지 이외의 위치에서도 참조할 수 있는것이 증명되었고, default형 선언이 된 인스턴스 멤버 b에 대해서는 자신이 속한 클래스 이외의 위치에서는 참조되지 않는것이 증명되었다.
그 다음 main클래스에서 이를 출력해 보자.
main함수에서 이를 출력해보면 qw로부터온 b()라는 메소드가 보이지 않는다는 오류가 발생하는것을 볼 수 있다. 즉 확실히 우리가 알수 있는것은 default 접근 수준 지시자가 붙었을 경우에는 자신이 속한 패키지 외부 경로에서는 참조할 수 없다는것이 확실해 졌다. 이번에는 qw클래스 파일에서 r.b()부분을 지우고 출력을 진행해 보자.
아까와 달리 이번에는 This is A라는 문구를 출력한다. 이는 즉슨 public선언을 해준 인스턴스 메소드 a()는 참조가 가능하다는것이 증명된다. 즉 다시한번 정리해보면 인스턴스 멤버(변수, 메소드)에서 접근 수준 지시자가 default일 경우에는 자신이 속한 패키지 외부에서는 절대로 참조가 불가능한 반면 public으로 선언할 경우 자신이 속한 패키지 외 다른 경로에서도 참조가 가능하다는것을 알 수 있다.
'Language > Java' 카테고리의 다른 글
Java JDK, Eclipse 설치 링크 (0) | 2019.02.20 |
---|---|
캡슐화(Encapsulation) (0) | 2019.02.20 |
정보 은닉(Information Hidding) (0) | 2019.02.20 |
Default Constructor (0) | 2019.02.16 |
Java long형 자료형에 대해서 (0) | 2019.02.15 |