본문 바로가기
✏️Java 공부/Java의 정석

[Java 공부/Java의 정석] Chapter.06 : 객체지향 프로그래밍 1 - 4 (오버로딩)

by 코코의 주인 2022. 7. 1.

오버로딩이란

 메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다. 그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라고 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.

 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 '오버로딩'이라고 한다.


오버로딩의 조건

오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.

1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.

메서드의 이름이 같더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능한 것이다. 위 조건들을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다.


오버로딩의 예

몇 가지 예를 통해 오버로딩에 대해 자세히 알아보자.

int sum(int a, int b)
int sum(int x, int y)

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

 

int sum(int a, int b)
long sum(int a, int b)

 이번 경우는 리턴 타입은 다르지만 매개변수의 타입이 같이 때문에 sum(1,4)와 같이 호출되었을 때 어떤 메서드가 호출된 것인지 결정할 수 없다. 때문에 오버로딩이 성립하지 않고, 컴파일 오류가 발생한다.

 

long sum(int a, long b)
long sum(long a, int b)

 두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가 다르다 이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 중복된 메서드 정의가 아닌, 오버로딩으로 간주한다.

 하지만 단지 매개변수의 순서만을 다르게 하여 오버로딩을 구현했을 경우 주의해야할 점이 있다. 위의 경우 sum(3,3L)과 같이 호출하면 첫 번째 메서드가, sum(3L,3)과 같이 호출하면 두 번째 메서드가 호출된다. sum(3,3)과 같이 호출하면 어떤 메서드를 호출한 것인지 알 수 없기 때문에 컴파일 오류가 발생한다.

 

int sum(int a, int b)
long sum(long a, long b)
long sum(int[] a)

위 메서드들은 모두 각기 다른 매개변수를 받아서 셈을 하는 역할을 한다.

이 경우 바르게 오버로딩이 되었다고 할 수 있다.


오버로딩의 장점

1. 같은 기능을 하는 메서드를 하나의 이름으로 묶어서 쉽게 기억할 수 있다.

 - 만약 메서드 별로 이름을 모두 다르게 설정해야 했다면 합을 구하는 함수를 sumInt(), sumFloat() 등 모두 다르게 지어야 했을 것이다. 하지만 오버로딩을 사용하면 sum이라는 하나의 이름으로 정의하여 기억할 수 있기 때문에 기억하기 쉽다.

 

2. 메서드의 이름을 절약할 수 있다.

- 개인적인 경험으로 변수 또는 메서드의 이름을 결정하는 것이 생각보다 신경이 많이 쓰인다. 하지만 오버로딩을 사용하면 메서드의 이름을 짓는데 고민을 덜 수 있을 뿐만 아니라 동시에 사용되었어야 할 메서드의 이름을 다른 메서드의 이름으로 사용할 수 있다.


가변인자

 가변인자를 사용하면 메서드의 매개변수 개수를 동적으로 지정해줄 수 있다.

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

 

예시

String concatenate(String s1, String s2)
String concatenate(String s1, String s2, String s3)
String concatenate(String s1, String s2, String s3, String s4)

만약 가변인자를 사용하지 않는다면 여러 문자열을 하나로 결합하는 concatenate 메서드를 작성한다고 했을 때, 아래와 같이 매개변수의 개수를 다르게 해서 여러 개의 메서드를 작성해야할 것이다.

String concatenate(String ... str)

하지만 가변인자를 사용하면 메서드 하나로 간단하게 대체할 수 있다.


총평

이번 글에서는 오버로딩에 대해 알아봤다.

지금까지 코딩을 하면서 오버로딩에 대해 신경을 써 본 적은 없는 거 같다.

과거에 내가 짠 코드들을 생각해보니 오버로딩을 적용했으면 코드가 좀 더 예뻐졌을 거 같다는 생각이 든다.

앞으로 적극적으로 오버로딩을 사용해봐야 겠다.

댓글