◎ 접근 제한자
▷ 중요한 필드와 메소드가 외부로 노출되지 않도록 만들어 객체의 무결성을 유지하기 위해서 사용합니다.
▷ 접근 제한자는 public, protected, private의 세가지 종류
▶ 제한 범위를 벗어나면 사용할 수 없습니다.
◎ 클래스의 접근 제한
▷ 클래스를 선언할 때 public 접근 제한자를 생략하면 클래스는 다른 패키지에서 사용할 수 없습니다.
▶ default가 됩니다.
▷ 클래스를 선언할 때 public 접근 제한자를 붙이면 클래스는 같은 패키지뿐만 아니라 다른 패키지에서도 사용할 수 있습니다.
◎ 예시
1. example01.package1
(1) A(class)
package example01.package1; class A { // default 접근 제한 }
(2) B(class)
package example01.package1; public class B { A a; }
2. example01.package2
package example01.package2; import example01.package1.*; public class C { A a; // Default 다른 패키지라서 접근이 불가능 B b; // public 다른 패키지에 접근이 가능 }
총 패키지 2개와 class 3개를 생성했고 다른 package에서 class를 가져올 때 public이 붙어있지 않다면 사용불가능 하다는 것을 확인할 수 있습니다.
◎ 생성자의 접근 제한
▷ 생성자는 public, default, private 접근 제한을 가질 수 있습니다.
NO | 접근 제한자 | 생성자 | 설명 |
1 | public | 클래스(...) | 모든 패키지에서 생성자를 호출할 수 있다. = 모든 패키지에서 객체를 생성할 수 있다. |
2 | 클래스(...) | 같은 패키지에서만 생성자를 호출할 수 있다. = 같은 패키지에서만 객체를 생성할 수 있다. |
|
3 | private | 클래스(...) | 클래스 내부에서만 생성자를 호출할 수 있다. = 클래스 내부에서만 객체를 생성할 수 있다. |
1. example02.package1
(1) A(class)package example02.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) { } }
(2) B(class)package example02.package1; public class B { // 불린 public // 정수 default // 문자열 private A a1 = new A(true); // public 접근 가능 : 모든 패키지에서 접근 가능 A a2 = new A(1); // default 접근 가능 : 같은 패키지 안에서 접근 가능 A a3 = new A("문자열"); // private 접근 불가능 : 같은 클래스에 없기 때문에 불가능 }
2. example02.package2
package example02.package2; import example02.package1.*; public class C { A a1 = new A(true); // public 접근 가능 : 모든 패키지에서 접근 가능 A a2 = new A(1); // default 접근 불가능 : 다른 패키지라 접근 불가능 A a3 = new A("문자열"); // private 접근 불가능 : 다른 패키지, 다른 클래스라 접근 불가능 }
◎ 필드와 메소드의 접근 제한
▷ 필드와 메소드는 public, default, private 접근 제한을 가질 수 있습니다.
NO | 접근 제한자 | 생성자 | 설명 |
1 | public | 필드 메소드(...) |
모든 패키지에서 필드를 읽고 변경할 수 있다. 모든 패키지에서 메소드를 호출할 수 있다. |
2 | 필드 메소드(...) |
같은 패키지에서만 필드를 읽고 변경할 수 있다. 같은 패키지에서만 메소드를 호출할 수 있다. |
|
3 | private | 필드 메소드(...) |
클래스 내부에서만 필드를 읽고 변경할 수 있다. 클래스 내부에서만 메소드를 호출할 수 있다. |
1. example03.package1
(1) A(class)
package example03.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() { } }
(2) B(class)
package example03.package1; public class B { public void method() { A a = new A(); a.field1 = 1; // public 모든 패키지에서 접근 가능 a.field2 = 1; // default 같은 패키지에 있어서 접근 가능 a.field3 = 1; // private 같은 클래스가 아니라서 접근 불가능 a.method1(); // public 모든 패키지에서 접근 가능 a.method2(); // default 같은 패키지에 있어서 접근 가능 a.method3(); // private 같은 클래스가 아니라서 접근 불가능 } }
2. example03.package2
package example03.package2; import example03.package1.*; public class C { public C() { A a = new A(); a.field1 = 1; // public 모든 패키지에서 접근 가능 a.field2 = 1; // default 다른 패키지에 있어서 접근 불가능 a.field3 = 1; // private 같은 클래스가 아니라서 접근 불가능 a.method1(); // public 모든 패키지에서 접근 가능 a.method2(); // default 다른 패키지에 있어서 접근 불가능 a.method3(); // private 같은 클래스가 아니라서 접근 불가능 } }
접근 제한자란 해당 클래스에서만 메소드, 필드, 생성자를 사용하거나 모든 곳에서 사용할 수 있게 만드는 역할을 합니다!
왜 사용하는지는 잘 모르지만 다양한 예제들을 풀다보면 알 수 있을 것 같아요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 이것이 자바다 ch06 패키지 (0) | 2023.01.11 |
---|---|
[java] Getter와 Setter (1) | 2023.01.11 |
[java] 이것이 자바다 ch06 fianl 필드와 상수 (0) | 2023.01.11 |
[java] 이것이 자바다 ch06 인스턴스 및 정적 멤버 (0) | 2023.01.11 |
[java] 이것이 자바다 ch06 메소드 (0) | 2023.01.11 |