본문 바로가기
Java

[Java] 10. 접근 제어자

by byeongoo 2019. 3. 19.

1. 자바의 접근 제어자

 

자바의 접근 제어자에는 4개가 있습니다. 이 접근 제어자는 클래스, 메소드, 인스턴스 및 클래스 변수를 선언할 때 사용합니다. 메소드에 선언한 접근 제어자를 한번 살펴 봅시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package c.javapackage.sub;
 
public class Sub {
 
    public void publicMethod() {
    }
    
    protected void protectedMethod() {
    }
    
    void packagePrivateMethod() {
    }
    
    private void privateMethod() {
    }
}

 

 

● public : 누구나 접근할 수 있도록 할 때 사용

 

● protected : 같은 패키지 내에 있거나 상속받은 경우에만 접근 가능

 

● package-private : 아무런 접근 제어자를 적지 않았 을 때이며, 같은 패키지 내에 있을 때만 접근가능

 

● private : 해당 클래스 내에서만 접근 가능

 

 

다음과 같이 main() 메소드에서 다음과 같이 호출해 봅시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package c.javapackage;
 
import c.javapackage.sub.Sub;
 
public class Package {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.publicMethod();
        sub.protectedMethod();
        sub.packagePrivateMethod();
        sub.privateMethod();
    }
}

 

 

Package 클래스를 컴파일 하면 컴파일러가 다음과 같은 에러들을 화면에 띄울겁니다.

 

 

Sub 클래스와 Package 클래스가 각각 다른 패키지에 속하기 때문에 publicMethod() 밑의 3가지 메소드들은 호출 할 수 없습니다.

 

 

 

이러한 접근 제어자를 왜 만들었는지 생각해 봅시다. 암호를 계산하는 로직을 어떤 메소드에 만들었다고 가정합시다. 그런데 이 메소드는 다른 사람이 절대 가져다 쓰면 안됩니다. 그럴 경우에 사용하는 것이 바로 접근 제어자 입니다. 만약 암호를 계산하는 메소드를 public으로 선언했다면, 누구나 그 메소드를 사용해서 암호를 무력화하기 쉬울 것 입니다. 다른 사람들이 그 메소드를 마음대로 호출하면 안 될 경우 이와 같이 접근 제어자로 통제하면 됩니다. 

 

 

또한 변수의 경우 직접 접근해서 변수를 변경 못하게 하고 꼭 메소드를 통해서 변경이나 조회만 할 수 있도록 할 때 접근 제어자를 많이 사용합니다.

 

 

이 절에서 배운 접근 제어자를 누가 접근할 수 있는지 표로 정리해 보면 다음과 같습니다.

 

 

 해당 클래스 안에서

같은 패키지에서 

상속 받은 클래스에서 

import한 클래스에서 

public 

O

O 

O 

O 

 protected

O

O 

O 

X 

(package private) 

O

O 

X 

X 

private 

O

X 

X 

 

 

 

 

2. 클래스 접근 제어자 선언할 때의 유의점

 

지금까지는 주로 메소드에 대한 내용이었습니다. 이 접근 권한은 인스턴스 변수와 클래스 변수에도 동일하게 적용하면 됩니다. 이 외에, 접근 제어자를 사용할 수 있는 곳은 바로 클래스 선언문 입니다. 

 

다음과 같이 아주 간단한 2개의 클래스가 있고, 이 두 개의 클래스는 모두 PublicClass.java라는 파일에 선언되어 있습니다. 자바에서는 이렇게 하나의 클래스 소스에 여러 개의 클래스를 선언해도 상관 없습니다. 하지만, 앞 단락에서 이야기 한 것처럼 제약이 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
package c.javapackage;
 
class PublicClass {
    public static void main(String[] args) {
        
    }
}
 
class PublicSecondClass{
    
}

 

 

 

위의 소스는 컴파일 하면 정상적으로 되고, 클래스가 2개가 선언되어 있기 때문에 클래스 파일이 두개 생성됩니다. 단, 클래스 선언이 package-private이기 때문에 같은 패키지 내에 있는 클래스들만 이 클래스의 객체를 생성하고, 사용할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
package c.javapackage;
 
public class PublicClass {
    public static void main(String[] args) {
        
    }
}
 
class PublicSecondClass{
    
}

 

 

위의 소스도 클래스 파일 이름에 해당하는 클래스만 public이기 때문에 전혀 문제 없습니다.

 

하지만 밑의 소스와 같이 선언하면 안됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
package c.javapackage;
 
public class PublicClass {
    public static void main(String[] args) {
        
    }
}
 
public class PublicSecondClass{
    
}

 

 

public으로 선언된 클래스가 소스 내에 있다면, 그 소스 파일 이름은 public인 클래스 이름과 동일해야 합니다.

 

초보분들은 하나의 소스 파일에 여러 개의 클레스를 선언하는 것은 좋지 않습니다. 자바에 익숙해지기 전에는 클래스 소스 하나에 하나의 클래스를 선언해서 개발하는 습관을 가지는게 좋습니다.

'Java' 카테고리의 다른 글

[Java] 12. 메소드 오버라이딩(Overriding)  (0) 2019.03.23
[Java] 11. 상속  (0) 2019.03.21
[Java] 9.패키지  (0) 2019.03.10
[Java] 8. Pass by Value, Pass by reference  (0) 2019.03.03
[Java] 7. 참조 자료형  (0) 2019.03.03