[Java] 10. 접근 제어자
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 |
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인 클래스 이름과 동일해야 합니다.
초보분들은 하나의 소스 파일에 여러 개의 클레스를 선언하는 것은 좋지 않습니다. 자바에 익숙해지기 전에는 클래스 소스 하나에 하나의 클래스를 선언해서 개발하는 습관을 가지는게 좋습니다.