본문 바로가기

BackEnd/Java

[java] 접근 제한자

728x90
반응형

◎ 접근 제한자

   ▷ 중요한 필드와 메소드가 외부로 노출되지 않도록 만들어 객체의 무결성을 유지하기 위해서 사용합니다.

 

   ▷ 접근 제한자는 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 같은 클래스가 아니라서 접근 불가능
	}
}​

 

접근 제한자란 해당 클래스에서만 메소드, 필드, 생성자를 사용하거나 모든 곳에서 사용할 수 있게 만드는 역할을 합니다!

 

왜 사용하는지는 잘 모르지만 다양한 예제들을 풀다보면 알 수 있을 것 같아요!! 

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형