자바(JAVA)

자바 - 접근 제어자(Access Modifier)

BlueNoa 2023. 6. 24. 21:28
728x90
반응형

<목차>

  1. 접근 제어자(Access Modifier)란?
  2. 접근 제어자 예시

 


반응형

• 접근 제어자(Access Modifier)란?

접근 제어자란 클래스, 인터페이스, 변수, 메서드 등 접근 권한을 제어하는 데 사용되는 키워드이다.

접근 제어자는 어떤 멤버가 어떤 범위에서 접근 가능한지를 지정하여 캡슐화(연관 있는 기능과 속성끼리 캡슐로 만들어서 외부로부터 보호하는 것)와 정보 은닉(정보를 누출하지 않는 것)을 구현할 수 있다.

더보기
더보기

※ 객체지향의 각 요소로는 캡슐화, 정보은닉, 다형성, 상속성이 있다.

 

자바에는 네 가지의 접근 제어자가 있다.

접근 제어자 클래스 내부
(해당 클래스 내에서)
패키지 내부
(동일 패키지)
하위 클래스
(상속 받은 클래스)
패키지 외부
(import한)
Public
Protected  
Default
(Package - Private)
   
Private      

1. Public : 네 가지 접근 제어자 중에서 가장 넓은 범위로, 해당 멤버는 어떤 클래스에서든 접근이 가능하다. Public으로 선언된 멤버는 다른 클래스에서도 상속 받아 사용할 수 있고, 외부에서도 접근이 가능하다

 

2. Protected : 동일한 패키지 내의 클래스와 하위 클래스에서 접근할 수 있고, 접근하기 위해서는 동일한 패키지에 속한 클래스이거나 상속 관계에 있는 클래스여야 한다.

 

3. Default(Package - Private) : 접근 제어자를 지정하지 않은 경우 기본적으로 적용되는 접근 제어자이며, 해당 멤버는 동일한 패키지 내에서만 접근이 가능하다. 기본 접근 제어자로 선언된 멤버는 동일한 패키지 내의 다른 클래스가 접근 가능하지만, 다른 패키지의 클래스에서는 접근을 할 수 없다.

 

4. Private : 가장 제한적인 범위를 갖고 있는 접근 제어자이며, 동일한 클래스 내에서만 접근할 수 있다. 이 말은 즉, Private로 선언된 멤버는 외부에서 직접 접근할 수 없으며, 해당 클래스의 내부에서만 사용될 수 있다. 정보 은닉캡슐화를 위해 많이 사용된다.

728x90

접근 제어자 예시

1. Public 예시

public의 특징인 어디서든 호출이 가능한 점을 보여주기 위한 예시이다.

먼저 두 개의 .java 파일을 만들 것이다.

하나는 값을 받기 위한 변수, public 접근 제어자를 사용하는 메서드와 반환하기 위한 명령어를 갖고 있는 'Public_method' 파일

다른 하나는 각 접근 제어자들을 호출해서 보여줄 'Access_Modifier' 파일이다.

<<Public_method>>

public class Public_method {
    public int public_var; // public 접근 제어자를 사용한 변수
    public void publicMethod() {
        // public 접근 제어자를 사용한 메서드
        // 나머지 메서드 내용이 여기 삽입된다. 예시로 반환값을 넣어준다.
        System.out.println(public_var);
    }
}

<<Access_Modifier>>

public class Access_Modifier {
    public static void main(String[] args){
        // public 예시
        Public_method public_obj = new Public_method();
        public_obj.public_var = 20; // 변수에 접근
        public_obj.publicMethod(); // 메서드 호출
    }
}

출력결과

20

2. Protected 예시

위 예시와 비슷한 방식이기 때문에 설명을 코드에 같이 적는 것으로 간소화 한다.

<<Protected_method>>

public class Protected_method {
    protected int protected_var; // protected 접근 제어자를 사용한 변수

    protected void protectedMethod() {
        // protected 접근 제어자를 사용한 메서드
        // 나머지 내용 입력
        System.out.println(protected_var);
    }
}

