오버로딩(overloading)이란?
자바를 처음 공부하던 시절 오버로딩, 오버라이드를 볼때마다 저그 오버로드가 생각났었다.😊
그럼 대체 자바에서 오버로딩이란 뭘까!
메서드도 변수와 마찬가지로 같은 클래스에서는 각각 다른이름으로 구별이 가능해야한다.
add라는 이름의 메서드가 2개면 이상하잖아요😑
그러나 자바에서는 add라는 이름의 메서드가 2개 이상이어도 매개변수의 개수나 타입이 다르면
같은 이름을 사용해서 메서드를 만들 수 있다.
이렇게 한 클래스에서 같은 이름의 메서드를 여러개 정의하는 것을 '메서드 오버로딩', 간단히 줄여 '오버로딩'
이라한다.👍
오버로딩의 조건
같은 이름의 메서드를 만든다고 무조건 오버로딩인 것은 아니고 몇가지 조건이 있다!
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
비록 메서드의 이름이 같다 해도 매개변수가 다르면 서로 구별될 수 있다.
위의 조건이 만족되지 않으면 메서드가 중복으로 만들어졌다고 보고 컴파일 에러가 발생한다.
오버로딩(overloading), 왜 써야 돼?
오버로딩을 사용해서 무순 이득이 있을까?
우리가 정말 자주 쓰는 println() 메서드를 보면 정말 모든 기본형 변수부터, 참조형 변수까지
어떤걸 넣어도 콘솔에 글씨를 찍어준다 이것은 저 모든 타입을 사용해 오버로딩된 메서드가
존재하기 때문이다
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(float x)
void println(float[] x)
···
void println(int[] x)
void println(String x)
그런데 만약 오버로딩이 없다?? 바로 난리가 난다. 저 많은 메서드들이 각자 다른 이름으로 만들어져야 한다.
그럼 만드는 사람도 머리가 아플것이고, 사용하는 사람도 int형 출력할때는.. 음.. 이거고 char 출력할때는.. 음..
이러면서 하나하나 기억해야된다는 말이다.🤷♂️
void println()
void printlnInt(int x)
void printlnBoolean(boolean x)
void printlnChar(char x)
···
벗! 우리는 근본적으로 같은 기능을 갖는 메서드를 오버로딩을 통해 하나의 이름으로 만들어줄수 있다.
가변인자(varargs)와 오버로딩
만약 매개변수의 수가 쓰임에 따라 달라지거나, 그 매개변수가 무한이 필요하다면?
매개변수 하나하나 오버로딩을 해야하는 걸까?
우리에게는 가변인자가 있기 때문에 매개변수의 개수를 꼭 고정적으로 지정해줄 필요는 없다🙌
가변인자는 '타입... 변수명'과 같은 식으로 선언하며, PrintStream클래스의 printf()가 대표적인 예이다.
public PrintStream printf(String format, Object... args) {···}
위와 같이 가변인자외에도 매개변수가 있다면 가변인자는 가장 마지막에 선언해야 한다.
컴파일 에러가 나기 때문!
만약 여러개의 문자열을 하나로 합쳐 반환해주는 메서드가 필요하다 할 때 가변인자가 없다면?
String stringAdd(String s1, String s2) {···}
String stringAdd(String s1, String s2, String s3) {···}
String stringAdd(String s1, String s2, String s3, String s4) {···}
이렇게 여러번 오버로딩 해야함을 물론이고 4개 이상의 문자열을 합치려면 더 많은 오버로딩을 해야한다.
하지만 가변인자를 사용한다면 아래와 같이 한줄로 작성이 가능하다
String stringAdd(String... s1) {···}
이 메서드를 호출할 때는 인자의 개수를 마음대로 할 수 있음은 물론이고 인자가 없어도 되고
타입만 같다면 배열도 인자로 사용 가능하다👌
가변인자 인정한다 솔직히 가변인자를 써본적도 공부한적도 처음인것 같다
사실 엄청 편한것 같지만 컬렉션객체를 넘길때도 괜찮을지는 나중에 해봐야겠다.
List<String>을 넘길수는 없으니.. 다른 사용방법이 있을까?🌌
댓글