자바 접근 제어자 (Access Modifier)
자바에는 접근 제어자가 있다.
접근 범위의 크기는 public > protected > default > private 와 같이 나타낼 수 있다.
접근 제어자 | 현재 클래스 | 서브 클래스 | 모든 클래스 | 동일한 패키지 |
---|---|---|---|---|
private | O | X | X | X |
default | O | X | X | O |
protected | O | O | X | O |
public | O | O | O | O |
private
private이 붙은 구성요소는 해당 클래스에서만 접근이 가능하다. private을 사용하는 이유는 '자료를 내부적으로만 사용하기 위해서'라고 말할 수 있다.
다음은 예제 코드이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class PrivateData { private int data = 10; int getData() { return data; } } class PrivateDataExample { public static void main(String[] args) { PrivateData obj = new PrivateData(); //System.out.println(obj.data); int data = obj.getData(); System.out.println(data); } } | cs |
obj.getData()로 접근하는 것은 private이 아니기 때문에 가능하다.
하지만 obj.data로 접근하는 것은 private이기 때문에 불가능하다.
default
접근 제어자를 별도로 설정해주지 않으면 구성요소는 default 접근 제어자가 붙게 된다.
다음은 예제 코드이다.
// DefaultData.java
1 2 3 4 5 6 7 8 9 | package example.accessmodifier; class DefaultData { int data = 10; int getData() { return data; } } | cs |
// DefaultDataExample.java
1 2 3 4 5 6 7 8 9 10 | package example.accessmodifier; class DefaultDataExample { public static void main(String[] args) { DefaultData d = new DefaultData(); System.out.println(d.data); System.out.println(d.getData()); } } | cs |
같은 패키지에 속하는 클래스에 접근할 수 있다는 것을 보여준다.
protected
protected가 붙은 구성요소는 같은 패키지 안에서는 자유롭게 사용할 수 있지만, 다른 패키지에서는 서브 클래스 안에서만 접근할 수 있다.
다음은 예제 코드이다.
// KimFamily.java
1 2 3 4 5 6 7 8 9 10 | package kim.family; public class KimFamily { protected String name = ""; protected String lastName = "Kim"; protected void setName(String firstName) { name = firstName + " " + lastName; } } | cs |
// KimFamilyExample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package kim.family.puppy; import kim.family.KimFamily; public class KimFamilyExample extends KimFamily { public static void main(String[] args) { KimFamilyExample kim = new KimFamilyExample(); String firstName = "Puppy"; kim.setName(firstName); System.out.println(kim.name); } } | cs |
다른 패키지에 속하는 KimFamily를 상속받아, 서브 클래스인 KimFamilyExample 클래스에서 접근하는 것을 보여준다.
public
public이 붙은 구성요소는 어떤 클래스에서도 접근이 가능하다.
객체를 보호하기 위해서는 경우에 따라서 외부의 접근을 허용하거나 제한해야할 필요가 있다. 이러한 상황에서 필요한 것이 바로 접근 제어자다. 캡슐화, 보호 등의 이유를 들 수 있고 더 나아가 코드가 엉켜 발생할 수 있는 버그를 어느정도 막아줄 수도 있다.