[Java] 접근 제한자

ina·2022년 8월 31일
0
post-thumbnail

접근제한자

  • Access Modifier
  • 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 제한하기 위해 사용한다
  • 접근제한자를 사용하는 경우
    • 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 필요가 있을 경우
    • 객체 생성을 막기 위해 생성자를 호출하지 못하게 하는 경우
    • 필드나 메소드를 사용하지 못하도록 막아야 하는 경우 등
  • 접근제한자 종류
    • public
      • 적용 대상 : 클래스, 필드, 생성자, 메서드
      • 접근 가능 대상 : 모든 대상
      • 접근 불가 대상 : 없음
    • protected
      • 적용 대상 : 필드, 생성자, 메서드
      • 접근 가능 대상 : 같은 패키지 또는 자식 클래스
      • 접근 불가 대상 : 자식 클래스가 아닌 다른 패키지에 소속된 클래스
    • default
      • 적용 대상 : 클래스, 필드, 생성자, 메서드
      • 접근 가능 대상 : 같은 패키지에 소속된 클래스
      • 접근 불가 대상 : 다른 패키지에 소속된 클래스
    • private
      • 적용 대상 : 필드, 생성자, 메서드
      • 접근 가능 대상 : 클래스 내부
      • 접근 불가 대상 : 클래스 외부
  • ❗️ public< protected < default < private 순으로 접근제한이 강화

클래스의 접근 제한

  • 클래스를 선언할 때 결정
    • 해당 클래스를 같은 페키지 내에서만 사용할 것인지 default
    • 다른 패키지에서도 사용할 수 있도록 할 것인지 public
// defualt 접근 제한
class 클래스 { ... }

// public 접근 제한
public class 클래스 { ... }
  • default 접근 제한
    • 클래스 선언 시 public을 생략했다면 클래스는 default 접근 제한을 가진다
    • 같은 패키지에서는 아무런 제한 없이 사용할 수 있다
    • 다른 패키지에서는 사용할 수 없도록 제한된다
  • public 접근 제한
    • 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다

      // A.java
      package package1;
      
      // default 접근 제한
      class A {} 
      // B.java
      package package1;
      
      public class B {
      	A a; // A클래스 접근 가능 (필드로 선언 가능)
      }
      // C.java
      // 위 두 패키지와 다름
      package package2; 
      
      // package1 패키지를 import
      import package1.*;
      
      public class C {
      	A a; // (x) A클래스는 default 접근제한 클래스라 접근 불가, 컴파일 에러
      	B b; // (o) 
      }

생성자의 접근 제한

  • 객체를 생성하기 위해서는 new 연산자로 생성자를 호출한다
    • 하지만 생성자를 어디에서나 호출 할 수 있는 것은 아니다

    • 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다

      public class ClassName {
      	// public 접근 제한
      	public ClassName(...) {...}
      	
      	// protected 접근 제한
      	protected ClassName(...) {...}
      
      	// default 접근 제한
      	ClassName(...) {...}
      	
      	// private 접근 제한
      	private ClassName(...) {...}
      }
  • public 접근 제한
    • 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있다
  • protected 접근 제한
    • 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있다
    • 다른 패키지에 속한 클래스가 해당 클래스의 자식클래스라면 생성자를 호출할 수 있다
  • default 접근 제한
    • 같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 잇다
    • 다른 패키지에서는 생성자를 호출할 수 없다
  • private 접근 제한
    • 동일한 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못한다
    • 오로지 클래스 내부에서만 생성자를 호출할 수 있고 객체를 만들 수 있다
// A.java
package package1;

public class A {
	// 필드
	A a1 = new A(true); // (o)
	A a2 = new A(1); // (o)
	A a3 = new A("문자열"); // (o)

	// 생성자
	public A(boolean b) {} // public 접근 제한
	A(int b) {} // default 접근 제한
	private A(String s){} // private 접근 제한
}
// B.java
// 동일 패키지 , 다른 클래스
package package1; 

public class B {
	// 필드
	A a1 = new A(true); // (o)
	A a2 = new A(1); // (o)
	A a3 = new A("문자열"); // (x) 컴파일 에러 : private 생성자 접근 불가
}
// C.java
// 다른 패키지 , 다른 클래스
package package2;

import package1.A; // pacakge1 import

public class C {
	// 필드
	A a1 = new A(true); // (o)
	A a2 = new A(1); // (x) 컴파일 에러 : default 생성자 접근 불가
	A a3 = new A("문자열"); // (x) 컴파일 에러 : private 생성자 접근 불가
}

필드와 메서드 접근 제한

  • 필드와 메서드를 선언할 때 결정
    • 해당 필드와 메서드를 클래스 내부에서만 사용할 것인가
    • 해당 패키지 내에서만 사용할 것인가
    • 다른 패키지에서도 사용할 수 있도록 할 것인가
  • public 접근 제한
    • 모든 패키지에서 아무런 제한 없이 사용 가능
  • protected 접근 제한
    • 같은 패키지에 속하는 클래스에서 필드와 메서드 사용 가능
    • 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메서드 사용 가능
  • default 접근 제한
    • 필드와 메서드를 선언할 때 접근 제한자를 생략하면 default 접근 제한을 가짐
    • 같은 패키지에서만 필드와 메서드 사용 가능
    • 다른 패키지에서는 필드와 메서드 사용 불가
  • private 접근 제한
    • 동일 패키지, 다른 패키지 상관없이 필드와 메서드 사용 불가
    • 클래스 내부에서만 사용 가능
// A.java
package package1;

public class A {
	// 필드
	public int field1; // public 접근 제한 필드
	int field2; // default 접근 제한 필드
	private int field3; // private 접근 제한 필드

	// 생성자
	public A() {
		field1 = 1; // (o)
		field2 = 1; // (o)
		filed3 = 1; // (O)

		method1(); // (o)
		method2(); // (o)
		method3(); // (o)
		
		// 클래스 내부 필드와 내부 메서드는 접근 제한자의 영향을 받지 않음
	}

	// 메서드
	public void method1() {} // public 접근 제한 메서드
	void method2() {} // default 접근 제한 메서드
	private void method3() {} // private 접근 제한 메서드
}
// B.java
// 동일 패키지
package package1;

public class B {
	public B() {
		A a = new A(); // A 클래스 접근 가능
		a.field1 = 1; // (o) A클래스의 public 필드 접근 가능
		a.field2 = 1; // (o) A클래스의 default 필드 접근 가능
		a.field3 = 1; // (x) 컴파일 에러 : A클래스의 private 필드 접근 불가

		a.method1(); // (o) A클래스의 public 메서드 접근 가능
		a.method2(); // (o) A클래스의 default 메서드 접근 가능(같은 패키지)
		a.method3(); // (x) 컴파일 에러 : A클래스의 private 메서드 접근 불가
	}
}
// C.java
// 다른 패키지
package package2;

import package1.A; // A클래스 import

public class C {
	public C() {
		A a = new A(); // a 객체 생성 가능 -> A 클래스 접근 가능
		a.field1 = 1; // (o) public 필드 접근 가능
		a.field2 = 1; // (x) 컴파일 에러 : default 필드 접근 불가
		a.field3 = 1; // (x) 컴파일 에러 : private 필드 접근 불가

		a.method1(); // (o) public 메서드 접근 가능
		a.method2(); // (x) 컴파일 에러 : default 메서드 접근 불가
		a.method3(); // (x) 컴파일 에러 : private 메서드 접근 불가
	}
}

참고 자료 :
도서 -
혼자 공부하는 자바 - 신용권

profile
🐢 💨 💨

0개의 댓글