JAVA

[JAVA] 오버로딩(overloading)

큐범 2021. 8. 11. 17:24

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야한다. 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading) 또는 오버로딩(overloading)

오버로딩의 조건

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

반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

오버로딩의 장점

package object_oriented_programming;

public class OverloadingTest {

	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(3L, 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("long add(int a, long b) - ");
		return a+b;
	}
	long add(long a, int b) {
		System.out.print("long add(long a, int b) - ");
		return a+b;
	}
	long add(long a, long b) {
		System.out.print("long add(long a, long b) - ");
		return a+b;
	}
	
	int add(int[] a) {
		System.out.print("int 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
long add(long a, int b) - mm.add(3L, 3) 결과 : 6
long add(int a, long b) - mm.add(3, 3L) 결과 : 6
long add(long a, long b) - mm.add(3L, 3L) 결과 : 6
int add(int[] a) - mm.add(a) 결과 : 600

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

가변인자 : 타입... 변수명

package object_oriented_programming;

public class VarArgsEx {

	public static void main(String[] args) {
		String[] strArr = {"100","200","300"};
		
		System.out.println(concatenate("","100","200","300"));
		System.out.println(concatenate("-",strArr));
		System.out.println(concatenate(",",new String[] {"1","2","3"}));
		System.out.println("["+concatenate(",",new String[0]+"]"));
		System.out.println("["+concatenate(",")+"]");
	}
	
	static String concatenate(String delim, String ... args) {
		String result = "";
		
		for(String str : args) {
			result+=str+delim;
		}
		
		return result;
	}
}
//결과
100200300
100-200-300-
1,2,3,
[[Ljava.lang.String;@1877ab81],
[]

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

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

 

출처 : JAVA의 정석 - (남궁성지음)