728x90
오버로딩(Overloading)
정의
- 같은 이름의 메서드가 다른 매개변수 목록(개수, 타입, 순서)으로 정의되는 것.
특징
- 컴파일 시점에 호출할 메서드가 결정됨.
- 반환값은 오버로딩과 관계없음.
- 같은 클래스 내에서 정의.
오버라이딩(Overriding)
정의
- 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의하는 것.
특징
- 메서드 시그니처(이름, 매개변수, 반환 타입)가 부모 클래스와 동일해야 함.
- 런타임 시점에 호출할 메서드가 결정됨(다형성 구현).
- 접근 제어자는 부모 클래스의 메서드보다 넓거나 동일해야 함.
- @Override 애너테이션을 통해 오버라이딩 여부를 명시.
차이
선언부(Signature), 동작 시점(컴파일 vs 런타임)
- 오버로딩
- 메서드 이름은 같지만 매개변수 목록이 다름.
- 컴파일 시점에 호출될 메서드가 결정됨.
- 컴파일러는 호출 시 제공된 매개변수의 타입과 개수를 기준으로 가장 적합한 메서드를 선택.
- 오버라이딩
- 메서드 시그니처가 부모 클래스와 동일.
- 부모 클래스의 레퍼런스로 자식 객체를 참조할 때, 자식 클래스에서 재정의된 메서드가 호출됨(다형성).
- 런타임 시점에 호출될 메서드가 결정됨.
예시
오버로딩
- 스프링 컨트롤러:
- 요청 매핑 메서드 이름을 유지하면서 다양한 요청 처리.
@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
반응형
'프로그래밍 언어 > Java' 카테고리의 다른 글
가비지 컬렉션(Garbage Collection) (1) | 2024.12.09 |
---|---|
비동기와 동기(Thread, synchronized, CompletableFuture) (0) | 2024.11.22 |
String, StringBuffer, StringBuilder? – 문자열 처리의 모든 것 (0) | 2024.11.19 |
자바의 장단점을 알아보자. (0) | 2024.11.19 |
캡슐화와 은닉화의 차이 - 객체지향 프로그래밍(OOP)의 기본 원칙 (0) | 2024.11.19 |