Search

오버로딩

오버로딩(Overloading)

한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것

오버로딩의 조건

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

오버로딩의 예

println() : 같은 println 메소드로 보일지라도, 실제 매개변수로 지정하는 값의 타입에 따라 호출되는 println 메소드는 달라짐.
void println() void println(boolean x) void println(char x) void println(char[] x) void println(double x) void println(float x) void println(int x) void println(long x) void println(Object x) void println(String x)
Java
// 같은 메소드의 경우 : 매개변수의 이름만 다르고 타입이 같을 때 int add (int a, int b) { return a+b; } int add (int x, int y) { return x+y; } // 같은 메소드의 경우 : 리턴타입만 다를 때 int add (int a, int b) { return a+b; } long add (int a, int b) { return (long) (a+b); } // 오버로딩이 성립하는 경우 : 매개 변수의 타입(순서)이 다른 경우 long add(int a, long b) { return a+b; } long add(long a, int b) { return a+b; } // 오버로딩이 성립하는 경우 : 매개 변수의 타입이 완전 다른 경우 int add(int a, int b) { return a+b; } long add(long a, long b) { return a+b; } long add(int[] a) { long result = 0; for (int i=0; i < a.length; i++) { result += a[i]; } return result; }
Java

오버로딩의 장점

메소드 네이밍에 있어서 수고로움이 없다.
println()과 같이 단순 출력 메소드인데 매개변수 타입에 따라 전부 이름을 달리 지어야 한다 생각하면 끔찍..
간단한 이름은 기능 파악, 효율면 등에서 장점이 크다!
OverloadingTest.java

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

가변 인자(Variable Arguments) : 매개 변수의 개수를 동적으로 지정가능한 기능
타입... 변수명 형식으로 선언
가변 인자 외에 매개 변수가 더 있다면, 가변 인자를 제일 마지막으로 선언
public PrintStream printf(String format, Object... args) { ... }
Java
여러 문자열을 하나로 반환하는 concatenate 메소드에 가변 인자를 사용
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"})); // 배열도 가능
Java
내부적으로 배열을 사용하기 때문에 동적인 인자 개수 설정이 가능한 것 → 비효율적이긴 한 거라 꼭 필요한 곳에서만 사용
매개 변수를 배열로 지정할 때와 차이점?인자를 꼭 지정해줄 필요가 없다!
VarArgsEx.java

참고 자료