자바 오버로딩(overloading)에 대해 알아보자

2025. 2. 6. 13:00JAVA

728x90
반응형

 

 안녕하세요. 진득코딩입니다.

 

 프로그래밍을 하면서 개발자들이 가장 어려워하는 것은 변수명이나 메서드명을 지어주는 것입니다.

 

 자바에서는 개발자들이 굉장히 힘들어하는 이름 짓기의 어려움을 조금이라도 덜어주는 개념이 있습니다.

 

 이번 시간에는 자바에서의 오버로딩이라는 개념에 대해 살펴보도록 하겠습니다.

 

오버로딩(Overloading)

 

  • 자바에서는 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있습니다.

  • 이렇게, 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 '오버로딩(overloading)'이라고 합니다.

오버로딩의 조건

 


 1. 메서드 이름이 같아야 한다.

 2. 매개변수의 개수 또는 타입이 달라야 한다.

 

  • 비록 메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능합니다.

  • 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못합니다.

오버로딩의 예

 

  • 오버로딩의 예로 가장 대표적인 것은 println메서드입니다.

  • 실제로는 println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라집니다.

  • PrintStream클래스에는 어떤 종류의 매개변수를 지정해도 출력할 수 ㄷ있도록 아래와 같이 10개의 오버로딩된 println메서드를 정의해놓고 있습니다.


 void println()

 void println(boolean x)

 void println(char x)

 void println(char[ ] x)

 void println(double x)

 void println(float x)

 void println(int x)

 void println(long x)

 void println(Object x)

 void println(String x)

 

  • println메서드를 호출할 때 매개변수로 넘겨주는 값의 타입에 따라서 위의 오버로딩된 메서드들 중의 하나가 선택되어 실행되는 것입니다.

  • 몇 가지 예시를 통해 오버로딩에 대해 더 자세히 살펴보도록 하겠습니다.

 

  • 위 두 메서드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에 오버로딩이 성립하지 않습니다.

  • 컴파일하면, 'add(int, int) is already defined(이미 같은 메서드가 정의되었다.)'라는 메시지가 나타납니다.

 

  • 위 예시는 리턴 타입만 다른 경우입니다.

  • 매개변수의 타입과 개수가 일치하기 때문에 호출하였을 때 어떤 메서드가 호출된 것인지 결정할 수 없기 때문에 오버로딩으로 간주하지 않습니다.

  • 이 경우 역시 컴 파일하면, 'add(int, int) is already defined(이미 같은 메서드가 정의되었다.)'라는 메시지가 나타납니다.

 

  • 두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가 다른 경우입니다.

  • 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 중복된 메서드 정의가 아닌, 오버로딩으로 간주합니다.

 

  • 위 메서드들은 모두 바르게 오버로딩되어 있습니다.

  • 정의된 매개변수가 서로 다르긴 해도, 세 메서드 모두 매개변수로 넘겨받은 값을 더해서 그 결과를 돌려주는 일을 합니다.

  • 이렇게 같은 일을 하지만 매개변수를 달리해야 하는 경우에, 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현합니다.

오버로딩의 장점

 

  • 오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의될 수 있다면, 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 많이 줄일 수 있습니다.

  • 또한 메서드의 이름을 절약할 수 있다는 장점을 가지고 있습니다.

예제 6-21_1
예제 6-21_2

 

  • 위 예제에서 add메서드가 println메서드보다 먼저 출력되는 이유는 println메서드가 결과를 출력하려면, add메서드의 결과가 먼저 계산되어야 하기 때문입니다.

가변인자(varargs)와 오버로딩

 

  • 메서드의 매개변수 개수를 동적으로 지정해 줄 수 있으며, 이 기능을 '가변인자(variable arguments)'라고 합니다.

  • 가변인자는 '타입... 변수명'과 같은 형식으로 선언합니다.

  • 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 합니다.

  • 만일 여러 문자열을 하나로 결합하여 반환하는 concatenate메서드를 작성한다면, 아래와 같이 매개변수의 개수를 다르게 해서 여러 개의 메서드를 작성해야 합니다.

 

  • 이럴 때, 가변인자를 사용하면 메서드 하나로 간단히 대체할 수 있습니다.

 

  • 위 메서드를 호출할 때는 아래와 같이 인자의 개수를 가변적으로 할 수 있습니다.

  • 심지어는 인자가 아예 없어도 되고 배열도 인자가 될 수 있습니다.

 

  • 위 코드에서 유추할 수 있는데 가변인자는 내부적으로 배열을 이용합니다.

  • 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성됩니다.

  • 가변인자가 편리하지만, 이런 비효율적인 면이 있기 때문에 꼭 필요한 경우에만 가변인자를 사용하는 것이 좋습니다.

  • 매개변수의 타입을 배열로 하면, 반드시 인자를 지정해 줘야 하기 때문에, 인자를 생략할 수 없습니다.

예제 6-22

 

  • concatenate메서드는 매개변수로 입력된 문자열에 구분자를 사이에 포함시켜 결합해서 반환합니다.

  • 가변인자로 매개변수를 선언했기 때문에 문자열을 개수의 제약없이 매개변수로 지정할 수 있습니다.

  • 위에 있는 주석된 메서드를 포함해 같은 이름의 두 메서드는 별 문제가 없어 보이지만 위의 예제에서 주석을 풀고 컴파일을 하면 컴파일 에러가 발생합니다.

주석 풀면 생기는 에러

 

  • 에러의 내용을 살펴보면 두 오버로딩된 메서드가 구분되지 않아서 발생하는 것임을 알 수 있습니다.

  • 가변 인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 합니다.

  • 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋습니다.


 

 이번 시간에는 이름이 같아도 매개변수가 다르다면 허용되는 오버로딩의 개념에 대해 살펴보았습니다.

 

 같은 기능을 하지만 들어가는 매개변수의 종류에 따라 여러 메서드를 만들어야 하는 경우에 특히 유용합니다.

 

 앞으로 위와 같은 경우가 생길 때 유용하게 사용하면 훨씬 더 좋은 코드가 될거라고 생각합니다.

 

 이번 포스팅은 여기까지입니다.

 

 궁금하신 사항이나 문의하실 사항은 댓글로 남겨주시면 성실히 답변하도록 하겠습니다.

 

 끝까지 봐주셔서 감사합니다.😊

728x90
반응형
LIST