본문 바로가기
Back-End/Java

[Java] 접근지정자(접근제어자) 권한

by 찐코딩 2021. 8. 18.

접근지정자(접근제어자)권한

  - 접근지정자는 클래스, 멤버변수, 멤버메서드 앞에 사용됨.
  - 외부로부터 접근을 제어한다는 의미를 가지고 있음.
  - 접근 지정자가 사용될 수 있는 곳 : 클래스, 멤버변수, 멤버메서드, 생성자
  - 이들 접근지정자 중 protected, private 접근지정자는 클래스 앞에 사용을 못함.
    단, Inner Class 앞에는 사용 가능.
   

1. private

- 동일한 클래스에서만 사용이 가능.
 - 외부에서 인스턴스 변수를 바로 접근이 가능하게 제어를 하면 잘못된 데이터를 저장할 수 있는 문제 발생.
 - 따라서 직접 접근을 못하게 제어하고 메서드(setter() / getter())를 사용하여 접근.

 

2. defualt

- 동일한 패키지에서만 접근이 가능. 생략 가능.
- 같은 클래스의 멤버, 같은 패키지 안의 다른 클래스의 멤버까지만 접근이 가능.

- 다른 패키지의 상속 관계에 있는 클래스라도 접근 불가.

 

3. protected

- 같은 클래스의 멤버, 같은 패키지 안의 다른 클래스의 멤버, 다른 패키지의 상속 관계에 있는 멤버까지 접근 가능.
 

4. public

- 모든 클래스에서 접근이 가능함.             

- 같은 클래스의 멤버, 같은 패키지 안의 다른 클래스의 멤버, 
  다른 패키지의 상속 관계에 있는 멤버, 다른 패키지의 클래스의 멤버까지 접근 가능.

               


 ※ 접근 범위(scope) : public > protected > default > private

 

 

 

package accessOne;

public class Super {
	
		// 멤버변수
		private int num1 = 10;   // 접근지정자 : private
		int num2 = 20;           // 접근지정자 : default
		protected int num3 = 30; // 접근지정자 : protected
		public int num4 = 40;    // 접근지정자 : public

}

package accessTwo;

import accessOne.Super;		// 상속 받기

public class Sub extends Super {
	
	public static void main(String[] args) {
		
		Sub sub = new Sub();
		
		// 해당 클래스에서만 접근이 가능_private 접근자
		// System.out.println("num1 : " + sub.num1);  ==> error 
		
		
		// 해당 패키지 내에서만 접근이 가능_defualt 접근자
		// 상속 관계에 있는 다른 패키지라도 접근이 불가능
		// System.out.println("num2 : " + sub.num2);   ==> error
		
		
		// 패키지가 다르더라도 상속관계에 있으면 접근 가능_protected 접근자
		System.out.println("num3 : " + sub.num3);
		
		// 모든 클래스에서 접근이 가능_public 접근자
		System.out.println("num4 : " + sub.num4);
		
	}

}

결과

num3 : 30
num4 : 40

 

만일 저 에러처리한 주석을 풀어준다면, 아래와 같은 에러코드가 뜬다.

// 해당 클래스에서만 접근이 가능_private 접근자
		System.out.println("num1 : " + sub.num1); 
		
		
		// 해당 패키지 내에서만 접근이 가능_defualt 접근자
		// 상속 관계에 있는 다른 패키지라도 접근이 불가능
		System.out.println("num2 : " + sub.num2);

이렇게 풀어준다면, 아래와 같은 에러발생

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The field Super.num1 is not visible
	The field Super.num2 is not visible

	at accessTwo.Sub.main(Sub.java:12)

 

'Back-End > Java' 카테고리의 다른 글

[Java] 예외(Exception) 처리  (1) 2021.08.18
[Java] final 지정자  (0) 2021.08.18
[Java] 자바 빈(Java Bean), API, 패키지(package)  (0) 2021.08.18
[Java] 다형성(polymorphism)  (0) 2021.08.18
[Java] 인터페이스(Interface)  (0) 2021.08.17

댓글