* 접근제한자(Access Modifier)
- 접근제한자는 클래스와 멤버변수, 메서드, 생성자의 접근을 제어할 수 있는 제한자이다.
- main() 메서드가 없는 클래스는 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스이다.
- 라이브러리 클래스를 설계할 때는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 변수, 생성자, 메서드를 설계하는것이 바람직하다.
- 외부에서 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 객체의 특정 데이터를 보호하기 위해 해당 멤버변수에 접근하지 못하도록 막는 것이 접근 제한자의 역할이다.
- 클래스에는 접근 제한자를 public과 package friendly만 붙일 수 있다.
Modifier | Same Class | Same Package | Other Package & Subclass |
Other Package (Universe) |
public | yes | yes | yes | yes |
protected | yes | yes | yes | no |
package friendly (아무것도 안적는거) |
yes | yes | no | no |
private | yes | no | no | no |
protected : 다른 패키지일지라도 양 클래스 간의 관계가 상속관계라면 제한적으로 접근 허용해주는 접근제한자이다.
실습1. class에서 사용할수 있는 접근제한자.
class에선 접근제한자를 public과 package friendly를 사용할 수 있다. 두개를 비교해보자.
package: modi.cls.pac1
Name : A
package modi.cls.pac1;
/*
* package friendly(default) 제한자는 접근제한자를
* 붙이지 않는 형태이며, 같은 패키지 내에서만 접근이 가능합니다.
*/
class A {
}
package: modi.cls.pac1
Name : B
package modi.cls.pac1;
//public제한자는 접근제한이 없는 형태(어디에서나 접근 가능)
public class B {
/*
* 클래스 A의 접근제한자가 p.f이기 때문에
* 같은 패키지에 있는 클래스 B에서는 A를 사용할 수 있습니다.
*/
A a = new A();
}
package: modi.cls.pac2 (위 두개의 클래스와는 다른 패키지다.)
Name : C
package modi.cls.pac2;
import modi.cls.pac1.B;
//import modi.cls.pac1.A;
public class C {
//클래스 B는 public클래스이기 때문에 다른 패키지에서 사용가능.
//import는 접근제한자랑 상관없이 무조건 작성해줘야하며,
//다른 패키지의 클래스를 사용할땐 import를 해줘야한다.
B b = new B();
//클래스 A는 p.f클래스이기 때문에 다른 패키지에서 사용 불가.
//A a = new A();
}
실습2. 생성자의 접근제한자
package: modi.contructor.pac1
Name : A
package modi.contructor.pac1;
public class A {
//멤버 변수 선언
A a1 = new A(true); //public 생성자 호출
A a2 = new A(3); //p.f 생성자 호출
A a3 = new A("hi"); //private 생성자 호출
//생성자 선언.
public A(boolean b) {} //public제한
A(int i) {} //package friendly
private A(String s) {} //private제한
}
//같은 클래스내에선 어떤 접근제한자라도 다 사용이 가능하다.
package: modi.contructor.pac1
Name : B
package modi.contructor.pac1;
public class B {
A a1 = new A(false); //public제한자 생성자 호출 (O)
A a2 = new A(55); //p.f제한자 생성자 호출(O)
// A a3 = new A("bye"); //private제한자 생성자 호출(X)
}
package: modi.contructor.pac2 (위 두개의 클래스와는 다른 패키지다.)
Name : C
package modi.contructor.pac2;
import modi.contructor.pac1.*; // 다른 패키지이므로 import처리
public class C {
A a1 = new A(true); //public생성자 호출(O)
// A a2 = new A(1); //p.f생성자 호출(X)
// A a3 = new A("메롱");//private생성자 호출(X)
}
실습3. 변수와 메서드의 접근제한자.
package : modi.member.pac1
Name : A
package modi.member.pac1;
public class A {
//멤버변수 선언.
public int a;
int b;
private int c;
//메서드 선언.
public void method1() {} //public
void method2() {} // package friendly
private void method3() {} //private
//생성자 선언
public A() {
a = 1;
b = 1;
c = 1;
//변수의 사용이나 메서드 호출은 메서드내부, 생성자내부에서만 가능하다.
method1();
method2();
method3();
}
}
package : modi.member.pac1
Name : B
package modi.member.pac1;
public class B {
public B() {
A a = new A();
a.a = 1; //public(O)
a.b = 2; //p.f (O)
// a.c = 3; //private (X)
a.method1(); //public (O)
a.method2(); //p.f (O)
// a.method3(); //private (X)
}
}
package : modi.member.pac2 (위 두개의 클래스와는 다른 패키지다.)
Name : C
package modi.member.pac2;
import modi.member.pac1.A;
public class C {
public C() {
A a = new A();
a.a = 1; //public(O)
// a.b = 2; //p.f (X)
// a.c = 3; //private (X)
a.method1(); //public (O)
// a.method2(); //p.f (X)
// a.method3(); //private (X)
}
}
'IT' 카테고리의 다른 글
15. 자바 - 사용제한자 static (1) | 2022.09.26 |
---|---|
13-1. 자바 - 은닉 (1) | 2022.09.25 |
10-1. SQL - DDL/DML/DCL (1) | 2022.09.22 |
10. 데이터베이스란? / MYSQL 설치 및 설정 (0) | 2022.09.22 |
12. 자바 - This, Super (1) | 2022.09.21 |