본문 바로가기
Develop/Java

메서드 오버로딩 (Overloading)

by 준팍(junpak) 2023. 4. 3.

한 클래스 내에서 메서드는 각기 다른 이름을 가져야한다.

변수와 마찬가지로 같은 클래스 내에서 서로 구별할 수 있어야하기 때문이다.

그럼 같은 일을 하지만 매개 변수가 다른 경우마다, 계속 새로운 이름을 붙여야하는 걸까?

25년된 철학관의 작명가도 이름짓다가 지칠 것이다.

그런 경우를 대비해서 사용되는 개념이 메서드 오버로딩이다.

메서드 오버로딩의 정의

  • 한 클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것
  • 매개 변수의 개수 또는 타입이 다른 경우 같은 이름을 사용하여 메서드 정의 가능

 

메서드 오버로딩의 조건

  • 매서드 이름이 같아야한다.
  • 매개변수의 개수 또는 타입이 달라야한다. (= 매개변수에 의해서만 구별된다.)
  • 오버로딩 구현 불가능한 경우
    • 매개변수의 이름만 다른 경우 (변수의 이름만 다른 경우 정확히 같은 메서드이기 때문)
    • 리턴타입만 다른 경우 (어떤 메서드가 호출된 것인지 결정 불가능)

 

메서드 오버로딩의 장점

  • 메서드의 이름을 절약할 수 있다.
    (= 메서드 작성자의 네이밍 부담이 줄어든다.)
  • 메서드의 이름만 보고도 메서드의 기능을 쉽게 예측 가능하다.
    (= 메서드 사용자의 암기 부담이 줄어든다.)

 

메서드 오버로딩 시 주의점

  • 오버로딩(다중정의)된 메서드 중 어느 메서드를 호출할 지 여부가 컴파일 타임에 정해진다.
    • 따라서 런타임 시점에는 매개변수의 타입이 달라지더라도,
      컴파일 시점에 이미 호출할 메서드가 정해져있기 때문에 개발자가 의도한대로 동작하지 않을 가능성이 높다.
    • 이 문제가 특히 헷갈리는 이유는, 오버라이딩(재정의) 된 경우는 런타임 시점의 타입이 메서드 호출의 기준이 되기 때문이다.
  • 해결 방안
    • 매개변수 수가 같은 메서드 오버라이딩 금지
      • 특히 가변 인수를 사용한 메서드라면 오버라이딩을 아예 하지 말아야한다.
    • 오버 라이딩 대신 메서드의 이름을 타입별로 다르게 지어주기
    • 생성자의 경우, 네이밍이 불가능하므로 정적 팩터리 메서드 사용을 고려하기

 

 

레퍼런스

  • 자바의 정석 3판 p.283 ~ 285
  • 이펙티브 자바 아이템 52

'Develop > Java' 카테고리의 다른 글

추상 클래스와 인터페이스  (0) 2023.04.04
다형성  (0) 2023.04.04
제어자  (0) 2023.04.04
메서드 오버라이딩(Overriding)  (0) 2023.04.04
클래스와 인스턴스  (0) 2023.04.03