● 사실 코딩을 하는 과정에선 오버라이딩(Overriding)과 오버로딩(Overloading)을 헷갈릴 일은 없다. 왜냐하면 그 차이가 너무나도 명백하기 때문에 오버라이딩을 써야 하는 상황에서 오버로드를 쓰는 사람은 없을 것이기 때문이다. 하지만 굳이 이렇게 정리하는 이유는 면접에서 혹은 누군가가 물어본다면 그 차이를 명확히 설명하기 위해서이다, 또한 코딩을 처음 접하는 사람들은 각각의 개념도 잘 잡히지 않은 상태에서 이 둘을 헷갈려하면 굉장히 힘들기 때문이다(경험담).
언제나 그렇듯 간단하게 처음에 정리해보자면
오버로딩은 새로운 메서드를 형성하는 것이고 , 오버라이딩은 상속받은 메서드의 내용을 수정하는 것,
먼저 오버로딩부터 살펴보면 , 오버로딩은 한 클래스 내에서 이름이 같은 새로운 메서드를 형성하는 것이다. 메서드의 이름은 같지만 매개변수의 타입이나 개수가 다르므로 넣어주는 데이터의 타입에 따라 실행되는 메서드가 다를 것이다. 따라서 이름은 같아도 매개변수가 다른, 서로 다른 메서드인 것이다.(리턴 타입(반환 타입)은 일치하지 않아도 된다) 이런 식으로 여러 개의 메서드를 정의하는 것을 오버로딩이라 한다. 대표적인 예로는 아래와 같은 메서드가 있다.
PrintStream이라는 클래스 내에서 println이라는 메서드는 오버로딩 되었다. 따라서 우리는 자바라는 언어를 공부하면서 어지간한 타입, 정수 실수 문자열 등등의 출력은 println으로 실행한 경험이 있을 것인데 바로 오버로딩한 println메서드에 의해서 가능한 일이었다고 보면 된다.
오버라이딩은 상속받은 메서드를 재정의 하는것 , 오버로딩과 헷갈릴일이 없는것이 오버라이딩은 상속관계에서만 사용 가능하다. 따라서 조상에게 상속받은 메서드를 자손 클래스에서 재정의 하는 것이 오버라이딩이고 오버라이딩의 규칙은 다음과 같다. 메서드의 이름이 일치해야 하고, 매개변수와 리턴 타입이 일치해야 하며, 메서드의 내용만 변경되어야 한다.
이게 무슨 의미냐 하면 조상에서 상속받은 메서드를 자손 타입의 클래스에 맞게끔 다듬거나 살짝 변형해서 쓸 수 있다는 얘기이다. 또 오버라이딩에는 추가로 주의해야 할 점들이 존재한다. 오버라이딩한 메서드의 접근 제어자가 조상의 메서드보다 좁은 범위로 설정하면 안 된다.
접근제어자 범위 : 접근 범위↓ PRIVATE < PROTECTED < DEFUALT < PUBLIC 접근 범위 ↑
따라서 접근제어자의 범위를 참고하여 항상 오버라이딩한 메서드의 접근제어자가 조상의 메서드의 접근제어 자보다 좁은 범위를 갖지 않게 주의해 주어야 하고, 조상 타입에서 선언한 예외의 개수보다 적은 예외를 선언해야 하며, 예외의 개수가 적더라도 조상에서 선언한 예외 중에 자손이 선언한 예외가 존재하지 않는다면 에러가 발생하니 이점도 주의하자.
다음 중 오버라이딩한 메서드와 오버로딩한 메서드를 구별해보자!
class Parents { void parentsMethod(){} } class Childs extends { void parentsMethod(){} // 1 void parentsMethod(int x){} // 2 void parentsMethod(){system.out.println("*");} // 3 void childMethod() {} void childMethod(int x) {} // 4 void childMethod() {} // 5 }
1, 2, 3, 4, 5 중에서 오버라이딩과 오버로딩을 구분해보자
정답
1 -> 오버라이딩 , 메서드를 수정하지 않았지만 매개변수와 리턴타입이 일치하고 메서드명도 같다 따라서 오버라이딩
2 -> 오버로딩
3 -> 오버라이딩
4 -> 오버로딩
5 -> 재정의 , Error
'Java > Java Study' 카테고리의 다른 글
[객체지향] 다형성, Polymorphism - Part3 (다형성의 장점) (0) | 2021.05.13 |
---|---|
this & this( ) & super (5월/13일 내용추가) (0) | 2021.05.10 |
[객체지향] 다형성, Polymorphism - Part2 (참조변수의 형변환) (0) | 2021.05.03 |
[객체지향] 다형성, Polymorphism - Part1 (0) | 2021.04.26 |
new 연산자 와 객체생성에 대하여 (0) | 2021.04.24 |