상위 클래스에서 멤버 변수를 만들 때 가장 중요하게 생각해야 하는 부분은 접근제한 설정이다. 단일 클래스로 구현할 경우 private 설정으로 불완전하거나 원치 않는 데이터를 차단할 수 있으나, 상속 관계에서는 현재 클래스 뿐 아니라 이 클래스를 상속받는 클래스까지 고려해야 한다.
Galaxy 라는 클래스를 만들 때 Galaxy21, Galaxy21s 클래스 등도 고려해서 만들어야 한다는 의미이다.
자식 클래스까지 접근을 허용하는 protected 접근제한자를 사용하면 이러한 문제를 해결할 수 있다.
데모 1 : private 접근제한으로 구성된 상속관계
Phone.java
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;
}
}
IPhone12.java
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
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.java
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;
}
}
IPhone12.java
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
public class InheritanceExample03 {
public static void main(String[] args){
IPhone12 phone = new IPhone("010-1234-5678", 1500000);
phone.print();
}
데모 1과 비교했을 경우 IPhone12 클래스에서 Phone 클래스를 우회하지 않고 직접 접근할 수 있는 것을 확인할 수 있다. 외부 패키지에서는 setter / getter를 이용해야 접근할 수 있기 때문에 이용 방법에 차별화를 둘 수 있다.