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,
[ ]