IT/Java
[Java] 접근 제한자
Huitopia
2024. 3. 5. 11:16
728x90
접근 제한자(Access Modifier)
경우에 따라 외부에서 객체의 필드를 변경하거나 메소드를 호출하지 못하게 막아야 할 때가 있다. 중요한 필드와 메소드가 외부로 노출되지 않아야 객체의 무결성을 유지한다. 그러기 위해 접근 제한자를 사용한다.
접근 제한자 | 제한 대상 | 제한 범위 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 같은 패키지 또는 자식 객체만 사용 가능 |
(default) | 클래스, 필드, 생성자, 메소드 | 같은 패키지 |
private | 필드, 생성자, 메소드 | 객체 내부 |
접근 제한 강화 순서
public > protected > default > private
1. 클래스 접근 제한
클래스는 public, default 접근 제한을 가진다.
[public] class 클래스 { ... }
클래스 선언 시 public을 생략하면 default 접근 제한을 가진다. defult 제한을 가지면 같은 패키지에서 아무런 제한 없이 사용하지만 다른 패키지에서 사용할 수 없다. public 접근 제한자를 가지면 같은 패키지뿐만 아니라 다른 패키지에서도 사용 가능하다.
예제 코드
더보기
package ch06.sec13.exam01.package1;
class A { // default 접근 제한
}
package ch06.sec13.exam01.package1;
public class B {
A a; // A 클래스 접근 가능
}
package ch06.sec13.exam01.package2;
import ch06.sec13.exam01.package1.*;
public class C {
A a; // A 클래스 접근 불가로 컴파일 에러
B b;
}
2. 생성자 접근 제한
생성자는 public, default, private 접근 제한을 가진다.
public class ClassName {
[public | private] ClassName(...) {...}
}
접근 제한자 | 생성자 | 설명 |
public | 클래스(...) | 모든 패키지에서 생성자 호출 가능 = 모든 패키지에서 객체 생성 가능 |
클래스(...) | 같은 패키지에서 생성자 호출 가능 = 같은 패키지에서 객체 생성 가능 |
|
private | 클래스(...) | 클래스 내부에서 생성자 호출 가능 = 클래스 내부에서 객체 생성 가능 |
예제 코드
더보기
package ch06.sec13.exam02.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 ch06.sec13.exam02.package1;
public class B {
A a1 = new A(true);
A a2 = new A(1);
// A a3 = new A("문자열"); // private라 생성자 접근 불가
}
package ch06.sec13.exam02.package2;
import ch06.sec13.exam02.package1.*;
public class C {
A a1 = new A(true);
// A a2 = new A(1); // default 생성자 접근 불가
// A a3 = new A("문자열"); // pivate 생성자 접근 불가
}
3. 필드와 메소드 접근 제한
필드와 메소드는 public, default, private 접근 제한을 가진다.
접근 제한자 | 생성자 | 설명 |
public | 필드 메소드(...) |
모든 패키지에서 필드를 읽고 변경 가능하다. 모든 패키지에서 메소드 호출이 가능하다. |
필드 메소드(...) |
같은 패키지에서 필드를 읽고 변경 가능하다. 같은 패키지에서 메소드 호출이 가능하다. |
|
private | 필드 메소드(...) |
클래스 내부에서 필드를 읽고 변경 가능하다. 클래스 내부에서 메소드 호출이 가능하다. |
예제 코드
더보기
package ch06.sec13.exam03.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 ch06.sec13.exam03.package1;
public class B {
public void method() {
A a = new A();
a.field1 = 1;
a.field2 = 1;
// private 접근 불가
// a.field3 = 1;
a.method1();
a.method2();
// private 접근 불가
// a.method3();
}
}
package ch06.sec13.exam03.package2;
import ch06.sec13.exam03.package1.*;
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
}
}
728x90