본문으로 바로가기

오버라이딩(Overriding)

category 코딩/Java 2016. 9. 20. 21:43





오버라이딩이란?



부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라 한다. 간단히 말하면 메서드를 다시 정의하는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class A
{
    int age = 10;
 
    public void setAge(int age)
    {
        this.age = age;
    }
}
 
 
class B extends A
{
    public void setAge(int age)
    {
        this.age = age+10;
    }
}
cs


위에서 B클래스가 A클래스를 상속받고 있다. 상속 관계이므로 B에서는 setAge( ) 메서드를 그대로 사용할 수 있다. 그러나 여기에서는 메서드의 기능을 약간 변경해서 사용하고 있다.


이런 식으로 상속을 받은 부모의 메서드를 필요에 맞게 다시 정의해서 사용하는 것이 오버라이딩(Overriding) 이다.




오버라이딩의 조건



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



자식 클래스에서 오버라이딩하는 메서드는 부모 클래스의 메서드와 

  • 이름이 같아야 한다.

  • 매개변수가 같아야 한다.

  • 리턴 타입이 같아야 한다.



요약하면 선언부가 일치하면 된다는 것이다. 그러나 접근 제어자와 예외는 제한된 조건에서만 다르게 변경할 수 있다.



1. 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

- 만일 부모 클래스에 정의된 메서드의 접근 제어자가 protected 라면, 이를 오버라이딩 하는 자식 클래스의 메서드는 접근 제어자가 protected나 public이어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class A
{
    int age = 10;
 
    protected void setAge(int age)
    {
        this.age = age;
    }
}
 
 
class B extends A
{
    void setAge(int age) // 에러
    {
        this.age = age+10;
    }
}
cs



2. 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

- 아래의 코드를 보면 Child클래스의 parentMethod( )에 선언된 예외의 개수가 부모인 Parent클래스의 parentMethod( )에 선언된 예외의 개수보다 적으므로 바르게 오버라이딩 되었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.IOException;
import java.sql.SQLException;
 
public class Parent
{
    void parentMethod() throws IOException, SQLException
    {
        // ...
    }
}
 
class Child extends Parent
{
    void parentMethod() throws IOException
    {
        // ...
    }
}
cs


여기서 주의해야 할 점은 단순히 선언된 예외의 개수의 문제가 아니라는 적이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.IOException;
import java.sql.SQLException;
 
public class Parent
{
    void parentMethod() throws IOException, SQLException
    {
        // ...
    }
}
 
class Child extends Parent
{    // 에러...
    void parentMethod() throws Exception
    {
        // ...
    }
}
cs


만일 위와같이 오버라이딩을 하였다면, 분명히 부모 클래스에 정의된 메서드보다 적은 개수의 예외를 선언한 것처럼 보이지만 Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던질 수 있도록 선언한 것이다.


그래서 예외의 개수는 적거나 같아야 한다는 조건을 만족시키지 못하는 잘못된 오버라이딩인 것이다.



부모 클래스의 메서드를 자식 클래스에서 오버라이딩 할 때

  1. 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

  2. 예외는 부모 클래스의 메서드보다 많이 선언할 수 없다.

  3. 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.




오버라이딩과 오버로딩



- 오버로딩(overloading) : 기존에 없는 새로운 매서드를 정의하는 것

- 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것



1
2
3
4
5
6
7
8
9
10
11
12
13
public class Parent
{
    void parentMethod() {}
}
 
class Child extends Parent
{    
    void parentMethod() {}         // 오버라이딩
    void parentMethod(int a) {} // 오버로딩
    
    void childMethod() {}
    void childMethod(int b) {}    // 오버로딩
}
cs







RSS구독 링크추가 트위터 이메일 구독