반응형
상속관계에서의 접근제어자
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 |