오버로딩(Overloading)
- 메서드의 이름은 같고 매개변수의 개수나 타입이 다른 함수를 정의하는 것
- 리턴 값만을 다르게 갖는 오버로딩은 작성할 수 없다.
- 같은 매개변수의 개수와 타입을 가지면서 접근 제어자만 다르게 한다고 오버로딩이 되지는 않는다.
- 같은 기능을 하는 메서드를 하나의 이름으로 사용할 수 있다.
- 기존에 없던 새로운 메서드를 정의
public class Test {
// 매개변수가 없는 overloadingTest() method
void overloadingTest(){
System.out.println("매개변수를 받지 않는 메서드");
}
// 매개변수로 int형 인자 2개를 요청하는 overloadingTest(int a, int b) method
void overloadingTest(int a, int b){
System.out.println("int형 인자 2개를 요청하는 메서드 "+ a + ", " + b);
}
// 매개변수로 String형 인자 1개를 요청하는 overloadingTest(String str) method
void overloadingTest(String str){
System.out.println("String형 인자 1개를 요청하는 메서드 " + d);
}
}
오버라이딩(Overriding)
- 상위 클래스의 메서드를 하위 클래스가 재정의 하는 것
- 메서드의 이름은 물론 파라미터의 개수나 타입이 동일해야 한다
- 주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용된다.
- 상위 클래스의 메서드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
- 상위 클래스의 메서드보다 더 큰 범위의 예외를 선언할 수 없다.
- 상속 받은 메서드의 내용만 변경하는 것
public class Parent {
public void overridingTest() {
System.out.println("부모 메서드의 내용");
}
}
public class Child extends Parent {
@Override
public void overridingTest() {
System.out.println("부모 클래스의 메서드를 상속받아 내용을 재정의해서 사용");
}
}
실무에서 인터페이스를 implements로 가져와서 인터페이스에 정의된 메서드를 @Override 어노테이션을 사용하여 오버라이딩해서 재정의 하는데, 이때, interface의 메서드를 오버라이드해서 구현하는 경우 반드시 public 접근 제어자를 사용해야 한다.
@Override 어노테이션은 없어도 오버라이딩이 적용되어 정상적으로 작동한다. 그렇다면 @Override 어노테이션을 쓰는 이유는 무엇일까?
@Override 어노테이션은 시스템에서 오버라이딩한 메서드라고 알리는 역할로 오버라이딩이 잘못된 경우 경고를 준다.
예를 들어, 백엔드 단에서 사용되는 라이브러리 중 하나가 업데이트 되어 상속하는 클래스 메서드의 시그니처가 바꼈다.
@Override 어노테션이 적용되지 않은 상태에서는 전에 오버라이드 한 메서드가 업데이트 이후 그냥 추가적인 메서드로 인식되어 컴파일 오류가 발생하지 않는다. 이때, @Override 어노테이션을 적용함으로써 의도적으로 컴파일 오류를 일으켜 작동 방식이 바뀌는 것을 대비할 수 있다.
또한, @Override를 표시함으로써 코드 리딩 시에 항상 메서드가 오버라이딩하였다는 것을 쉽게 파악할 수 있다.
'java' 카테고리의 다른 글
[Java] 스트림(Stream)과 람다식 (0) | 2023.05.03 |
---|---|
[Java] 추상클래스(abstract class)와 인터페이스 (0) | 2023.05.03 |
java (Comparable/Compatator) (0) | 2022.09.29 |
java (Set-HashSet) (0) | 2022.09.29 |
java (Map-HashMap,Hashtable, Properties) (0) | 2022.09.29 |