접근 제한자
- 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성을 유지하기 위해서 접근 제한자 사용
출처, 이것이 자바다
- 접근 제한자는 public, protected, private의 세 가지 종류
출처, 이것이 자바다
출처, 이것이 자바다
클래스의 접근 제한
- 클래스를 선언할 때 public 접근 제한자를 생략하면 클래스는 다른 패키지에서 사용할 수 없음
출처, 이것이 자바다
- 클래스를 선언할 때 public 접근 제한자를 붙이면 클래스는 같은 패키지뿐만 아니라 다른 패키지에서도 사용할 수 있음
출처, 이것이 자바다
package ch06.sec13.exam01.package1;
//동일한 패키지안에서는 public 키워드를 사용하지 않아도 참조가 가능하다.
class A {
}
package ch06.sec13.exam01.package1;
public class B {
//필드 선언
A a; //정상참조. 동일한 패키지일 경우에는 접근자 상관없이 참조가능
}
package ch06.sec13.exam01.package2;
import ch06.sec13.exam01.package1.B;
public class C {
//필드선언
// A a; //참조불가능
B b; //import문사용 참조가능
}
생성자의 접근 제한
- 생성자는 public, default, private 접근 제한을 가질 수 있음
출처, 이것이 자바다
출처, 이것이 자바다
package ch06.sec13.exam02.package1;
/*
* 생성자 : 힙영역의 기억장소에 초기값
* 생성자 접근제한자 : public, 생략 - default, private
*/
public class A {
//클래스 내부에서 자기자신의 클래스를 객체생성가능(중요)
//클래스 내부에서는 접근자가 의미가 있다.
//필드선언
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열");
//public 접근 제한 생성자 선언, 모든 패키지에서 접근가능
public A(boolean b) {
}
//default 접근 제한 생성자 선언, 동일한 패키지에서 접근가능
A(int b) {
}
//private 접근 제한 생성자 선언, 클래스 내부에서만 접근가능
private A(String s) {
}
}
package ch06.sec13.exam02.package1;
//동일한 패키지 입장에서 사용하는 예제
//A클래스의 생성자를 사용하는 경우
public class B {
//필드선언
A a1 = new A(true); //참조가능 public
A a2 = new A(1); //참조가능 동일패키지이므로default가 public
// A a3 = new A("문자열"); //참조불가능 private 이므로
}
package ch06.sec13.exam02.package2;
import ch06.sec13.exam02.package1.A;
//다른 패키지 입장에서 사용하는 예제
//A클래스의 생성자를 사용하는 경우
public class C {
//필드선언
A a1 = new A(true);//참조가능 public 모든 패키지에서 가능
// A a2 = new A(1); //참조불가능 default는 다른 패키지인 경우는 private
// A a3 = new A("문자열"); //참조불가능 private 이므로
}
필드와 메소드의 접근 제한
- 필드와 메소드는 public, default, private 접근 제한을 가질 수 있음
출처, 이것이 자바다
출처, 이것이 자바다
package ch06.sec13.exam03.package1;
/*
* 필드, 메소드에 접근제한자 사용.
* 클래스 내부에서는 접근자는 의미가 없다.
*/
public class A {
public int field1;
int field2; //default
private int field3;
public A() {
field1 = 1; //참조가능
field2 = 1; //참조가능
field3 = 1; //참조가능
method1(); //참조가능
method2(); //참조가능
method3(); //참조가능
}
public void method1() {
}
//default
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; //default 동일패키지이므로 public반응과 동일
// a.field3 = 1; //private이기 때문에 참조 불가능
//메소드 호출
a.method1(); //참조가능
a.method2(); //참조가능 default 동일패키지이므로 public반응과 동일
// a.method3(); //private이기 때문에 참조 불가능
}
}
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 필드 접근 불가(컴파일에러)
}
}
'객체 지향 프로그래밍 - 클래스' 카테고리의 다른 글
싱글톤 패턴 (0) | 2023.01.17 |
---|---|
Getter와 Setter (0) | 2023.01.17 |
패키지 (0) | 2023.01.17 |
final 필드와 상수 (0) | 2023.01.16 |
정적 멤버 (0) | 2023.01.16 |