CarSedan-PublicProtectedPrivate
public class Car {
// member field
private boolean disel; // private은 파생 클래스에서 사용하지 못함
protected boolean gasoline; // protected은 파생 클래스에서 사용 가능하나 외부(다른 패키지)에서는 호출하지 못함
protected int wheel = 4;
// constructor
protected Car() {
disel = true;
gasoline = true;
}
protected Car(int wheel) {
this.wheel = wheel;
disel = false;
gasoline = false;
}
// method
protected void move() {
if (disel) System.out.println("Disel Car");
System.out.println("Move wheel=" + wheel);
}
}
public class Sedan extends Car {
// member field
private boolean gasoline; // 파생 클래스에서 기반클래스에 멤버필드명이 같다면 default는 자신의 멤버부터 호출, 즉, this.gasoline 부터 사용
// constructor
public Sedan() { // 내부적으로 super() 호출, 즉 super.gasoline=true
gasoline = false;
}
public Sedan(int wheel) { // super(int wheel)를 호출, 즉 super.gasoline=false (protected 생성자는 파생클래스에서 호출 가능)
super(wheel);
gasoline = true;
}
// method
public void sedanMove() {
// base의 gasoline과 this의 gasoline을 구분해야하는 경우
if (super.gasoline) System.out.print("Gasoline Car ");
if (this.gasoline) System.out.print("Gasoline SedanCar ");
System.out.println("move wheel=" + wheel);
}
public static void main(String[] args) {
Car myCar = new Car(); // protected 생성자 같은 패키지 내에 사용가능.
myCar.move(); // protected 메소드 호출 가능
System.out.println("myCar wheel=" + myCar.wheel); // protected 필드 호출 가능
// 바퀴 4개 디젤 자동차
Sedan myCar1 = new Sedan(); // public 생성자 호출 가능
myCar1.move(); // protected 메소드 호출 가능
myCar1.sedanMove(); // public 메소드 호출가능
// 바퀴 6개 가솔린 자동차
Sedan myCar2 = new Sedan(6); // public 생성자 호출 가능
myCar2.move(); // protected 메소드 호출 가능
myCar2.sedanMove(); // public 메소드 호출가능
}
}