Ⅰ. 접근 제어자
* 멤버 또는 클래스의 접근 가능 범위를 설정한다.
* 접근 제어자는 클래스, 멤버변수, 메서드, 생성자에 사용할 수 있다.
◀제약 약함 (접근제어자) 제약 강함▶ | ||||
접근 제한 | 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 외 클래스에서 사용하면 에러 발생.
}
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";
}
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이므로 접근 가능.
}
}
출처 :
반응형