java

[Java] 오버로딩(Overloading)과 오버라이딩(Overriding)

소리소리솔소리 2023. 5. 3. 13:05

오버로딩(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