본문 바로가기

Developer/Java-oop

#012. access modifier (접근제한자) 알아보기...

#012. access modifier (접근제한자) 알아보기...

 

1. 접근 제한자는 클래스, 멤버변수, 멤버메서드에 정의하여 사용하는 것으로 접근을 제한하는 용도로 사용을 한다. 접근 제한자는 public, protected, default, private 이렇게 4가지가 있다.

원본출처:: http://blog.naver.com/phoenixttt?Redirect=Log&logNo=70042125108

접근제한자

동일한 클래스

동일한 패키지

하위 클래스

모두

public

Yes

Yes

Yes

Yes

protected

Yes

Yes

Yes

 

default

Yes

Yes

  

private

Yes

   

- public : 다른 어떤 객체(클래스)에서도 액세스가 가능한(사용할 수 있는) 접근 권한이다. 이 접근 권한은 다른 코드에서 사용할 수 있는 클래스, 상수(static final 변수), 메소드(세터나 게터등), 그리고 대부분의 생성자는 public으로 지정하면 된다. 

- private : 다른 어떤 객체에서도 액세스가 불가능한 접근 권한이다. 이 접근 권한으로 지정된 변수 또는 메소드를 다른 객체에서 참조하거나 사용하는 것이 불가능하고, 자신의 클래스 내에 있는 메소드에서만 참조하거나 사용할 수 있다. 이 접근 권한은 거의 모든 인스턴스 변수, 그리고 외부에서 호출하면 안되는 메소드(public으로 지정된 메소드에서 사용하기 위한 용도로 만들어진 메소드)는 private로 지정하면 된다. 

- protected : 자바에서 정의된 클래스들은 기본적으로 하나의 그룹 단위 또는 묶음단위로써 유지되는데 이를 패키지라 한다. 다시 말해서 패키지는 클래스들의 그룹 또는 큰 단위의 모듈이라 볼 수 있다. protected 접근 권한으로 지정하면 하위 클래스 도는 같은 패키지 내의 클래스에서 액세스가 가능하다. 

- 생략(friendly) : 접근 권한을 지정하지 않는 경우로서, 이러한 접근 권한을 생략(friendly) 권한이라 한다. 같은 패키지 내에 있는 모든 클래스에서 액세스가 가능하고 protected 접근 권한과는 달리 패키지가 다른 하위 클래스에서는 접근할 수 없다.

 

2. 테스트를 위해 access package 를 만들고, 그 안에 AccessDemo class 를 만들어 보자.

코드

package access;

public class AccessDemo {

    priavte int p = 0;

    public static void main(String[] args) {

        SubDemo sub = new SubDemo();

        System.out.println("public j: " + (++sub.j));

        System.out.println("protected k: " + (++sub.k));

        System.out.println("default l: " + (++sub.l));

        System.out.println("private : " + (++sub.m));

        AccessDemo ad = new AccessDemo();

        System.out.println("private : " + (++ad.p));

    }

}

 

class SubDemo {

    public int j =0;

    protected int k = 0;

    int l = 0;    // default

    private int m = 0;    

}

결과

public j: 1

protected k: 1

default l: 1

private : 1

설명

문장15: 같은 패키지 안에 SubDemo Class 를 만들었다.

문장16~19: 각각 접근 제한자를 사용해 멤버변수를 선언했다.

문장2: AccessDemo Class 를 만들었다.

문장3: protected 제한자 멤버변수를 선언했다.

문장5: access 패키지의 SubDemo의 객체 sub 를 생성 한다. 동일 패키지 안에 있을 경우 패키지명을 아래와 같이 사용해도 사용하지 않아도 된다.

Ex) SubDemo sub = new SubDemo();

문장6~8: sub의 객체로 public, protected, default 는 아무 이상이 없는 것으로 보아 접근을 허용 하는 것을 알 수 있다.

문장9: x표시와 m에 빨간색 밑줄이 표시되는 것을 볼 수 있다. 접근을 할 수 없기 때문에 컴파일도 안 된다.

문장10: 자신(AccessDemo)의 객체 ad 를 생성한다.

문장11: private 변수 p 를 접근 해도 아무런 반응이 없는 것으로 보아 역시 허용한다.

실행결과는 문장9 를 주석처리 하면 실행이 된다.

 

위 예제를 보고 다른 접근 제한자를 테스트 해볼 수 있을 것이다.

다음시간엔 package / import 에 대해서 알아보자.

 

잡담. 오늘도 고생하셨습니다. ^^