본문 바로가기
Java/Java Basic

[Java Basic] 14. Java 매서드 오버로딩(Overloading)과 가변인자

by Rosmary 2022. 7. 6.
728x90
반응형

 

 

 

 

Java의 일반적인 매서드는 인자의 입력값을 통해 연산을 진행하여 결과로 돌려준다(물론, 입력, 출력이 없는 매서드도 있다). 지난 포스팅 서두의 메서드 관련 내용을 이해했다면, 이제 이런 질문이 생기는 분들도 있을 것이다.

 

"System.println() 매서드는 인자로 정수형, 실수형, 문자형 심지어 문자열도 들어가는데, 이는 어떻게 구현된 것인가요?"

 

 

 

1. 오버로딩(Overloading)

 

필자가 매서드에 들어온 정수형 인자를 화면에 출력하는 매서드를 별도로 만든다고 가정해보자. 아마 아래와 같은 형태가 될 것이다.

 

 

코드를 보면, print_test 매서드는 인자로 반드시 정수형 타입을 받도록 정의되어 있다. 따라서 123456789라는 숫자는 정상적으로 출력된다. 하지만 저 인자값을 실수로 바꾸면 입력값의 데이터 타입의 불일치로 인해 에러가 발생한다.

 

 

에러 내용 중 arguments는 parameter(인자)와 동일한 의미다

 

입력값이 정수형인 print_test 매서드만 존재하기 때문에 벌어지는 일이므로, 실수형 인자를 받아 동일한 역할을 수행하는 print_test 매서드를 하나 더 생성하면 이 문제는 해결될 듯 하다. 한 번 진행해보자.

 

 

다른 타입형도 동일한 매서드 명으로, 인자로 사용되는 데이터 타입만 별도로 지정해주면 하나의 매서드로 여러 데이터 타입을 다룰 수 있게 된다.

 

 

 

동일한 매서드 명을 가지나, 입력값 인자의 타입형을 다르게 정의하는 방법을 매서드 오버로딩(Overloading)이라고 한다. Overload라는 단어에서 의미인 "과적"에서 알 수 있듯이 하나의 매서드에서 사용하는 인자를 다양하게 사용할 수 있도록 만드는 것이라 보면 된다. 실제, System.out.println() 매서드는 오버로딩을 통해 정의되어 있다. 

 

인자의 각 타입별로 println이 정의되어 있다. Java Documentation 문서에서 직접 확인해보자.

 

 

심지어 인자가 없는 경우도 println()이 정의되어 있다. 이 결과는 단순히 한 줄 Enter(\n)를 수행하는 것이다. 

 

오버로딩을 알면, 매서드의 관리가 쉬워진다. 만약 입력 인자가 다르더라도 동일한 매서드 명으로 매서드 생성이 불가능한 상황을 상상해보자. 

 

 

위의 예시는 각 인자의 타입에 따라 매서드 명의 접미사에 인자 타입이 붙어 있도록 코드를 작성한 것이다. 모든 매서드가 동일하게 인자를 println()으로 출력하는 역할을 하지만, 매서드 명이 제각각이기 때문에, 새로운 타입이 추가되면 관리해야 할 매서드의 수가 점점 늘어날 수 밖에 없다. 지금이야 단지 7~8개의 매서드만 존재하기 때문에 큰 문제가 되지 않지만, 실제 프로그램에서는 매서드의 수가 몇 십 배는 늘어나기 때문에 매서드 관리가 어려워진다. 오버로딩은, 서로 다른 인자를 입력값으로 받아도 동일한 매서드명으로 동일한 동작을 하도록 만들기 때문에 추후 코드의 수정 및 유지보수가 간편해진다.

 

매서드를 오버로딩 하기 위해서는 조건이 몇 가지 있다.

 

-  오버로딩 매서드는 동일한 이름을 갖는다.

-  인자로 사용하는 데이터 타입 또는 인자의 갯수는 오버로딩 매서드마다 달라야 한다.

 

 

 

2. 가변인자 매서드

 

이번에는 여러 숫자를 입력받아 입력받은 수의 합을 반환하는 코드를 만들어보려 한다. 인자는 2개 이상이 될 수 있으므로, 지금까지의 내용을 바탕으로 코드를 작성하면 아래와 같은 결과가 나타난다.

 

 

그런데 필자가 5개 이상의 숫자 합을 반환받으려면 지금까지 정의한 sum() 매서드로는 사용이 불가하다. 필자가 정의한 sum()  매서드는 어떠한 것도 5개 이상의 정수를 받아 연산하는 것이 정의되어 있지 않기 때문이다. 그런다고 모든 경우에 대해 일일이 매서드를 작성하는 것도 비효율적이다.

 

인자의 수가 정해져있지 않은 매서드는 가변인자 매서드라고 하는데, 이 매서드는 인자를 배열 형태로 받는다. 코드로 작성하면 아래와 같다.

 

 

 

이 sum() 매서드는 인자로 배열을 받기 때문에 입력값 역시 배열 형태로 넣어주어야 한다. 

 

 

 

조금 뜬근없지만, Java에서 코드 작성 시 사용했던 public static void main(String [] args) 부분을 보자. 이 main 매서드는 컴파일 완료 후 실행 시, 가장 먼저 실행되는 Java 매서드다. 이 main 매서드는 입력인자로 String 타입의 배열을 args로 받는 것으로 정의되어 있다.

 

 

 

main 매서드의 입력 인자 시, java 명령어 뒤에 추가되는 문자열을 args로 편입시키는데, 일반적인 가변인자 매서드와 동작 방식이 조금 다르다. 참고로 문자열 대신 숫자나 문자열 등을 args 값으로 지정한다고 해도, main 함수 실행 시 입력된 agrs 원소값은 모두 String 형태로 저장/출력된다. 

 

 

 

이번에는 다른 예시로, 덧셈과 곱셈 계산 기능을 하는 매서드를 배열 인자로 만들어보려 한다.

 

 

배열 내 원소값으로 합 또는 곱을 구하는 아주 단순한(?) 매서드다. 이 매서드를 조금 수정해서, 기호와 입력받는 정수를 모두 String형 배열로 재정의하고 이들의 합과 곱을 수식으로 표시하는 매서드도 만들 수 있다.

 

 

잘 보면 calculator라는 이름의 매서드가 하나는 char, int배열을 인자로 받아 int형을 반환하는 형태를 띄고 있고, 다른 하나는 String, String 배열을 인자로 받아 String형을 반환하는 형태를 띈다. 두 매서드 역시 서로 다른 입력 인자 데이터 타입을 가지므로 오버로딩 관계가 성립한다.  

 

 

 


 

 

 

다음 포스팅에서는 Class의 생성자와 클래스 초기화에 대한 내용에 대해 살펴보려 한다. 참고로 생성자에 대해 이해하기 위해서는 이번 포스팅의 오버로딩에 대한 이해가 필수이므로, 다음 포스팅 참고 전에 오버로딩 코드를 연습하면서 많은 에러에 노출되어 볼 것을 권고한다.

 

 

 

 

Fin

반응형

댓글