[Java] 5.1.3 필드 재정의(override)

5.1.3 필드 재정의(override)

만약 기반 클래스에 캡슐화한 멤버 필드와 같은 이름으로 파생 클래스에서 멤버 필드를 캡슐화하면 어떻게 될까요?

이 때도 기반 클래스에 캡슐화한 멤버 필드는 무효화하여 파생 형식에서는 직접적으로 사용할 수는 없습니다. 하지만 무효화한 메서드를 호출하여 사용하는 것처럼 super 키워드를 이용하면 무효화 멤버 필드를 사용할 수 있습니다.

실제 프로그래밍에서 메서드 재정의는 많은 곳에서 사용하지만 멤버 필드를 재정의는 개발자에게 혼돈만 가중시켜서 거의 사용하지 않습니다. 이에 관한 사항은 여러분께서 다양한 프로그래밍 과정을 통해 느끼고 판단할 수 있을 것입니다.

예를 들어 음악가의 멤버 필드에 음악가 이름을 name 멤버 필드로 캡슐화하고 음악가를 파생하는 피아니스트에서 피아니스트 이름을 name 멤버 필드를 재정의한다고 가정합시다. 이 때 피아니스트 개체에는 기반 형식부분인 음악가 이름도 있고 피아니스트 이름도 존재하는 꼴이 됩니다. 이는 개발 과정에서 혼란만 가중할 뿐입니다.

[소스 5.5]기반 형식의 멤버 필드를 파생 클래스에서 재정의한 예

public class Musician {
    protected String name;
    public Musician(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void play(){
        System.out.println(name+" 연주하다.");
    } 
}
public class Pianist extends Musician{
    String name;
    public Pianist(String name,String mname){
        super(mname);
        this.name = name; 
    } 
    @Override public void play(){
        super.play();
        System.out.println(super.name+", 피아니스트 "+name+" 딩동댕");
    } 
}
public class Program {
    public static void main(String[] args){
        Pianist pianist = new Pianist("홍길동","홍피아리스트");
        pianist.play();
    }
}

실행 결과

홍피아리스트 연주하다.
홍피아리스트, 피아니스트 홍길동 딩동댕