Java

[Java] 10. 접근 제어자

byeongoo 2019. 3. 19. 22:26

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인 클래스 이름과 동일해야 합니다.

 

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