JAVA/JAVA 기본정리

오버로딩 (overloading) / 가변인자(varargs) : 매개변수 개수를 동적으로 사용할 수 있는 기능

hyun-1200 2022. 4. 25. 22:10

오버로딩? 한 클래스 안에 같은 이름의 메서드 여러개 정의하는 것. 

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

 

void println()
void println(boolean x)
void println(char x)

오버로딩이 성립하기 위한 조건

1. 메서드 이름이 같아야 한다.
2. 매개변수 개수 또는 타입이 달라야 한다.
3. 반환 타입은 영향이 없다.  

 

  • 오버로딩이 아닌 경우 
//매개 변수의 타입과 개수가 일치하기 때문에, 리턴타입은 상관없으므로 오버로딩으로 간주되지 않는다.
int add(int a, int b) { return a+b;}
long add(int a, int b) {return a+b;}

 

  • 오버로딩인 경우
// 매개변수의 순서가 다르므로 오버로딩으로 간주한다.

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

 


오버로딩의 장점

 

1. 하나의 이름으로 정의되므로, 메서드 이름만 보고 같은 기능을 하는 것으로 쉽게 예측할 수 있다.

2. 메서드이 이름을 절약할 수 있다. 메서드의 이름을 짓는게 고민을 덜 수 있는 동시에 사용되었어야 할 메서드의 이름을 다른 메서드의 이름으로 사용할 수 있다. 


가변인자 (varargs)

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

가변 인자는 '타입... 변수명' 과 같은 형식으로 선언한다.

이 때, 매개변수가 여러개 인 경우 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다.

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

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}); //배열도 가능

 

가변인자 대신 매개변수의 타입을 배열로 하면 되는거 아닌가?

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

String result= concatenate(new String[0]); //인자를 배열로 지정
String result2= concatenate(null); // 인자로 null을 지정
String result3= concatenate(); // 에러. 인자가 필요

-> 매개변수의 타입을 배열로 하면, 반드시 인자를 지정해줘야 하기 때문에, 배열로 하면 인자를 생략할 수 없다. 

 

가변인자를 오버로딩할 때 주의점 

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

가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.