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
}
}
'DEV > JAVA' 카테고리의 다른 글
[JAVA] Lambda Expression(람다식) (4) | 2022.03.15 |
---|---|
[JAVA] JAVA 버전 별 특징(1 ~ 17 버전) (0) | 2022.03.15 |
[JAVA] JAVA에서의 형변환(casting) (0) | 2021.12.23 |
[Spring] Spring(스프링) 프로젝트 쉽게 생성하기 (2) | 2021.10.08 |
[Spring] Spring(스프링) 이란? (0) | 2021.10.08 |
댓글