본문 바로가기
JAVA

[JAVA] 접근제어자, 접근제한자(public, private, protected, default)

by 무사뎀벨레 2022. 3. 4.

 

 

 

JAVA에서는 변수, 메서드, 생성자에 대한 접근 권한을 지정할 수 있는
4가지의 접근제어자가 존재합니다.

 

 

 

 

 

 

1. 접근제어자란?


접근제어자클래스의 멤버인 변수와 메소드들의 접근 권한을 지정합니다.

종류는 4가지로 public, protected, default, private 이며,  접근 허용 가능 범위 순서 또한 아래와 같이 나타낼 수 있습니다.

 

public > protected > default > private 

 

아래의 표로 접근 권한 범위를 자세하게 확인할 수 있습니다.(허용 : O, 제한 : X)

접근자 클래스 내부 패키지 상속받은 클래스 이외의 영역
private O X X X
default O O X X
protected O O O X
public O O O O

 

  • public : 접근 제한이 없습니다.
  • protected  : 동일한 패키지 내에 존재하거나, 파생 클래스에서만 접근이 가능합니다.
  • default  : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능합니다.
  • private  : 자기 자신의 클래스 내에서만 접근이 가능합니다.

 

 

 

 

 

 

 

2. 접근제어자를 사용하는 이유


애플리케이션이 커진다는 것은,  그만큼 문제점이 생길 확률도 커진다는 말이 됩니다. 특히 로직이 망가지는 첫 번째 원인은 사용자라고 할 수 있습니다. 즉, 객체를 사용하는 입장에서 객체 내부적으로 사용하는 변수나 메소드에 접근함으로써 개발자가 의도하지 못한 오동작을 일으키기도 합니다.

 

이러한 문제로부터 객체의 로직을 보호하기 위해서멤버에 따라서 외부의 접근을 허용하거나 차단해야 할 필요가 생깁니다.

마치 은행이 누구나 접근할 수 있는 창구와 관계자 외에는 출입이 엄격하게 통제되는 금고를 구분하고 있는 이유와 같습니다.

 

접근제어자를 사용하는 또 다른 이유는 사용자에게 객체를 조작할 수 있는 수단만을 제공함으로써 결과적으로 객체의 사용에 집중할 수 있도록 돕기 위함입니다.

 

즉, 의도치 않은 실수를 줄이기 위함정보 은닉의 목적으로 사용할 수 있습니다.

 

 

 

 

 

 

 

 

3. 접근 제한자 사용 예시


1. public 접근 제한자

- 아래와 같이 public으로 정의한 AccessPublic 클래스에 a라는 변수와 publicMehotd라는 메소드를 정의하였습니다.

package example.accessmodifiers.utils;

public class AccessPublic {
    public int a = 0;
    public void publicMehotd() {
    }
}

 

- 위와 같이 public으로 설정된 클래스, 변수, 메소드는 외부 어디에서나 접근이 가능합니다. 심지어 다른 패키지에서도 접근 가능합니다.

package example.accessmodifiers;

import example.accessmodifiers.utils.AccessPublic;

public class PublicExample {
    PublicExample() {
        AccessPublic obj = new AccessPublic();
        obj.publicMehotd();
        obj.a = 10;
        System.out.println(obj.a);
    }
}

 

 

2. protected 접근 제한자

- protected로 접근 제한자를 설정하면, 이 클래스를 상속하는 자식 클래스에서 접근이 가능합니다. 또한, 같은 패키지에 있는 클래스에서 접근이 가능합니다. 그 이외의 경우에는 접근이 제한됩니다.

package example.accessmodifiers;

public class AccessProteced {
    protected int p = 0;
    protected void protectedMehotd() {
    }

    private void privateMethod() {
    }
    public void publicMethod() {
    }
}

 

- 다음과 같이 AccessProteced2 클래스는 위에서 정의한 AccessProteced클래스를 상속합니다. 그렇기 때문에 AccessProteced에서 정의한 protected 변수 및 메소드 접근이 가능합니다. public은 어디서나 접근이 가능하기 때문에 호출이 가능합니다. 하지만 private로 정의한 메소드 또는 변수는 접근이 불가합니다.

package example.accessmodifiers;

public class AccessProteced2 extends AccessProteced {
    ProtectedExample() {
        p = 10;
        protectedMehotd();  			// ok
        publicMethod();  			// ok
        // privateMethod();  			-> compile error
    }
}

 

 

3. default 접근 제한자

- 다음과 같이 int 앞에 아무것도 명시하지 않는다면 default 접근 제한자로 설정됩니다. 아래 코드에서는 d라는 변수와 defaultMethod 메소드를 default 접근 제한자로 정의하였습니다. 또한, 클래스도 default로 정의하였습니다.

package example.accessmodifiers;

class AccessDefault {
    int d = 0;
    void defaultMehotd() {
    }
}

 

- default 접근 제한자로 설정된 메소드와 변수, 그리고 클래스는 동일한 패키지에서 접근이 가능합니다. AccessDefault 클래스는 example.accessmodifiers라는 패키지 아래에 정의되었습니다. 따라서 example.accessmodifiers 아래의 모든 클래스 안에서 AccessDefault클래스, 변수, 메소드를 접근할 수 있습니다.

package example.accessmodifiers;

public class DefaultExample {
    DefaultExample() {
        AccessDefault obj = new AccessDefault();
        obj.defaultMehotd();
        obj.d = 10;
        System.out.println(obj.d);
    }
}

 

 

4. private 접근 제한자

- 다음과 같이 private로 변수 및 메소드를 정의하였습니다. 또한 비교를 위해 public 메소드를 생성하였습니다.

public class AccessPrivate {
    private int p = 0;

    private void privateMethod() {
        p = 20;
    }

    public void publicMethod() {
        privateMethod();
        p = 10;
    }
}

 

- private로 선언된 변수나 메소드는 클래스 내부에서는 자유롭게 접근이 가능하지만, 외부에서는 접근이 불가능합니다.

package example.accessmodifiers;

public class PrivateExample {
    PrivateExample() {
        AccessPrivate obj = new AccessPrivate();
        obj.publicMethod();
        // obj.aaa = 10;  		-> compile error
        // obj.privateMethod();  	-> compile error
    }
}
반응형

댓글