오버로딩(Overloading)과 오버라이딩(Overriding)
728x90

 

오버로딩(Overloading)

정의

  • 같은 이름의 메서드가 다른 매개변수 목록(개수, 타입, 순서)으로 정의되는 것.

특징

 

  • 컴파일 시점에 호출할 메서드가 결정됨.
  • 반환값은 오버로딩과 관계없음.
  • 같은 클래스 내에서 정의.

 

오버라이딩(Overriding)

정의

  • 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의하는 것.

특징

 

  • 메서드 시그니처(이름, 매개변수, 반환 타입)가 부모 클래스와 동일해야 함.
  • 런타임 시점에 호출할 메서드가 결정됨(다형성 구현).
  • 접근 제어자는 부모 클래스의 메서드보다 넓거나 동일해야 함.
  • @Override 애너테이션을 통해 오버라이딩 여부를 명시.

 


 

차이

선언부(Signature), 동작 시점(컴파일 vs 런타임)

  1. 오버로딩
    • 메서드 이름은 같지만 매개변수 목록이 다름.
    • 컴파일 시점에 호출될 메서드가 결정됨.
    • 컴파일러는 호출 시 제공된 매개변수의 타입과 개수를 기준으로 가장 적합한 메서드를 선택.
  2. 오버라이딩
    • 메서드 시그니처가 부모 클래스와 동일.
    • 부모 클래스의 레퍼런스로 자식 객체를 참조할 때, 자식 클래스에서 재정의된 메서드가 호출됨(다형성).
    • 런타임 시점에 호출될 메서드가 결정됨.

 


 

예시

오버로딩

  • 스프링 컨트롤러:
    • 요청 매핑 메서드 이름을 유지하면서 다양한 요청 처리.
     
@GetMapping("/user")
public String getUser(@RequestParam String id) {
    return "유저 ID: " + id;
}

@GetMapping("/user")
public String getUser(@RequestParam String id, @RequestParam String name) {
    return "유저 ID: " + id + ", 이름: " + name;
}

 

 

오버라이딩

  • 스프링 서비스:
    • 부모 클래스(또는 인터페이스)의 공통 메서드를 재정의하여 서비스 동작을 커스터마이징
@Service
public class CustomUserService extends UserService {
    @Override
    public User findUserById(String id) {
        // 사용자 정의 로직 추가
        return super.findUserById(id);
    }
}

 

 

 


 

면접 질문

 

Q. 오버로딩과 오버라이딩의 차이를 설명하시오.

  • 오버로딩은 같은 이름의 메서드를 다른 매개변수 목록으로 정의하며, 컴파일 시점에 호출 메서드가 결정됩니다.
  • 오버라이딩은 부모 클래스의 메서드를 재정의하며, 런타임 시점에 호출 메서드가 결정됩니다.

 

Q. @Override 애너테이션의 역할은 무엇인가요?

  • 부모 클래스의 메서드를 정확히 재정의하도록 강제하여, 오타나 시그니처(매개변수, 반환 타입, 접근 제어자) 불일치를 방지합니다.
  • 오버라이딩의 명확성을 높이고, 코드 가독성과 유지보수성을 향상시킵니다.

 

Q. 오버라이딩에서 부모 메서드보다 접근 제어자를 넓게 설정해야 하는 이유는?

  • 부모 클래스의 메서드가 호출 가능한 모든 곳에서, 자식 클래스의 재정의된 메서드도 호출 가능해야 합니다.
  • 이를 위반하면 LSP(리스코프 치환 원칙)에 어긋납니다.
  • 예를 들어, 부모의 protected 메서드를 자식 클래스에서 private로 변경하면, 부모 타입으로 호출할 때 접근할 수 없게 됩니다.
728x90
반응형