충분히 쌓여가는
접근 제어자(access modifier) 본문
접근 제어자(access modifier)
private: 같은 클래스 내에서만 접근이 가능하다
(default): 같은 패키지 내에서만 접근 가능하다
protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능하다
public: 접근 제한이 전혀 없다
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
클래스 앞에 붙일 수 있는 접근 제어자: public, (default)
(default)는 아무것도 붙이지 않은 것을 의미한다
멤버에는 4가지(public, protected, (default), private 중 1가지를 붙일 수 있다
다른 클래스에서 사용할 경우
private 에러
package pkg1;
class MyParent {
private int prv; // 같은 클래스
int dft; // 같은 패키지
protected int prt; // 같은 패키지 + 자손(다른 패키지)
public int pub; // 접근제한 없음
public void printMembers() {
System.out.println(prv); // OK
System.out.println(dft); // OK
System.out.println(prt); // OK
System.out.println(pub); // OK
}
}
public class MyParentTest {
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); // 에러, 다른 클래스이기 때문에 에러발생
System.out.println(p.dft); // OK
System.out.println(p.prt); // OK
System.out.println(p.pub); // OK
}
}
다른 패키지의 자손 클래스에서 사용할 경우
private, (default) 에러
Myparent 클래스가 (default)이기 때문에 public로 바꿔주면 해결된다
여기서 하나의 소스파일엔 하나의 pulbic 클래스만 있어야 하기 때문에 MyParentTest의 public을 없애주어야 한다
또한 public 클래스 이름과 소스파일 이름이 같아야 하기때문에 파일이름 또한 MyParentTest -> MyParent로 바꿔야 한다
package pkg1;
public class MyParent {
private int prv; // 같은 클래스
int dft; // 같은 패키지
protected int prt; // 같은 패키지 + 자손(다른 패키지)
public int pub; // 접근제한 없음
public void printMembers() {
System.out.println(prv); // OK
System.out.println(dft); // OK
System.out.println(prt); // OK
System.out.println(pub); // OK
}
}
class MyParentTest {
public static void main(String[] args) {
MyParent p = new MyParent();
// System.out.println(p.prv); // 에러, 다른 클래스이기 때문에 에러발생
System.out.println(p.dft); // OK
System.out.println(p.prt); // OK
System.out.println(p.pub); // OK
}
}
package pkg2;
// import pkg1.MyParent;
class MyChild extends pkg1.MyParent {
public void printMembers() {
System.out.println(prv); // 에러
System.out.println(dft); // 에러
System.out.println(prt); // OK
System.out.println(pub); // OK
}
}
public class MyParentTest2 {
public static void main(String[] args) {
}
}
다른 패키지에 다른 클래스일 경우
상속도 받지 않은 완전히 다른 클래스인 경우
private, (default), protected 에러
package pkg1;
public class MyParent {
private int prv; // 같은 클래스
int dft; // 같은 패키지
protected int prt; // 같은 패키지 + 자손(다른 패키지)
public int pub; // 접근제한 없음
public void printMembers() {
System.out.println(prv); // OK
System.out.println(dft); // OK
System.out.println(prt); // OK
System.out.println(pub); // OK
}
}
class MyParentTest {
public static void main(String[] args) {
MyParent p = new MyParent();
// System.out.println(p.prv); // 에러, 다른 클래스이기 때문에 에러발생
System.out.println(p.dft); // OK
System.out.println(p.prt); // OK
System.out.println(p.pub); // OK러
}
}
package pkg2;
// import pkg1.MyParent;
import pkg1.MyParent;
class MyChild extends pkg1.MyParent {
public void printMembers() {
System.out.println(prv); // 에러
System.out.println(dft); // 에러
System.out.println(prt); // OK
System.out.println(pub); // OK
}
}
public class MyParentTest2 {
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); // 에러
System.out.println(p.dft); // 에러
System.out.println(p.prt); // 에러
System.out.println(p.pub); // OK
}
}
정리
접근 제어자를 사용하는 이유
- 외부로부터 데이터를 보호하기 위해서 => 캡슐화
'Java > 객체지향' 카테고리의 다른 글
다형성(polymorphism) (0) | 2023.06.12 |
---|---|
캡슐화 (0) | 2023.06.09 |
제어자(modifier) (0) | 2023.06.08 |
import 문, static import문 (0) | 2023.06.08 |
패키지(package) (0) | 2023.06.08 |