반응형

오버로딩 (overloading)

  • 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것

 

오버로딩이란, 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것이다.

원래는, 메서드 : 메서드 이름 = 1 : 1 이어야하는데, 
오버로딩은 메서드 : 메서드 이름 = n : 1 이다.

오버로딩의 의미는, "과적하다"라는 뜻이다.
원래는 하나의 메서드 이름에 하나의 메서드가 매칭되야하는데,
하나의 메서드 이름에 메서드 여러개를 정의하니까 과적하다고 하는 것이다.

오버로딩의 대표적인 예

println은 대표적인 오버로딩의 예이다.
메서드이름은 println으로 모두 같지만, 매개변수가 전부 다르다.

예를 들어서 우리가 println을 사용할 때 , println(123);이라고 쓰면 123이 출력되는데,
우리가 사용할 때, 위의 것들 중에서 어떤 것인지 신경쓰지 않고 매개변수를 넣었다.

우리가 println(123);이라고 하면, 자연적으로 위의 메서드들 중에서 void println(int x)가 선택되는 것이다.
컴퓨터는 매개변수가 뭐가 들어왔는지 보고서 어떤 메서드를 사용할 지 결정하는 것이다.

만약에 println("ABC");ㄹ고 하면,  void println(String x)가 호출 될 것이다. 
컴파일러가 매개변수가 어떤 타입인지 확인해서 범위에 맞는 메서드로 연결해주는 것이다.

Java에서는 오버로딩을 지원하기 때문에,
메서드 이름 한개로 여러가지 일들을 할 수 있는 것이다.

만약에 오버로딩이 지원되지 않는다면, 
메서드별로 이름이 전부 달라야 할 것이다.
printlnStr("ABC"), printlnInt(123); 등 처럼 말이다.

이렇게 되면, 오타치기도 쉽고, 외우기도 쉽지 않을 것이다. 

그래서 오버로딩을 지원하는 것이 상당한 장점이다. 

 


 

오버로딩이 성립하기 위한 조건 (3가지)

1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 반환 타입은 영향없다.

 

예시를 통해 살펴보자.

[오버로딩이 아닌 예]

첫번쨰 예시는 메서드 2개가 이름이 같다. 그리고 매개변수 갯수도  2개로 동일하다. 매개변수의 타입도 같다.
변수 이름만 다른데, 이런 경우에는 오버로딩이 아니다.

위의 3가지 조건중에 1번조건만 일치하고 나머지 조건은 일치 하지 않기 때문에 오버로딩이 아니다.

이것은 같은 메서드를 2번 정의한 "메서드 중복정의"이다.

첫번째 메서드를 정의할 떄는 상관없지만, 두번쨰 메서드로 중복정의가 되면, 에러가 발생한다.

 

[오버로딩이 아닌 예]

이번 예시는, 우선 메서드의 이름이 같다. 1번조건 OK, 
매개변수의 개수나 타입이 모두 일치한다. 2번조건은 NO,
반환타입만 다른데, 반환타입은 영향이 없다. 

이것도 중복정의이다.

결국 3가지 조건을 전부 만족하지는 않기 때문에 오버로딩이 아니다.

 

[오버로딩의 예시]

이번 예시를 보자.
메서드 이름이 같다. 1번조건 OK,
매개변수의 개수는 2개로 같지만, 타입이 다르다. 2번조건 OK,
3번은 반환타입은 영향이 없으므로 OK

따라서 이번 예시는 오버로딩의 3가지 조건을 모두 만족하기 때문에 오버로딩이 성립한다.

그런데, 여기서 주의할 점이 있다.

만약에 이 예시에서,
add(3,3);을 호출하면, 첫번째 메서드와 두번째 메서드 중에 어떤게 호출될까?

이경우에는, 컴퓨터가 판단할 수 없다. 둘다가능하기 때문이다. 
만약에 add(3, 3L);이렇게 호출하면, 첫번째 것이 호출 될 것이다.

근데 이것을 add(3, 3);이렇게 호출하면, 첫번째 메서드와 두번째 메서드 모두 가능하기 때문에,
컴파일러가 둘중에 어느것을 사용해야하는지를 알 수 가 없다.
그래서 이것 또한 에러가 난다.

이것을 ambiguious라고 한다. (모호하다, 애매하다.)

이점을 주의하도록 하자.

 


 

(메서드) 오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능 수행

[Ex6_10]

오버로딩의 올바른 예이다.
매서드 3개가 add로 이름이 같다.
매개변수는 개수는 같지만, 타입이 다르다.

보통, 메서드 이름은 add, println, round, random 등 모두 동사이다.
왜냐하면 어떠한 작업을 수행하는게 메서드이기 때문이다. 그래서 메서드 이름은 대부분 동사이다. (이름이 꼭 동사일 필요는 없다.)

이름이 같다는 이야기는, "하는 작업이 같다"라는 뜻이 된다.
매개 변수 타입은 다르지만, 의미상으로 같은 작업을 수행하는 경우에 오버로딩을 하는 거이다.

세번째 메서드 처럼 메서드 이름이 add고, 안에 배열을 주면, 사용자는 어떻게 생각할까?
"여기 매개변수에 배열을 주면, 배열안의 모든 값을 더해서 주는구나" 라고 예측할 수 있다. 이런 경우이 오버로딩(메서드 오버로딩)을 한다.

 

오버로딩의 종류에는 메서드 오버로딩과 연산자 오버로딩이 있는데,
연산자 오버로딩의 예시는 +기호가 부호의기능, 덧셈의 기능, 문자열 결하브이 기능 등을 하는것이 연산자 오버로딩의 예이다.
자바에서는 이렇게 연산자 오버로딩을 제공하지만, 따로 구현할 수는 없게 되어있다.

자바에서는 메서드 오버로딩밖에 없기 때문에, 짧게 쭐여서 "오버로딩"이라고 칭하는 것이다. 이런이야기는 참고만 하자.

 

 

반응형

'JAVA' 카테고리의 다른 글

생성자 this(), 참조변수 this  (0) 2022.03.29
생성자, 기본 생성자  (0) 2022.03.29
static메서드와 인스턴스 메서드  (0) 2022.03.28
참조형 매개변수, 참조형 반환타입  (0) 2022.03.27
기본형매개변수  (0) 2022.03.26