오버로딩? 한 클래스 안에 같은 이름의 메서드 여러개 정의하는 것.
- 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
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(); // 에러. 인자가 필요
-> 매개변수의 타입을 배열로 하면, 반드시 인자를 지정해줘야 하기 때문에, 배열로 하면 인자를 생략할 수 없다.
가변인자를 오버로딩할 때 주의점
가변인자를 선언한 메서드를 오버로딩하면 , 메서드를 호출했을 때 구별하지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다.
가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.
'JAVA > JAVA 기본정리' 카테고리의 다른 글
생성자에서 다른 생성자 호출하기/ 참조변수 this와 생성자 this() (0) | 2022.04.26 |
---|---|
생성자 ( Constructor) / 기본생성자/ 매개변수가 있는 생성자 (0) | 2022.04.25 |
클래스메서드(static 메서드) 와 인스턴스 메서드 / 클래스멤버와 인스턴스멤버간의 참조와 호출 (0) | 2022.04.25 |
클래스의 정의/ 변수와 메서드/ 클래스변수/ 인스턴스 변수/ 지역변수 (0) | 2022.03.01 |
객체지향 언어 OOP ( object oriented programming) (0) | 2022.03.01 |