개발(Web)/Web

[Java] 접근 제어자

shinyelee 2020. 12. 28. 00:29

접근제어자의 의미를 알아보자.

Ⅰ. 접근 제어자

* 멤버 또는 클래스의 접근 가능 범위를 설정한다.

* 접근 제어자는 클래스, 멤버변수, 메서드, 생성자에 사용할 수 있다.

  ◀제약 약함     (접근제어자)     제약 강함▶
접근 제한 public protected (default) private
같은 클래스 O O O O
같은 패키지 O O O  
자손 클래스 O O    
전체 O      

1. public

* 접근 제한 없음(모든 클래스와 모든 패키지에서 접근 가능).

2. protected

* 같은 패키지 내에서 접근 가능.

* 다른 패키지의 경우 자손클래스에서 접근 가능.

3. (default)

* 따로 public, protected, private를 붙이지 않을 때 자동(default)으로 지정됨.

* 같은 패키지 내에서만 접근 가능.

4. private

* 같은 클래스 내에서만 접근 가능.

대상 사용 가능한 접근 제어자
클래스 public, (default)
메서드 public, protected, (default), private
멤버변수 public, protected, (default), private
지역변수 없음

Ⅱ. main 메서드에 public 붙이는 이유

* 메인 메서드는 프로그램의 진입점이자 종료점으로, 다른 클래스/메서드를 호출해 쓴다.

* 메인 메서드에 접근 제한을 두면 다른 클래스와 메서드 호출에 문제가 생길 수 있다.

* 즉 '메인'으로서의 기능에 충실할 수 있도록 접근 제한을 두지 않기 위해 public을 붙인다.


Ⅲ. 사용 예시

1. private

package T01;

public class AccessTest01 {

	public static void main(String[] args) {
		
		Access01 ac = new Access01();
		System.out.println(ac.a);
		System.out.println(ac.b);

	}

}

class Access01 {
	
	int a = 200;
	private int b = 100;
	// private은 같은 클래스(Access01) 내에서만 사용 가능.
	// -> Access01 외 클래스에서 사용하면 에러 발생.
	
}

변수 b는 private이므로 클래스 Access01에서만 사용 가능(메인 메서드에서 사용 불가).

2. (default)

package T01;

public class AccessTest01 {

	public static void main(String[] args) {
		
		Access01 ac = new Access01();
		System.out.println(ac.a);
		System.out.println(ac.b);
		
		AccessTest02 act02 = new AccessTest02();
		System.out.println(act02.c);
	}

}

class Access01 {
	
	int a = 200;
	int b = 100;
	
//	private int b = 100;
	// private은 같은 클래스(Access01) 내에서만 사용 가능.
	// -> Access01 외 클래스에서 사용하면 에러 발생.
	
	// 변수 a, b에 따로 접근 제어자를 지정하지 않음
	// -> 자동으로 (default) 적용
	// -> 같은 패키지 내에서만 접근 가능.
	
}
package T01;

public class AccessTest02 {

	int c = 300;
	int d = 400;
	
	public static void main(String[] args) {
		
	}

}

// AccessTest01, AccessTest02는 T01이라는 패키지에 들어있음
// -> 둘 다 같은 패키지라 변수 c, d에 모두 접근 가능.

3. protected

package T01;

public class TV {
	
	public static void main(String[] args) {
	
		Computer com = new Computer();
		System.out.println("컴퓨터의 가격 : " + com.price);
		// 같은 패키지 내라서 접근 가능.
	}

}
package T01;

public class Computer {

	protected int price = 1000;
}

package T01;

public class Product {

	public static void main(String[] args) {

		Product p = new Product();
		System.out.println("제품 전원 상태 : " + p.power);
		// 서로 다른 패키지인 관계로 접근할 수 없다.
		// 상속을 받으면 접근할 수 있다.

	}

}
package T02;

public class Product {

	protected String power = "off";
}

power는 protected이므로 패키지 T02 내에서만 사용 가능(T01에서 쓰려면 상속 받아야 함).

4. public

//package T01;
//
//public class Product {
//
//	public static void main(String[] args) {
//
//		Product p = new Product();
////		System.out.println("제품 전원 상태 : " + p.power);
//		// 서로 다른 패키지인 관계로 접근할 수 없다.
//		// 상속을 받으면 접근할 수 있다.
//
//	}
//
//}

패키지 T01의 클래스도 Product이기 때문에 혼란을 방지하기 위해 주석 처리했다.

package T02;

public class Product {

	public String power = "off";
//	protected String power = "off";
}
package T01;

import T02.*; // 패키지 T02 내 클래스와 메서드 사용 위해.

class TV {
	
	public static void main(String[] args) {
	
//		Computer com = new Computer();
//		System.out.println("컴퓨터의 가격 : " + com.price);
		// 같은 패키지 내라서 접근 가능.
		
		Product p = new Product();
		System.out.println("제품 전원 상태 : " + p.power);
		// 다른 패키지지만 public이므로 접근 가능.
	}

}

 

출처 : 

 

자바 - 접근제어자

접근제어자란? 멤버 또는 클래스에 사용되어, 해당하는 맴버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다. - 접근제어자를 사용할 수 있는곳 : 클래스, 멤버변수, 메서드,

all-record.tistory.com

반응형