1. 오버라이딩이란?
부모 클래스로부터 상속 받은 메서드의 내용을 변경하는 것
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y :" + y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
String getLocation() { // 오버라이딩
return "x :" + x + ", y :"+ y + ", z :" + z;
}
}
위의 코드와 같이 상속 받은 클래스의 메서드를 그대로 사용하지 않고 자신에 맞게 변경하는 것을 오버라이딩이라고 한다.
2. 오버라이딩의 조건
- 메서드 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 리턴타입이 같이야 한다.
이렇게 부모로부터 상속 받은 메서드를 오버라이딩하기 위해서는 위의 조건을 만족해야한다. 그러나 access modifier와 exception은 제한된 조건에서 변경 가능하다.
2.1 Access modifier
접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 예를 들어 부모 클래스의 메서드가 protected라면, 오버라이딩하는 자식 클래스의 메서드의 access modifier는 protected나 public이어야 한다.
2.2 Exception
부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. 그러나 단순히 예외의 개수 뿐만 아니라 상위의 예외의 경우, 개수가 적어보이지만 더 많은 예외를 처리할 수 있기 때문에 선언할 수 없게 된다. 즉 예를 들어 부모 클래스에서 IOException과 SQLException이 선언되어 있는데, 자식 클래스에서 메소드를 오버라이딩할 때 IOException 하나만 선언하는건 가능하다. 그러나 Exception 하나만 선언하게되는 경우 Exception은 훨씬 많은 예외(Exception은 IOException과 SQLException을 포함하여, 다른 모든 Exception들을 처리할 수 있다.)를 처리하기 때문엔 하나만 선언을 한다고 적은 개수가 아니라는 의미이다.
그 외에 오버라이딩을 할 때 인스턴스 메서드를 static 메서드로 혹은 그 반대로 변경도 불가능하다.
3. 오버로딩과 오버라이딩의 차이
오버로딩과 오버라이딩을 혼동하기 쉽다. 간단히 생각하면된다. 오버로딩의 경우 이름이 같은 메서드를 여러 개로 정의하는 것이고, 오버라이딩의 경우 부모의 메서드를 재정의하는 것이다. 아래의 코드를 보면 좀 더 명확해질 것이다.
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void ParentMethod() {} // Overriding
void parentMethod(int i) {} // Overloading
}
'Programming > Java' 카테고리의 다른 글
다형성 (Polymorphism) (0) | 2015.07.12 |
---|---|
제어자(Modifier) (0) | 2015.06.28 |
상속 (Inheritance) (0) | 2015.06.22 |