▶현재 시간 : 2022년 10월 25일 1:06 a.m.
오늘 요가 안가고 코딩 공부한다.
변한 내 자신. 기특하구만.
▶접근 제어자 (access modifier)
접근 제어자는 멤버 변수/함수 혹은 클래스에 사용되며 외부에서의 접근을 제한하는 역할을 합니다.
→ private : 같은 클래스 내에서만 접근이 가능합니다
→ default(nothing) : 같은 패키지 내에서만 접근이 가능합니다.
→ protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능합니다.
→ public : 모든 접근 가능합니다.
▶접근 제어자를 사용하는 이유
- 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것입니다. 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생깁니다. 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서!
이런 것을 캡슐화(encapsulation)라고 합니다. 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구입니다.
▶예시
예제를 위해 java 디렉토리에 오른쪽 마우스를 누르고 new → package 를 클릭하고, pkg 라는 이름의 package를 만듭니다.
pkg 디렉토리 내부에 ModiferTest 클래스를 만듭니다.
기존의 Main 클래스와는 달리, 맨 위에 pkg 라는 package 선언부가 추가된 것을 확인할 수 있습니다.
Java 에서 정확한 클래스의 이름은, package 이름까지 포함한 것이 자바 시스템이 인식하는 클래스의 이름입니다. 아래의 경우 pkg.ModifierTest 라는 이름이 됩니다.
한 자바 어플리케이션에서 이렇게 패키지 이름까지 같은 클래스 이름은 하나밖에 존재할 수 없습니다.
즉, pkg.ModifierTest 클래스와 pkg2.ModifierTest 는 소스코드에서 보이는 클래스의 이름은 같지만 실제로는 다른 클래스 입니다.
package pkg;
public class ModifierTest {
private void messageInside() {
System.out.println("This is private modifier");
}
public void messageOutside() {
System.out.println("This is public modifier");
messageInside();
}
protected void messageProtected() {
System.out.println("This is protected modifier");
}
}
import pkg.ModifierTest;
class Child extends ModifierTest {
void callParentProtectedMember() {
System.out.println("Call my parent's protected method");
super.messageProtected();
}
}
public class Main {
public static void main(String[] args) {
ModifierTest modifierTest = new ModifierTest();
modifierTest.messageOutside();
// modifierTest.messageInside(); // compile error
// modifierTest.messageProtected(); // compile error
Child child = new Child();
child.callParentProtectedMember();
}
}
위 예제는 import한 예제 입니다. 다른 클래스를 import 할 때, package 이름까지 정확히 확인해야하는 이유가 여기에 있습니다.
실행해보면 어떻게 결과가 나오나요? 분명, access에 대한 컴파일 오류가 발생할 것입니다.
두 코드를 비교해보면, messagOutside는 public에 접근 가능하고 나머지는 messageInside, messageProtected는 private과 protected이기 때문에 접근 제한이 된 것입니다.
'Java' 카테고리의 다른 글
Java - 객체지향언어 퀴즈 (0) | 2022.10.25 |
---|---|
Java - 객체지향언어 (추상클래스) (0) | 2022.10.25 |
Java - 오버로딩 vs 오버라이딩 (0) | 2022.10.25 |
Java - 객체지향언어 (상속) (0) | 2022.10.25 |
Java - 객체지향언어(생성자) (0) | 2022.10.25 |