반응형
접근 제한자
- 라이브러리 클래스를 설계할 때, 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계해야 함
- 생성자 호출 금지 > 객체 생성 막기 / 해당 필드에 접근 금지 > 객체의 특정 데이터 보호 가능 / 특정 메소드 호출 제한
| 접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
| public | 클래스, 필드, 생성자, 메소드 | 없음 |
| protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
| default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
| private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
- public : 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버 생성
- protected : 같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버 생성
- private : 외부에 노출되지 않는 멤버 생성
- default : 같은 패키지에 소속된 클래스에서만 사용 가능한 멤버 생성
클래스 접근 제한
- default 접근 제한 : 같은 패키지에서는 아무런 제한 없이 사용 가능 하지만 다른 패키지에서는 사용 불가능
- public 접근 제한 : 같은 패키지뿐만 아니라 다른 패키지에서도 제한 없이 사용 가능
package com.mycompany.package1;
class A {} // default 접근 제한
package com.mycompany.package1;
public class B {
A a; // A 클래스 접근 가능
}
package com.mycompany.package2;
import com.mycompany.package1.*;
public class C {
A a; // A 클래스 접근 불가능 (컴파일 에러)
B b;
}
생성자의 접근 제한
- public, protected, default, private 네 개의 접근 제한자를 가질 수 있음
- 클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동적으로 기본 생성자가 추가됨 / 자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일
package com.mycompany.package1;
public class A {
// 필드
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열");
// 생성자
public A(boolean b) {}
A(int b) {}
private A(String s) {}
}
package com.mycompany.package1;
public class B {
// 필드
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열"); // private 생성자 > 컴파일 에러
}
package com.mycompany.package2; // 다른 패키지
import com.mycompany.package1.A;
public class C {
// 필드
A a1 = new A(true);
A a2 = new A(1); // default 생성자 > 컴파일 에러
A a3 = new A("문자열"); // private 생성자 > 컴파일 에러
}
필드와 메소드 접근 제한
- public, protected, default, private 네 개의 접근 제한자를 가질 수 있음
package com.mycompany.package1;
public class A {
// 필드
public int field1;
int field2;
private int field3;
// 생성자
public A() {
field1 = 1;
field2 = 1;
field3 = 1;
method1();
method2();
method3();
} // 클래스 내부일 경우 접근 제한자의 영향을 받지 않음
// 메소드
public void method1() {}
void method2() {}
private void method3() {}
}
package com.mycompany.package1;
public class B {
public B() {
A a = new A();
a.field1 = 1;
a.field2 = 1;
a.field3 = 1; // private 필드 접근 불가 > 컴파일 에러
a.method1();
a.method2();
a.method3(); // private 메소드 접근 불가 > 컴파일 에러
}
}
package com.mycompany.package2; // 다른 패키지
import com.mycompany.package1.A;
public class C {
public C() {
A a = new A();
a.field1 = 1;
a.field2 = 1; // default 필드 접근 불가 > 컴파일 에러
a.field3 = 1; // private 필드 접근 불가 > 컴파일 에러
a.method1();
a.method2(); // default 메소드 접근 불가 > 컴파일 에러
a.method3(); // private 메소드 접근 불가 > 컴파일 에러
}
}반응형