IT 개발노트
오버라이딩이란? 본문
1. 오버라이딩
1.1 오버라이딩이란?
: 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라 한다. 간단히 말하면 메서드를 다시 정의하는 것이다.
예시 1
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Parent { int age = 10; public void setAge(int age) { this.age = age; } } class Child extends Parent { public void setAge(int age) { this.age = age+10; } } |
- Child클래스가 Parent클래스를 상속받고 있다. 상속 관계이므로 Child에서는 setAge() 메서드를 그래도 사용할 수 있다. 그러나 Child에서는 메서드의 기능을 약간 변경해서 사용하고 있다.
이런식으로 상속을 받은 부모의 메서드를 필요에 맞게 다시 정의해서 사용하는 것이 오버라이딩이다.
1.2 오버라이딩의 조건
: 오버라이딩은 메서드의 내용만 새로 작성하는 것이므로 메서드의 선언부는 부모의 것과 완전히 일치해야 한다.
오버라이딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.
자식 클래스에서 오버라이딩하는 메서드는 부모 클래스의 메서드와
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 리턴 타입이 같아야 한다.
* 요약하면 선언부가 일치하면 된다는 것이다. 그러나 접근 제어자와 예외는 제한된 조건에서만 다르게 변경할 수 있다.
1.2.1 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
: 만일 부모 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩 하는 자식 클래스의 메서드는 접근 제어자가 protected나 public이어야 한다.
예시 2
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Parent { int age = 10; protected void setAge(int age) { this.age = age; } } class Child extends Parent { public void setAge(int age) { this.age = age+10; } } |
1.2.2 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
: 아래의 코드를 보면 Child클래스의 parentMethod( )에 선언된 예외의 개수가 부모인 Parent클래스의 parentMethod( )에 선언된 예외의 개수보다 적으므로 바르게 오버라이딩 되었다.
예시 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.io.IOException; import java.sql.SQLException; class Parent { void parentMethod() throws IOException, SQLException { //... } } class Child extends Parent { void parentMethod() throws IOException { //... } } |
- 여기서 주의해야 할 점은 단순히 선언된 예외의 개수의 문제가 아니라는 것이다.
예시 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.io.IOException; import java.sql.SQLException; class Parent { void parentMethod() throws IOException, SQLException { //... } } class Child extends Parent { void parentMethod() throws Exception { //... } } |
- 만일 위와같이 오버라이딩을 하였다면, 분명히 부모 클래스에 정의된 메서드보다 적은 개수의 예외를 선언한 것 처럼 보이지만 Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던질 수 있도록 선언한 것이다.
그래서 예외의 개수는 적거나 같아야 한다는 조건을 만족시키지 못하는 잘못된 오버라이딩인 것이다.
부모 클래스의 메서드를 자식 클래스에서 오버라이딩 할 때
- 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 부모 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
1.3 오버라이딩과 오버로딩
- 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것
- 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Parent { void parentMethod() { } } class Child extends Parent { void parentMethod() { // 오버라이딩 } void parentMethod(int i) { // 오버로딩 } void childMethod() { // 오버로딩 } void childMethod(int i) { } } |