1-15. 객체지향언어 (4) 접근제어자

백종석·2022년 5월 18일
0

자바 문법 뽀개기

목록 보기
15/17
post-thumbnail

1) 접근 제어자 (access modifier)

  • 접근 제어자는 멤버 변수/함수 혹은 클래스에 사용되며 외부에서의 접근을 제한하는 역할을 합니다.

→ private : 같은 클래스 내에서만 접근이 가능합니다

→ default(nothing) : 같은 패키지 내에서만 접근이 가능합니다.

→ protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능합니다.

→ public : 접근 제한이 전혀 없습니다.

👉 위의 설명을 토대로 접근 범위에 대해 정리를 하면 다음과 같습니다.
(좁음)                                    (넓음)
private → default → protected → public

  • [코드스니펫] 접근 제어자 예제 - Main 함수
    public class Main {
        public static void main(String[] args) {
            
        }
    }

예제를 위해 java 디렉토리에 오른쪽 마우스를 누르고 new → package 를 클릭하고, pkg 라는 이름의 package를 만듭니다.

pkg 디렉토리 내부에 ModiferTest 클래스를 만듭니다.

ModifierTest.java

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");
    }
}
  • 기존의 Main 클래스와는 달리, 맨 위에 pkg 라는 package 선언부가 추가된 것을 확인할 수 있습니다.
💡 Java 에서 정확한 클래스의 이름은, package 이름까지 포함한 것이 자바 시스템이 인식하는 클래스의 이름입니다. 위의 경우 `pkg.ModifierTest` 라는 이름이 됩니다. 한 자바 어플리케이션에서 이렇게 패키지 이름까지 같은 클래스 이름은 하나밖에 존재할 수 없습니다. 즉, `pkg.ModifierTest` 클래스와 `pkg2.ModifierTest` 는 소스코드에서 보이는 클래스의 이름은 같지만 실제로는 다른 클래스 입니다. 다른 클래스를 import 할 때, package 이름까지 정확히 확인해야하는 이유가 여기에 있습니다. 앞의 예제에서 Scanner를 alt+Enter를 통해서 import 할때 IDE가 추천해주는 선택지가 많았는데, 자세히 확인해보면 모두 패키지 이름은 다른 것을 보실 수 있습니다.

Main.java

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();
    }
}

💡 위 예제를 실행해보면 어떻게 결과가 나오나요? 분명, access에 대한 컴파일 오류가 발생할 것입니다. 이처럼 접근 제어자를 통하여 접근할 수 있는 범위가 제한되곤 합니다.

👉 그렇다면 왜 접근 제어자를 사용하지?

  • 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것입니다.
  • 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생깁니다.
  • 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서!
    • 이런 것을 캡슐화(encapsulation)라고 합니다.
  • 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구입니다.
profile
항해중인 우당탕탕 코린이

0개의 댓글