접근 제한자

Sunny·2022년 12월 19일
0

🌸접근 제한자의 필요성

main() 메소드를 가지지 않는 대부분의 클래스는 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스이다.

라이브러리 클래스를 설계할 때에는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계하는 것이 바람직하다. 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나, 객체의 특정 데이터를 보호하기 위해 해당 필드에 접근하지 못하도록 막아야 한다. 그리고 특정 메소드를 호출할 수 없도록 제한할 필요가 있다.

자바는 이러한 기능을 구현하기 위해 접근 제한자(Access Modifier)를 제공하고 있다.


🌸접근 제한자의 종류

public : 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버를 만든다.
protected : 같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버를 만든다.
private : 외부에 노출되지 않는 멤버를 만든다.
default : 위 세 가지 접근 제한자가 적용되지 않은 멤버는 default 접근 제한을 가진다. 같은 패키지에 소속된 클래스에서만 사용할 수 있는 멤버를 만든다.


접근 제한적용 대상
public클래스, 필드, 생성자, 메소드
protected필드, 생성자, 메소드
default클래스, 필드, 생성자, 메소드
private필드, 생성자, 메소드

🌸클래스의 접근 제한

클래스를 선언할 때 고려해야 할 사항은 같은 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야 한다. 클래스에 적용할 수 있는 접근 제한은 public과 default 두 가지 이다. 예시로 이와 관련하여 설명하겠다.

  • A.java
package sec13.test01.package1;

class A {}   // default 접근 제한

  • B.java
package sec13.test01.package1;

public class B {
    A a;   // A 클래스 접근 가능 (필드로 선언할 수 있음)
}  

B 클래스는 A 클래스와 같은 패키지이므로 A 클래스에 접근이 가능하다.
그래서 B 클래스에서 A 클래스를 이용하여 필드 선언 및 생성자/메소드 내부에서 변수 선언이 가능하다.


  • C.java
package sec13.test01.package2;  // 패키지가 다름

import sec13.test01.package1.*;

public class C {
	// A a;      // x - A 클래스 접근 불가(컴파일 에러)
    B b; 		 // O
}

C 클래스는 A 클래스와 다른 패키지이므로 default 접근이 제한된 A 클래스에는 접근이 되지 않지만, public 으로 공개된 B 클래스는 접근이 가능하다. 그래서 C 클래스에서 B 클래스를 이용하여 필드 선언 및 생성자/메소드 내부에서 변수 선언이 가능하다.

profile
개발에 재미를 붙여보기 :)

0개의 댓글