Java

[Java] 오버로딩

gorusair 2022. 1. 18. 23:42

오버로딩이란?

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

 

오버로딩의 조건

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

 

오버로딩의 예

[보기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)}

매개변수의 타입과 개수가 일치하기 떄문에 호출 시 어떤 메서드가 호출 된 것인지 결정할 수 없기 떄문에 오버로딩이 되지 않는다.

 

[보기3]
long add(int a, long b) {return a+b;}
long add(int a,   int b)    {return a+b;}

이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 중복된 메서드 정의가 아닌, 오버로딩으로 간주한다.

 

오버로딩의 장점

오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의 될 수있다 . 이렇게 되면 오류의 가능성을 줄일 수 있고,

메서드의 이름을 통해 기능을 쉽게 유추가 가능하다. 

또 다른 장점은 메서드의 이름을 절약할 수 있다는것이다.

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

 

가변인자와 오버로딩

 

기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄수 있게 되었으며, 이 기능을 '가변인자'라고 한다.

 

public PrintStream printf(String format, Object... args){...}

 

위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 그렇지 않으면 컴피알 에러가 발생한다.

 

String concatenate(String s1, String s2){...}
String concatenate(String s1, String s2,String s3){...}
String concatenate(String s1, String s2,String s3, String s4){...}

// 이럴 떄 가변인자를 사용하면 메서드 하나로 간단히 대체할 수 있다.

String concatenate(String.. str){...}

// 이 메서드를 호출할 떄는 아래와 같이 인자의 개수를 가변적으로 할 수 있다. 심지어는 인자가
// 아예 없어도 되고 배열도 인자가 될 수 없다.

System.out.println(concatenate());            //인자가 없음
System.out.println(concatenate("a"));         //인자가 하나
System.out.println(concatenate("a","b"));     //인자가 둘
System.out.println(concatenate(new String[]{"A", "B"));  //배열도 가능
public class VarArgEx {
	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,
[ ]