백엔드 수업 #07 상속 - 06 protected 접근 제한자

sookyoung.k·2022년 11월 28일
0

접근 제한자 종류: public > protected > default > private
(private쪽으로 갈 수록 접근 제한이 강화된다.)

접근 제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
dafault 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스

protected: 같은 패키지 내에서는 default와 마찬가지로 접근제한이 없다.
하지만 다른 패키지에서는 자식 클래스만 접근이 허용된다.

package test.ch07.package1;

// protected -> 상속 관계, 같은 패키지 일 때 접근 가능(필드, 생성자, 메소드)
public class A {
	// 필드
	protected String field;
	
	// 생성자 
	protected A() {}
	
	// 메소드 
	protected void method() {}
}

package test.ch07.package1;

public class B {
	public void method() {
		A a = new A(); // 접근 가능 
		a.field = "1"; // 접근 가능 
		a.method(); // 접근 가능 (이유 - 같은 패키지에 존재하기 때문이다.) 
	}
}

package test.ch07.package2;

public class C {
	A a = new A(); // 접근 불가  
	a.field = "1"; // 접근 불가
	a.method(); // 접근 불가 (이유 - 패키지가 다르기 때문이다.) 
}

package test.ch07.package2;

import test.ch07.package1.A;

public class D extends A {
	// 생성자
	public D() {
		super(); // A클래스의 생성자 호출 
	}
	
	public void method1() {
		super.field = "1";
		super.method();
		
		this.field = "1"; // 어차피 부모꺼가 다 내꺼가 되기 때문에 this.를 통해서도 쓸 수 있다. 
		this.method();
	} 
	
	public void method2() {
		// protected 사용 시 직접 객체를 생성해서 사용할 수는 없다. 
		A a = new A(); // 접근 불가 
		a.field = "1"; // 접근 불가 
		a.method(); // 접근 불가  
	}
	
}
  • B클래스는 A클래스와 동일한 패키지(package1)에 존재하기 때문에 protected 필드, 생성자, 메소드에 접근이 모두 가능하다.

  • C클래스는 다른 패키지(package2)에 있기 때문에 protected 전부 접근 불가!

  • D클래스는... A생성자를 호출해서 사용할 수는 있다. (super() 사용)

  • 하지만 생성자를 직접 호출할 수는 없다.

profile
영차영차 😎

0개의 댓글