본문 바로가기

IT

13. 자바 - 접근제한자

* 접근제한자(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