프로그래밍/Java 공부

접근제어자(public, protected, default, private)

개발계발게발 2021. 6. 3. 17:32
반응형

자바에서는 접근 제어자를 통해서 각 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()); // 홍길동
	}
}

 

 

 

반응형