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(); } }
실행 결과
홍피아리스트 연주하다. 홍피아리스트, 피아니스트 홍길동 딩동댕