사전적 정의
- 자바에서 접근제어자는 "클래스와, 클래스의 멤버를 사용할때 접근할 수 있는 범위 지정" 하는 역할입니다
- 보통 접근제어자 or 접근지정자 라고 부르며 클래스나 클래스 멤버 앞에 붙어있는 public,private,protected,default 등의 키워드가 바로 접근제어자 입니다
클래스의 접근 제어자
- 테스트에 앞서 기본적인 뼈대는 아래와 같다
package accessModifier.Parernt;
public class Book {
}
package accessModifier.Parernt.ChildTwo;
class NoteBook {
}
- 클래스를 정의할 때 사용 가능한 접근제어자는 딱 2개입니다
- Public: "모든 클래스"에서 이 클래스에 접근 가능 (패키지 상관 없음)
- Default: 클래스 앞에 접근제어자가 없으면 default 클래스로, " 같은 패키지 안의 클래스"에서만 접근 가능
- Book은 public으로 선언해놓았기때문에 어디서든 접근 가능하여 문제가 없지만
- NoteBook은 default로 설정되어있어 ChildTwo 패키지안에서만 접근이 가능하여, Parent 패키지에서는 접근이 불가한 모습이다
클래스 멤버 접근제어자
- 클래스 멤버와 함께 사용할 수 있는 접근제어자는 총 4가지입니다
- Public 멤버: "모든 클래스" 에서 접근 가능
- Protected 멤버: "같은 패키지, 다른 패키지의 자식 클래스"에서 접근 가능
- Default 멤버: "같은 패키지" 에서만 접근 가능
- Private 멤버: "같은 클래스" 안에서만 접근 가능
Public
package accessModifier.Parernt;
public class Book {
public String title;
}
package accessModifier.Parernt.ChildTwo;
public class NoteBook {
public String title;
}
- Public 이기때문에 잘 접근이 되는 모습이다
Protected
package accessModifier.Parernt.Child.CChild;
public class Computer {
protected String name = "computerTest";
}
- Computer 클래스에, name 프로포티가 Protected로 걸려있기 때문에 동일 패키지 안이나, 자식 클래스에서만 접근이 가능하다, 즉
package accessModifier.Parernt;
import accessModifier.Parernt.Child.CChild.Computer;
public class ComputerParent extends Computer {
public void computerTestMethod(){
System.out.println(name);
}
}
package accessModifier.Parernt;
public class ClassTest {
public static void main(String[] args) {
ComputerParent computerParent = new ComputerParent();
computerParent.computerTestMethod();
}
}
- 이런식으론 잘 된다는 뜻이다
- 잘 나오는모습이다
Default
package accessModifier.Parernt.Child.CChild;
public class Computer {
String name = "computerTest";
}
- 하지만 접근제어자를 지정하지않으면 자동으로 default로 설정되게 되는데
- 이럴 경우 같은 패키지안에서만 접근 가능하기 때문에 상속하고있더라도, 다른 패키지에 있을경우 접근이 불가해진다
- 자식 클래스에서 name 프로포티에 대해 접근이 불가한 모습이다
Private
package accessModifier.Parernt.Child.CChild;
public class Computer {
private String name = "computerTest";
}
- 멤버 변수가 private으로 선언되어있어, 같은 패키지 안에있음에도 접근이 불가한 모습이다
- private의 경우 해당 클래스 안에서만 사용 가능하다
끝!
참조 블로그
https://kadosholy.tistory.com/96