본문 바로가기

Java

[ Java ] 접근 제한자 - public, private, protected

src 폴더 내에 a 라는 폴더를 만들고 Test.java라는 파일을 만들어 줍니다.

제가 쓰는 IDE는 VSCODE인데 Java 전용 IDE가 아니다보니 패키지를 만들거나 클래스를 만드는 전용 기능이 없습니다.

그래서 그냥 폴더를 만들고 그냥 파일을 생성해야 합니다.

 

파일을 만들 때도 확장자 .java를 붙여주어야 합니다.

아래 코드를 작성해 줍니다.

 

Test.java

package a;

public class Test {
    String a = "해마 해킹 마스터";
    public static void main(String[] args) {
        
    }
}

 

폴더 b를 만들고 그 안에 Test2.java를 만들어 줍니다.

그 후, 다음 코드를 입력해줍니다.

 

Test2.java

package b;

import a.Test;

public class Test2 {
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.a);
    }
}

 

VSCODE 내에서 보니 test.a에 빨간 줄이 그어져있습니다. 

 

오류 내용을 보니 Test.a 가 안보인다고 하네요

이건 Test.java의 a가 default라서 그렇습니다.

 

default는 접근 제한자를 아무것도 붙이지 않았을 때 붙는 기본값입니다.

public

public은 모든 프로젝트에 대해 해제하는 엄청 열린 녀석입니다.

 

다시 Test.java로 돌아와 String a에 public을 붙여줍니다.

 

이러면 모든 프로젝트에 대해 열린 상태가 됩니다.

그 후, 다시 Test2.java로 돌아와보면 빨간 에러가 해결된 것을 볼 수 있습니다.

 

 

 

private

private는 접근 제한의 최고봉입니다.

Test.java의 a에 private를 걸면 해당 파일의 a에도 뭔가 표시가 뜹니다.

 

이 상태에서는 Test2.java가 b 패키지가 아닌 같은 a 패키지에 있어도 에러가 납니다.

 

실제 옮겨보니 역시 에러가 뜹니다.

 

protected

protected 접근 제한자는 같은 패키지 내에서는 허용을 해주지만 다른 패키지에서는 허용하지 않습니다.

 

이는 default와 비슷한 기능입니다.

 

a 패키지에 있는 Test2.java에서는 통과되었지만 b 패키지에 있는 Test2.java에서는 빨간 에러가 뜨는 것을 볼 수 있습니다.

 

그럼 default와 protected의 차이는 어떤 것일까요?

default는 다른 패키지일 때는 가져올 수 없지만 protected의 경우는 상속을 사용하면 해당 메서드를 불러올 수 있습니다.

 

Test2를 extends Test를 이용해 상속시키면 Test가 부모가 되기 때문에 Test2 메서드를 이용해

test.a를 불러올 수 있습니다.

package b;

import a.Test;

public class Test2 extends Test {
    public static void main(String[] args) {
        Test2 test = new Test2();
        System.out.println(test.a);
    }
}

 

실행해보니 문자열이 잘 출력되고 있는 걸 확인할 수 있습니다.

 

이렇게 default, public, private, protected 4가지의 접근 제한자에 대해서 알아보았습니다.

 

이런 제한자를 쓰는 이유는 바로 보안 때문입니다.

 

생성한 프로그램이 보안에 취약하면 안되기 때문에 관리에 용이하고자 사용하는 것,

다른 사용자가 쉽게 접근할 수 없게 서버 소스 단에서 막아두는 용도입니다.

 

그리고 프로젝트에서 다른 사람과 협업할 때 혼선을 방지하기 위해 사용하는 이유도 있습니다.

'Java' 카테고리의 다른 글

[ Java ] 메소드  (0) 2023.07.14
[ Java ] 배열 / 다차원 배열  (0) 2023.07.13
[ Java ] While문 / Do While 반복문  (0) 2023.07.12
Kotlin vs Java  (0) 2023.07.11
[ Java ] Visual Studio Code에 초간단 Java 환경 세팅  (0) 2023.07.08