IT 개발노트

오버라이딩이란? 본문

기초튼튼/JAVA

오버라이딩이란?

limsungju 2019. 1. 25. 11:48

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) {
    }
}



'기초튼튼 > JAVA' 카테고리의 다른 글

다형성이란?  (0) 2019.01.26
제어자란?  (0) 2019.01.25
상속이란?  (0) 2019.01.24
static의 이해  (0) 2019.01.23
변수의 초기화  (0) 2019.01.22