- 다른 패키지에서 클래스를 사용 못하게 막음 (클래스 제한)
- 클래스로부터 객체를 생성하지 못하게 막음 (생성자 제한)
- 특정 필드와 메서드를 숨김 처리함 (필드와 메서드 제한)
- 접근 제한자 종류
순서대로 접근 제한이 강화된다.
접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
※ default는 아무것도 안 붙이는 것을 뜻함.
- 실습
-- 1. 생성자 접근 제한
- 패키지를 두개 만든다. (package1, package2)
- package1 안에 클래스 두 개 만든다. (A, B)
- package2 안에 클래스 하나 만든다. (C)
1. A 클래스에 메서드 3개를 만들고, 각각 new를 써서 필드를 선언해본다.
public class A {
A a1 = new A(true);
A a2 = new A();
A a3 = new A("문자열");
public A(boolean b) {}
A(){}
private A(String s) {}
}
컴파일 오류 없이 잘 선언된다.
2. 이번에는 같은 패키지에 있는 B 클래스에 필드를 선언해본다.
public class B {
A a1 = new A(true);
A a2 = new A();
A a3 = new A("문자열");
}
a1의 public는 어디서든 사용 가능하다.
a2의 default는 같은 패키지에 있기 때문에 사용 가능하다.
a3의 private는 컴파일 오류가 생긴다.
private는 자신이 있는 A 클래스 안에서만 사용 가능하다. (외부 X)
3. package2에 있는 C 클래스에 필드를 선언해본다.
public class C {
A a1 = new A(true);
A a2 = new A();
A a3 = new A("문자열");
}
a2와 a3에 컴파일 오류가 날것이다.
a2의 dafault는 패키지가 다르면 사용 불가.
a3의 private는 자신이 있는 A 클래스 안에서만 사용 가능하다. (외부 X)
-- 2. 필드 접근 제한
- 패키지를 두 개 만든다. (package1, package2)
- package1 안에 클래스 두개 만든다. (A, B)
- package2 안에 클래스 하나 만든다. (C)
1. A 클래스에 필드 3개와 메서드 3개를 선언한다.
public class A {
public int field1;
int field2;
private int field3;
public void method1() {}
void method2() {}
private void method3() {}
}
2. 생성자를 하나 만들어 주고 필드와 메서드를 작성해본다.
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() {}
}
아무 문제없이 잘 된다.
2. B 클래스에 생성자 B를 만들고 필드와 메서드를 입력해본다.
public class B {
public B() {
field1 = 1;
field2 = 1;
field3 = 1;
method1();
method2();
method3();
}
}
이렇게 하면 컴파일 오류가 날것이다.
현재 B클래스에서 사용하려는 필드와 메서드는 A 클래스에 있기 때문이다
다시 A 객체를 생성해보자.
A 객체를 만들고 a로 참조 변수를 사용해야 한다.
public class B {
public B() {
A a = new A();
a.field1 = 1;
a.field2 = 1;
a.field3 = 1;
a.method1();
a.method2();
a.method3();
}
}
field3과 method3은 private라서 사용할 수 없기에 오류가 날것이다.
default인 field 2와 method2는 같은 패키지이기 때문에 사용 가능함.
3. C 클래스에 생성자 C를 만들고 다 붙여 넣어보자.
public class C {
public C() {
A a = new A();
a.field1 = 1;
a.field2 = 1;
a.field3 = 1;
a.method1();
a.method2();
a.method3();
}
}
패키지가 다르기 때문에 default와 private인 field2, field3은 컴파일 오류가 뜰 것이다.
'study > JAVA' 카테고리의 다른 글
어노테이션(Annotation) (0) | 2022.02.22 |
---|---|
Getter와 Setter (0) | 2022.02.18 |
상수(static final) (0) | 2022.02.14 |
final 필드 (0) | 2022.02.14 |
싱글톤(Singleton) 생성과 얻는법 (0) | 2022.02.14 |
댓글