본문 바로가기
java

상속(접근제어자)

by 신방동불주먹 2022. 10. 4.

상속관계에서의 접근제어자 
private < default < protected < public

 

 

public : 모든 패키지 경로에 사용가능
protected :같은 패키지 또는 상속받는 관계(자식)에 있는 다른 패키지에서 사용가능 ( B-F 클래스 )
default : 같은 패키지에서 사용 가능
private : 클래스 내에서만 사용가능 

클래스 : public, default
변수  : public, protected, default, private
생성자  : public, protected, default, private
메소드  : public, protected, default, private


단 지역변수는 사용 불가

public한 경우에만 패키지와 상관없이 생성과 상속이 가능하다. 

그러나 protected는 상속에 의해 다른 패키지에서 사용이 가능하다.

 

 

패키지와 클래스 위치에 따른 예)

package com.package1;
import com.package3.E;

public class A {
	//public class A extends E {

	public int a;

	public A(int a) {
		super();
		//super(10); //E클래스 생성자 자체도 private, 아예 보이지 않음  
		this.a = a;
	}

	public void printA() {
		System.out.println(a);
	}

}​
package com.javacho.book;

import com.package2.B;
import com.package3.E;

public class AccessModify {
	public static void main(String[] args) {
		//1004 접근제어자 
		//private < default < protected < public
		//public : 모든 패키지 경로에 사용가능
		//protected :같은 패키지 또는 상속받는 관계(자식)에 있는 다른 패키지에서 사용가능 ( B-F 클래스 )
		//제외 한 나머지는 상속 자체가 안된다. 
		//default : 같은 패키지에서 사용 가능
		//private : 클래스 내에서만 사용가능 
		
		//클래스 : public, default
		//변수  : public, protected, default, private
		//생성자  : public, protected, default, private
		//메소드  : public, protected, default, private
		//단 지역변수는 사용 불가
		
		//public한 경우에만 패키지와 상관없이 생성과 상속이 가능하다.
//		단 protected는 상속에 의해 다른 패키지에서 사용이 가능하다.
//		잘 사용하진 않음
		
		B b = new B(20);
	//	C c = new C(30); error : 생성자의 접근제어자가 default 이기 때문에 
	//	E e = new E(30); error : 생성자의 private 이기 때문에 
	//	F f = new F(50); error : 생성자의 protected 이기 때문에 
	}

}
package com.package2;
import com.package3.F;

//public class B {
public class B extends F{ // 패키지가 다른 경우 사용할 수 없지만 상속받은 구조에서는 사용할 수 있다.

	public int b;

	public B(int b) {
		//super(); // Object 상속
		super(10);
		this.b = b;
	}

	public void printB() {
		System.out.println(b);
		System.out.println(f);
		printF();
	}

}
package com.package3;

public class C {
	int c;

	//package
	C(int c) {
		super();
		this.c = c;
	}
	
	void printC() {
		System.out.println(c);
	
	}

}
package com.package3;
//c는 default 니까 d 에서 사용가능, 
public class D {
	C c = new C(10);
	//E e = new E(20); // error : 같은 패키지지만 생성자의 private 이기 때문에 
	F f = new F(30);

	
	void printD() {
		System.out.println(c.c);
		f.printF(); //D,F는 같은 패키지니까 생성만해서 사용할 수 있음
		f.f = 30;
	}
}
//생성자 자동 생성 -source - generate constructor using field
package com.package3;

public class F {
	protected int f;

	protected F(int f) {
		super();
		this.f = f;
	}

	protected void printF() {
		System.out.println(f);
	}

}
package com.package4; //1004정리연습

public class Time {
	
	private int hour;
	int nanosec; //default
	protected int min;
	public int sec;
}
package com.package5; //1004정리연습

import com.package4.Time;

public class TimeChild extends Time {
	void printAll() {
		//System.out.println(hour); //상속이 안됐으니까 쓸 수 없음
		System.out.println(min); //protected는 상속받으면 사용가능.직접사용은 불가(TimeTest)
		//System.out.println(nanosec); //default 상속불가
		System.out.println(sec); //public이니까 다사용가능
	}
	
	
}
package com.package5; //1004정리연습
import com.package4.Time; //c+s+o

public class TimeTest {

	public static void main(String[] args) {

		Time t = new Time();
		// t.hour = 10; //private
		// t.min = 10; //protected
		// t.nanosec = 10; //default
		t.sec = 10; //public 
	}

}

'java' 카테고리의 다른 글

1005_lombok.jar 설치  (0) 2022.10.05
상속(private_정보은닉)  (0) 2022.10.05
상속_(생성자, 오버라이딩)  (0) 2022.10.04
Mac_jdk 환경 변수 설정하기  (0) 2022.10.02
Java - Open JDK 1.8 설치  (0) 2022.10.01