접근 제어자는 클래스나 변수, 메서드의 접근을 제어하기 위해 적어주는 예약어를 말합니다. 흔히 볼 수 있는 public부터 private, protecte, default 네 가지 종류가 있습니다.
public이 붙은 변수나 메서드는 같은 프로젝트 안에서 사용 가능합니다. 다음은 하나의 프로젝트에 존재하는 패키지 A와 패키지 B의 코드입니다.
패키지 A
package A;
public class ClassA {
public static String static = "static";
}
패키지 B
package B;
import A.ClassA;
public class ClassB {
public static void main(String[] args) {
ClassA.static = "";
}
}
위와 같이 클래스를 import만 해주면 다른 패키지에서 접근이 가능하여 변수들을 사용할 수 있는 것을 확인할 수 있습니다.
접근 제어자가 아무것도 붙지 않은 변수나 메서드는 default 상태로, 같은 패키지 안에서만 사용 가능합니다. 아까 전에 사용했던 public 변수들의 public을 지워 보겠습니다.
패키지 A
package A;
public class ClassA {
static String static = "static";
}
패키지 B
package B;
public class ClassB {
public static void main(String[] args) {
ClassA.Static = ""; // 오류 발생
}
}
public을 지우고 나서 변수를 사용하려 하면 오류가 나는 것을 확인할 수 있습니다. 변수들이 속해 있는 패키지가 서로 다르기 때문에 접근이 불가능한 상태입니다.
protected가 붙은 변수나 메서드는 default와 같이 다른 패키지에서는 사용이 불가능하고 상속 관계일 때와 다른 클래스에서 사용 가능합니다. B 패키지에 ClassC 클래스를 정의하여 변수에 protected를 붙이고 ClassB 클래스가 ClassC 클래스를 상속하도록 해보겠습니다.
클래스 ClassC
package B;
public class ClassC {
protected String instance = "instance";
}
클래스 ClassB
package B;
import B.ClassC;
public class ClassB extends ClassC {
public static void main(String[] args) {
ClassB inst = new ClassB();
inst.instance = "";
}
}
상속받은 ClassB에서 ClassC의 변수가 오류 없이 잘 사용되는 것을 확인할 수 있습니다. 따라서 사용 가능 범위는 protected가 public보다 좁고 default보다 큰 것을 알 수 있습니다.
private이 붙은 변수나 메서드는 같은 클래스 내에서만 사용 가능합니다. 방금 전의 변수에서 protected를 지우고 private를 붙여보도록 하겠습니다.
클래스 ClassC
package B;
public class ClassC {
private String instance = "instance";
public void method() {
instance = "";
}
}
같은 클래스에 속해 있는 method 메서드 안에서는 문제없이 변수를 사용하고 있는 모습입니다.
클래스 ClassB
package B;
public class ClassB {
public static void main(String[] args) {
ClassC inst = new ClassC();
inst.instance = ""; // 오류 발생
}
}
하지만 다른 클래스에서는 사용이 불가능한 것을 확인할 수 있습니다.
위 내용을 정리하자면 다음과 같습니다.
접근 제어자 |
외부 패키지에서 사용 |
상속 관계에서 사용 |
외부 클래스에서 사용 |
같은 클래스에서 사용 |
public |
O |
O |
O |
O |
protected |
X |
O |
O |
O |
default |
X |
X |
O |
O |
private |
X |
X |
X |
O |
이렇게 접근 제어자를 사용하는 이유는 보안 때문이라고 할 수 있습니다. 만약에 웹사이트에서 아이디와 비밀번호 같은 중요한 정보를 public 변수에 저장을 한다면 아무데서나 직접적으로 접근하여 그 값을 변경할 수 있기 때문에 노출되기 쉽습니다. 이런 중요한 변수들은 대부분 private를 붙여줍니다.
또한 여러 사람들과 함께 프로그램을 만들다 보면 다른 사람이 내가 만든 중요한 변수나 메서드를 무분별하게 사용하여 값을 변경할 수 있는데, 이를 막기 위해 상황에 맞는 접근 제어자를 사용합니다.
이렇게 중요한 변수와 메서드에 접근 제어자를 이용해 사용 범위를 지정해주면 완성도가 높은 프로그램을 완성할 수 있습니다.
[Java] 인터페이스의 정의와 사용하는 이유 (0) | 2020.09.26 |
---|---|
[JAVA] 윈도우10에 자바 JDK와 이클립스(eclipse) 설치하기 (0) | 2020.09.26 |
[JAVA] 조건문 if, switch (0) | 2020.09.26 |
[JAVA] 반복문 for문, while문, for each문 (0) | 2020.09.26 |
[JAVA] 자바 프로그램 실행 원리와 특징 (0) | 2020.09.26 |