<<Access_Modifier>>

public class Access_Modifier {
    public static void main(String[] args){
        // Public 예시
        /*
        Public_method public_obj = new Public_method();
        public_obj.public_var = 20; // 변수에 접근
        public_obj.publicMethod(); // 메서드 호출
        */

        // Protected 예시
        Protected_method protected_obj = new Protected_method();
        protected_obj.protected_var = 40; // 변수에 값 할당
        protected_obj.protectedMethod(); // 메서드 호출
    }
}

실행결과

40

<<Protected_child>>

Protected_method를 상속 받는 Protected_child라는 클래스를 만들었다.

위에서 40이라고 반환한 메서드 변수를 30으로 변수값을 바꿔서 출력한다.

때문에 Protected는 동일 패키지의 클래스 또는 상속받은 (다른 패키지의)클래스까지 접근이 가능하다는 것을 알 수 있다.

※ 예시에서는 다른 패키지를 만들지는 않았다.

public class Protected_child extends Protected_method {
    public static void main(String[] args){
        Protected_child pc_obj = new Protected_child();
        pc_obj.protected_var = 30; // 상속받은 변수에 접근하여 새 값 부여
        pc_obj.protectedMethod(); // 상속받은 메서드 실행
    }
}

실행결과

30

 

3. Default(Package - Private)

혹여나 패키지에 대한 예시를 보고 싶을 지도 몰라서 디폴트(동일 패키지)의 예시를 한 번 작성해보았다.

'src' 우클릭 후 New -> Package로 생성한다.
SSG 패키지 내부에 이마트와 스타필드 클래스를 생성했다

<<emart>>

package SSG;

public class emart {
    String name = "emart"; // default 접근 제어자를 사용함
    int num = 7; // 아무 의미 없는 숫자를 부여한 것이다.
    void DefaultMethod(){
        System.out.println("랄라랄라 라~ 함께 해요 해피해피 이마트");
    }
}

동일 패키지 내에서 호출이 가능하기 때문에 스타필드 클래스 파일에서 이마트를 불러서 실행할 것이다.

 

<<Starfield>>

package SSG; // 동일 패키지

public class Starfield {
    String name = "Starfield";
    int num = 5; // 아무 의미 없는 숫자

    public static void main(String[] args){
        Starfield store = new Starfield();
        emart store2 = new emart();
        System.out.println(store2.name + store2.num + "\n" + store.name + store.num );
        store2.DefaultMethod(); // 메서드 호출(emart.java의 메서드 내용을 불러온다.)
    }
}

실행 결과

emart7
Starfield5
랄라랄라 라~ 함께 해요 해피해피 이마트

동일한 패키지 내에서의 호출이기 때문에 문제 없이 호출이 가능하다.

 

4. Private

접근 제어자가 private로 설정되어 있다면 해당 변수, 메서드는 해당 클래스 내에서만 접근이 가능하다.

<<Private_method>>

public class Private_method {
    private int private_var; // private 접근 제어자를 사용한 변수
    String secret;
    String getSecret() {
        return this.secret;
    }
    private void privateMethod() {
        System.out.println("출력 확인");
    }
}

<<Access_Modifier>>

public class Access_Modifier {
    public static void main(String[] args){
        // Public 예시
        /*
        Public_method public_obj = new Public_method();
        public_obj.public_var = 20; // 변수에 접근
        public_obj.publicMethod(); // 메서드 호출
        */

        // Protected 예시
        /*
        Protected_method protected_obj = new Protected_method();
        protected_obj.protected_var = 40; // 변수에 값 할당
        protected_obj.protectedMethod(); // 메서드 호출
        */

        // Private 예시
        Private_method pri_obj = new Private_method();
        pri_obj.private_var = 20;
        pri_obj.privateMethod(); // 오류 발생 메서드를 호출할 수 없음

    }
}

private 메서드를 불러올 수 없다. 오직 클래스 내에서만 호출이 가능하기 때문이다.

 

728x90
반응형