본문 바로가기

Java/강의

매소드 재정의 (Method Overriding)

메소드의 재정의
// Person 클래스에서 정의한 print() 메소드를 서브클래스에서 재정의한 프로그램

class Person
{
  protected String name;

  public Person(String aName)
  {
    name = aName;
  }

  protected void print()
  {
    System.out.println(< Person >");
    System.out.println(" Name : " + name);
    System.out.println();
  }
}

class Professor extends Person
{
  private String major;

  public Professor(String aName, String aMajor)
  {
    super(aName);
    major = aMajor;
  }

  protected void print()
  {
    System.out.println(< Professor >");
    System.out.println(" Name : " + name);
    System.out.println(" Major : " + major);
    System.out.println();
  }
}

public class PersonInformation
{
  public static void main(String[] args)
  {
    Person aPerson=new Person("Lee");
    Professor aProf=new Professor("Kim""Computer Science");
    aPerson.print();
    aProf.print();
  }
}

print() 는 수퍼클래스 Person에서 정의되어 Professor 클래스에 상속되고,
Professor  클래스에서 다시 정의되었다. 
print() 메소드는 인수를 갖지 않으므로 시그니쳐가 같다. 

객체의 클래스에 따라 실행되는 print() 메소드가 결정된다. 
객체가 Person 클래스이면 Person 클래스의 print() 메소드가 실행되고, 
객체가 Prefessor 클래스이면 Prefessor 클래스의 print() 메소드가 실행된다. 

재정의 print()의 접근속성은 수퍼클래스의 protected보다 한정될 수 없다. 
인스턴스 변수의 경우도 재정의할 수 있으나, 사용하지 않는 것이 좋다. 

Professor 클래스에서 재정의된 print() 메소드는 super를 이용하여 다음과 같이 고쳐쓸 수 있다. 
이 방법으로 super를 이용하여 수퍼클래스의 메소드를 명시적으로 사용할 수 있다.       

protected void print() {        
   super.print();         
   System.out.println ("Major : " + major);

'Java > 강의' 카테고리의 다른 글

Class 클래스와 다형성  (0) 2011.03.02
Object 클래스  (0) 2011.02.25
상속 (Inheritance)  (0) 2011.02.21
Random 클래스  (0) 2011.02.21
vector 클래스  (0) 2011.02.16