자바에서는 접근 제어자를 통해서 각 API의 접근 권한을 제한할 수 있다.
아래는 접근 제어자의 접근 범위를 나타낸 것
public > protected > default(package) > private
public : 가장 넓은 범위로 패키지 제한없이 모두 접근 가능한 상태
protected : 같은 패키지내에서 접근 가능, 다른 패키지에서는 상속이나 자식 클래스, 인터페이스라면 접근 가능
default : 아무런 접근 제한을 두지 않을 때 = 같은 패키지내에서는 접근 가능, 외부 패키지에서는 접근 불가
private : 자기 자신 클래스에서만 접근 가능, 그외 모두 막음
주의 : 클래스 앞에 붙는 접근제어자는 public, default만 있다.
번외 : 클래스를 만들 때 어떤 클래스에 public을 붙여야 하나
왜 파일 이름과 public 클래스명을 맞춰야 할까?
가독성? 자바 팡리 안에 많은 클래스를 정의할 때
하나의 대표 클래스를 지정하고 파일명과 동일하게 맞추는 것이 가독성에 도움
사람이 소스코드를 읽을 때 public 키워드가 붙은 클래스를 본다면
현 소스가 어떤 자바 파일 이름으로 되어있는지 알 수 있다.
= public이 없는 것은 자바 파일명과 동일한 클래스가 아니다.
public : 모든 접근을 허용, 어떤 클래스가 접근하던 다 OK
protected : 상속 받은 클래스, 또는 같은 패키지 내에서만 접근 가능
default : 기본 제어자, 아무것도 붙지 않은 것. 클래스가 같은 패키지내에 있어야 접근 가능
private : 외부에서 접근 불가능, 같은 클래스 내에서만 접근 가능
* 클래스내부 동일패키지 하위클래스 그외
* -------------------------------------------------------------------
* public O O O O
* protected O O O X
* default O O X X
* privat 0 X X X
클래스내부 | 동일패키지 | 하위클래스 | 그외 | |
public | 접근가능 | 접근가능 | 접근가능 | 접근가능 |
protected | 접근가능 | 접근가능 | 접근가능 | 접근불가 |
default | 접근가능 | 접근가능 | 접근불가 | 접근불가 |
private | 접근가능 | 접근불가 | 접근불가 | 접근불가 |
class AAA {
private int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0) {
this.age = 0;
} else {
this.age = age;
}
}
public String getName() {
return name;
}
public void setName(String name) {
if (name.length() < 4) { // 4글자보다 작을때
if (name.length() == 3) {
this.name = name;
} else if (name.length() == 2) { // 2글자일때
this.name = "_" + name;
} else if (name.length() == 1) { // 1글자 일때
this.name = "__" + name;
} else {// 0
this.name = "홍길동";
}
} else {
this.name = name.substring(0, 3); // 3글자만 저장
}
}
}
public class AccessModifire {
public static void main(String[] args) {
AAA a = new AAA();
// a.age = 10; // private 변수 접근 불가
// a.name = "";
a.setAge(-10);
System.out.println(a.getAge());
a.setName("");
System.out.println(a.getName()); // __김
a.setName("김김");
System.out.println(a.getName()); // _김김
a.setName("김김김");
System.out.println(a.getName()); // 김김김
a.setName("김김김김김김김");
System.out.println(a.getName()); // 김김김
a.setName("");
System.out.println(a.getName()); // 홍길동
}
}
'프로그래밍 > Java 공부' 카테고리의 다른 글
abstract 추상화, interface 인터페이스, polymorphism 다형성 (0) | 2021.06.09 |
---|---|
Object 클래스 (0) | 2021.06.04 |
인스턴스 멤버, 생성자(Constructor), 정적 멤버(static) (0) | 2021.06.03 |
객체지향프로그래밍_OOP, 자바 파라미터에 클래스 전달 (0) | 2021.06.02 |
객체지향, 객체 , 인스턴스 (0) | 2021.06.01 |