Android/JAVA 기본문법

오버라이딩

gandus 2010. 5. 12. 16:55
2.1 오버라이딩이란?



조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
상속받은 메서드를 그대로 사용하기도 하지만, 자손클래스 자신에 맞게 변경해야하는 경우가 많다.

이럴 때 조상의 메서드를 오버라이딩한다.

[참고]override의 사전적 의미는 '~위에 덮어쓰다(overwrite).' 또는 '~에 우선하다.'이다.

2차원 좌표계의 한 점을 표현하기 위한 Point클래스가 있을 때, 이를 조상으로 하는 Point3D클래스,
3차원 좌표계의 한 점을 표현하기 위한 클래스를 다음과 같이 새로 작성하였다고 하자.


class Point {
      int x;      
      int y;

      String getLocation() {
            return "x :" + x + ", y :"+ y;
     }
}

class Point3D extends Point {
      int z;
      String getLocation() {       // 오버라이딩
            return "x :" + x + ", y :"+ y + ", z :" + z;
      }      
}


Point클래스의 getLocation메서드는 한 점의 x, y 좌표를 문자열로 반환하도록 작성되었다.
이 두 클래스는 서로 상속관계에 있으므로 Point3D클래스는 Point클래스로부터 getLocation메서드를 상속받지만,
Point3D클래스는 3차원 좌표계의 한 점을 표현하기 위한 것이므로 조상인 Point클래스로부터 상속받은
getLocation메서드는 Point3D클래스에 맞지 않는다. 그래서 이 메서드를 Point3D클래스 자신에 맞게 z축의 좌표값도 포함하여 반환하도록 오버라이딩 하였다.

Point클래스를 사용하던 사람들은 새로 작성된 Point3D클래스가

Point클래스의 자손이므로 Point3D클래스의 인스턴스에 대해서 getLocation메서드를 호출하면

Point클래스의 getLocation메서드가 그랬듯이 점의 좌표를 문자열로 얻을 수 있을 것이라고 기대할 것이다.

그렇기 때문에 새로운 메서드를 제공하는 것보다 오버라이딩을 하는 것이 바른 선택이다.


2.2 오버라이딩의 조건


오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야한다.
그래서 오버라이딩이 성립하기 위해서는 다음과 같은 조건을 만족해야한다.


자손클래스에서 오버라이딩하는 메서드는 조상클래스의 메서드와
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 리턴타입이 같아야 한다.


class Parent {
     void parentMethod() {}
}

class Child extends Parent {
     void parentMethod() {} // 오버라이딩
     void parentMethod(int i) {} // 오버로딩

     void childMethod() {}
     void childMethod(int i) {} // 오버로딩
     void childMethod() {}       // 에러!!! 중복정의 되었음.(already defined in Child)
}




조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고는 super와 this는 근본적으로 같다.
모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
static메서드(클래스메서드)는 인스턴스와 관련이 없다.

그래서 this와 마찬가지로 super역시 static메서드에서는 사용할 수 없고 인스턴스메서드에서만 사용할 수 있다.

[예제7-6] SuperTest2.java

class SuperTest2 {
      public static void main(String args[]) {
            Child c = new Child();
            c.method();
      }
}

class Parent {
      int x=10;
}

class Child extends Parent {
      int x=20;
      void method() {
            System.out.println("x=" + x);
            System.out.println("this.x=" + this.x);
            System.out.println("super.x="+ super.x);
      }
}
[실행결과]
x=20
this.x=20
super.x=10