티스토리 뷰

반응형

# 오버로딩(overloading)

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다.

그러나 자바에서는 한 클래스 내에서 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라고 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 

 

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 '오버로딩(overloading)'이라 한다.  또한 오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다. 

 

오버로딩의 조건

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

② 매개변수의 개수 또는 타입이 달라야 한다.  → 메서드 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있다. 

③ 반환 타입은 관계없다. 

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

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

 

오버로딩 예시

예시 1)  매개변수의 이름이 다르고 타입이 같은 경우

int add{int a, int b) {return a+b;}
int add{int x, int y) {return x+y;}

- 오버로딩 조건에 성립하기 위해서는 매개변수 개수 또는 타입이 달라야 하는데 위의 예시는 그 조건이 성립하지 않는다.

 

예시 2)  리턴타입만 다은 경우

int add(int a, int b) {return a+b;}
long add(int a, int b) {return (long)(a+b);}

- 매개변수의 타입과 개수가 일치하기 때문에 add(3,3)으로 호출 시 어떤 메서드가 호출된 것인지 결정할 수 없다. 

  따라서 오버로딩에 간주되지 않는다. 

 

예시 1과 예시 2를 컴파일하면, 'add(int, int) is already definded(=이미 같은 메서드가 정의되어있다)'라는 컴파일 오류가 발생할 것이다.

 

예시 3) 매개변수의 순서가 다른 경우 

long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}

- 매개변수 타입이 같고 그 타입의 순서가 다른 경우, 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있다. 

  따라서 중복된 메서드가 아닌, 오버로딩으로 간주한다.  

- 메서드 호출 시 add(3, 3L)로 하면 첫 번째 메서드가 호출되고, add(3L, 3)로 하면 두 번째 메서드가 호출된다.  

이렇게 오버 로딩할 경우 단점이 있는데 만약 메서드를 add(3,3)으로 호출하는 경우에는 두 메서드 중에서 어느 메서드가 호출된 것인지 알 수 없기 때문에 컴파일 에러가 발생한다. 

 

예제) 오버로딩(overloadint) 예제

public class Ex6_10 {

	public static void main(String[] args) {

		MyMath3 mm = new MyMath3();
		
		System.out.println("mm.add(3,3) 결과 : " + mm.add(3, 3));
		System.out.println("mm.add(3L,3) 결과 : " + mm.add(3L, 3));
		System.out.println("mm.add(3,3L) 결과 : " + mm.add(3, 3L));
		System.out.println("mm.add(3,3L) 결과 : " + mm.add(3L, 3L));
		
		int[] a = {100, 200, 300};
		System.out.println("mm.add(a) 결과 : " + mm.add(a)); 
	}

}

class MyMath3 {
	int add(int a, int b) {
		System.out.print("int add(int a, int b) - ");
		return a + b;
	}

	long add(int a, long b) {
		System.out.print("int add(int a, long b) - ");
		return a + b;
	}

	long add(long a, int b) {
		System.out.print("int add(long a, int b) - ");
		return a + b;
	}

	long add(long a, long b) {
		System.out.print("int add(long a, long b) - ");
		return a + b;
	}

	int add(int[] a) {
		System.out.print("inr add(int[] a) - ");
		int result = 0;
		for (int i = 0; i < a.length; i++)
			result += a[i];
		return result;
	}
}

* 출력 결과

int add(int a, int b) - mm.add(3,3) 결과 : 6
int add(long a, int b) - mm.add(3L,3) 결과 : 6
int add(int a, long b) - mm.add(3,3L) 결과 : 6
int add(long a, long b) - mm.add(3,3L) 결과 : 6
inr add(int[] a) - mm.add(a) 결과 : 600

 

출력 결과를 보면 add메서드가 먼저 출력된 후에 println메서드가 출력된 것을 알 수 있다.

'System.out.println("mm.add(3,3) 결과 : " + mm.add(3, 3));' 이 부분을 두 문장으로 분해해보면 진행과정을 알 수 있다. 

int result = mm.add(3,3); 
 System.out.println("mm.add(3,3) 결과 : " + result);

먼저 add메서드를 호출한 값을 'result'변수에 담은 후 그 값이 println 메서드 괄호() 안에 있는 'result' 변수에 저장된 후 

pringtln 메서드가 호출되어 출력 결과와 같은 결과 값이 출력된다. 

반응형