본문 바로가기
JAVA

Java 메소드 오버로딩: 개념, 장단점, 오버라이딩과의 차이

by GangDev 2024. 5. 30.

오버로딩이란

Java에서 메소드 오버로딩(overloading)은 같은 이름의 메소드를 여러 개 정의하는 것을 의미한다. 이때 각 메소드는 매개변수의 타입이나 개수가 달라야 한다. 이는 같은 동작을 수행하지만, 입력 값의 형태에 따라 다른 방식으로 처리해야 할 때 유용하다. 예를 들어, 문자열의 길이를 계산하는 메소드와 정수의 자릿수를 계산하는 메소드를 각각 getLength(String str)와 getLength(int i)로 정의할 수 있다. 이렇게 하면, 메소드 호출 시 전달된 인자의 타입에 따라 적절한 메소드가 선택되어 실행된다.

 

오버로딩의 주요 특징은 다음과 같다:

  • 메소드 이름은 동일해야 하지만, 매개변수의 타입이나 개수는 달라야 한다.
  • 반환 타입은 오버로딩을 구분하는 기준이 아니다. 즉, 매개변수 외에 반환 타입만 다른 경우 오버로딩으로 간주되지 않는다.
  • 오버로딩은 컴파일 시간에 결정된다. 즉, 어떤 메소드가 호출될지는 컴파일러가 소스 코드를 분석하여 결정한다.
class Example {
    // 문자열의 길이를 계산하는 메소드
    public static void getLength(String str) {
        System.out.println("문자열 '" + str + "'의 길이는 " + str.length() + "입니다.");
    }

    // 정수의 자릿수를 계산하는 메소드
    public static void getLength(int i) {
        System.out.println("정수 '" + i + "'의 자릿수는 " + (int)(Math.log10(i)+1) + "입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Example.getLength("비트코딩"); // 문자열 '비트코딩'의 길이는 4
        Example.getLength(13579); // 정수 '13579'의 자릿수는 5
    }
}

 

위 예시에서 getLength 메소드는 오버로딩되어 문자열과 정수에 대해 각각 다른 방식으로 처리한다. 이를 통해 같은 메소드 이름을 사용하면서도 다양한 입력 타입에 유연하게 대응할 수 있다.

Java 오버로딩의 장단점

장점

  • 읽기 쉬움: 오버로딩을 사용하면 같은 이름의 메소드를 여러 가지 파라미터로 정의할 수 있어 코드의 가독성을 높일 수 있다.
  • 재사용성 향상: 비슷한 기능을 수행하는 메소드들을 하나의 이름 아래 묶어서 재사용성을 높일 수 있다.
  • 유연성: 비슷한 작업을 수행하되, 입력 밧의 형태에 따라 다르게 처리할 수 있게 해준다. 이는 메소드 이름을 기억하지 않아도 되므로 개발자가 코드를 더 쉽게 사용할 수 있게 한다.
  • 효율성: 불필요한 메소드 생성을 줄여 코드 효율성을 높이고, 리소스 사용을 최적화할 수 있다.

단점

  • 초급자에게 어려울 수 있음: 오버로딩은 처음 배우는 사람들에게 복잡하게 느껴질 수 있으며, 올바르게 설계하기 위해서는 초기에 더 많은 노력이 필요할 수 있다.
  • 암시적 타입 변환으로 인한 문제: 오버로딩된 메소드 중 일부가 암시적 타입 변환을 통해 서로 혼동될 수 있는 경우, 컴파일러가 어떤 메소드를 호출해야 하는지 판단하기 어렵게 된다. 이런 상황을 피하려면 오버로딩된 메소드들이 명확하게 구별되는 파라미터 목록을 가져야 한다.

오버로딩은 코드의 가독성과 유연성을 높이며, 비슷한 기능을 가진 메소드들을 효괒거으로 관리할 수 있게 해주는 강력한 기능이다. 그러나 올바르게 사용하기 위해서는 메소드의 파라미터를 신중하게 설계하고, 가능한 한 명확하게 구별할 수 있도록 해야 한다.

오버로딩과 오버라이딩의 차이점

오버로딩(Overloading)과 오버라이딩(Overriding)은 객체 지향 프로그래밍에서 중요한 개념들로, 메소드의 재정의 또는 확장에 사용된다. 두 개념은 비슷해 보이지만, 사용 목적과 적용 방식에서 차이가 있다.

오버로딩(Overloading)

  • 정의: 같은 이름의 메소드를 여러 개 정의하는 것. 이때 메소드는 매개변수의 타입, 개수, 순서를 다르게하여 구분된다.
  • 목적: 동일한 기능을 수행하는 메소드들을 하나의 이름으로 통일하여 코드의 가독성을 높이고, 다양한 입력 타입에 유연하게 대응할 수 있게 한다.
  • 예시:
class Car {
    public int setModel(int modelNum) {... }
    public String setModel(int modelNum, String brand) {... }
}

 

여기서 setModel 메소드는 오버로딩되어 모델 번호만을 인자로 받거나, 모델 번호와 브랜드명을 함께 인자로 받는 두 가지 형태로 정의되어 있다.

오버라이딩(Overriding)

  • 정의: 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것. 오버라이딩된 메소드는 부모 클래스의 메소드와 이름, 매개변수 리스트가 완전히 일치해야 한다.
  • 목적: 부모 클래스의 메소드의 기본적인 기능을 유지하면서 추갖거인 기능을 구현하거나, 기존 기능을 변경하고 싶을 때 사용됨.
  • 예시:
class Car {
    public int setSpeed(int speed_change) {... }
}

class Sonata extends Car {
    @Override
    public int setSpeed(int speed) {
        // Sonata 클래스에서 setSpeed 메소드를 재정의
    }
}

 

여기서 Sonata 클래스는 Car 클래스를 상속받아 setSpeed 메소드를 오버라이딩하여, 자신의 고유한 속도 설정 로직을 구현한다.

주요 차이점

  • 적용 범위: 오버로딩은 같은 클래스 내에서 발생하며, 오버라이딩은 부모 클래스와 자식 클래스 사이에서 발생한다.
  • 매개변수: 오버로딩에서는 매개변수의 타입, 개수, 순서가 달라야 하지만, 오버라이딩에서는 부모 클래스의 메소드와 정확히 동일한 매개변수를 가져야 한다.
  • 목적: 오버로딩은 다양한 입력 타입에 대한 처리를 하나의 메소드 이름으로 통합하는 데 사용되며, 오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 확장하거나 수정하는 데 사용된다.