자식 클래스까지 접근을 허용하는 protected 접근제한자를 사용하면 이러한 문제를 해결할 수 있다.
데모 1 : private 접근제한으로 구성된 상속관계
Phone IPhone12 InheritanceExample02
Copy public class Phone {
private String number;
private int price;
public void setNumber ( String number){
this . number = number;
}
public String getNumber (){
return this . number ;
}
public void setPrice ( int price){
this . price = price;
}
public int getPrice (){
return this . price ;
}
}
Copy public class IPhone12 extends Phone {
public IPhone12 ( String number , int price){
super . setNumber (number); //this.setNumber(number);
super . setPrice (price); //this.setPrice(price);
}
public void print (){
System . out . println ( "휴대폰 정보" );
System . out . println ( "번호 : " + super . getNumber ()); //this.getNumber()
System . out . println ( "가격 : " + super . getPrice () + "원" ); //this.getPrice()
}
}
InheritanceExample02.java
Copy public class InheritanceExample02 {
public static void main ( String [] args){
IPhone12 phone = new IPhone( "010-1234-5678" , 1500000 ) ;
phone . print ();
}
}
Phone 클래스의 변수를 private으로 구성할 경우 IPhone12 클래스에서 상속을 받았음에도 setter/getter를 이용해서만 변수에 접근할 수 있는 것을 확인할 수 있다. 이 경우 상속의 취지인 개발 생산성 향상에 부합하지 않기 때문에 반드시 막아야 하는 경우가 아니라면 접근을 완화하여 자식 클래스까지 이용할 수 있도록 해주는 것이 좋다.
데모 2 : protected 접근제한으로 구성된 상속관계
Phone IPhone12 InheritanceExample03
Copy public class Phone {
protected String number;
protected int price;
public void setNumber ( String number){
this . number = number;
}
public String getNumber (){
return this . number ;
}
public void setPrice ( int price){
this . price = price;
}
public int getPrice (){
return this . price ;
}
}
Copy public class IPhone12 extends Phone {
public IPhone12 ( String number , int price){
super . number = number; //this.number = number;
super . price = price; //this.price = price;
}
public void print (){
System . out . println ( "휴대폰 정보" );
System . out . println ( "번호 : " + super . number ); //this.number
System . out . println ( "가격 : " + super . price + "원" ); //this.price
}
}
InheritanceExample03.java
Copy public class InheritanceExample03 {
public static void main ( String [] args){
IPhone12 phone = new IPhone( "010-1234-5678" , 1500000 ) ;
phone . print ();
}
데모 1과 비교했을 경우 IPhone12 클래스에서 Phone 클래스를 우회하지 않고 직접 접근할 수 있는 것을 확인할 수 있다. 외부 패키지에서는 setter / getter를 이용해야 접근할 수 있기 때문에 이용 방법에 차별화를 둘 수 있다.