티스토리 뷰
1. 오버로딩이란 ?
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 간단히 '오버로딩'이라고 한다.
2. 오버로딩의 조건
같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.
오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야한다.
메서드 이름이 같아야 한다.
매개변수의 개수 또는 타입이 달라야 한다.
위의 조건을 만족하지 못한 메서드는 중복으로 컴파일 에러가 발생한다.
오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 아무런 영향을 주지 못한다.
간단히 말하면 이름은 같지만 매개변수가 다르면 된다.
3. 오버로딩의 예
오버로딩의 예로 가장 대표적인 것이 println메서드이다.
지금까지 아무런 생각없이 출력으로만 써왔다면, 이제 println가 오버로딩 되었다는 걸 인지할 수 있을 것이다.
실제로 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.
무슨말인지 모르는 분을 위해 코드로 예시를 들겠다.
System.out.println(1)
System.out.println("String")
int a=10, b=5;
int result = a+b;
System.out.println(result)
위의 코드를 보면 평소대로 출력한 것을 볼 수 있다.
하지만 저 값들은 println()메서드의 매개변수로, 어떤 종류의 매개변수를 지정해도 출력할 수 있도록 아래와 같이
10개의 오버로딩된 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)
결론은 1을 출력(매개변수로 넣음)하면 위의 오버로딩된 메서드들 중 매개변수를 int형으로 받는 메서드가 선택되어 실행되는 것이다.
4. 오버로딩의 장점
지금까지 오버로딩의 정의와 조건, 그리고 예시를 알아보았다. 그렇다면 오버로딩을 함으로써 얻는 이득은 무엇인지 생각해보자.
만일 메서드도 변수처럼 이름만으로 구별된다면, 한 클래스내의 모든 메서드들은 이름이 달라야한다. 한마디로 엄청나게 힘들어진다. 아까 들었던 println메서드들로 예시를 들겠다.
void println()
void printlnBoolean(boolean x)
void printlnChar(char x)
void printlnDouble(double x)
void printlnString(String x)
이렇게 메서드 이름이 변경된다면
모두 근본적으로는 같은 기능을 하지만, 서로 다른 이름을 가졌기 때문에 작성하는 쪽에서는 이름을 짓기도 어렵고
메서드를 사용하는 쪽에서는 이름을 일일이 기억해야하기 때문에 서로 부담이 된다.
하지만 오버로딩을 통해 여러 메서드들이 println이라는 하나의 이름으로 정의한다면 기억하기도 쉽고 이름도 짧아서 오류의 가능성을 많이 줄일 수 있다.
우리는 오버로딩의 편리함을 진작에 느끼고 있던 것이다.
5. 가변인자와 오버로딩
만일 개발하는 과정에서 여러 문자열을 하나로 결합하여 반환하는 메서드를 작성한다고 가정해보자. 그럼 아래와 같이 매개변수의 개수를 다르게 해서 여러개의 메서드를 작성해야할 것이다.
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}
여기서 의문이 들면 천재다. 만약 사용자가 concatenate메서드를 사용한다고 하면, 사용자가 몇 개의 매개변수를 넣을지 알 수 없기 때문에 매개변수를 하나씩 추가하는 메서드를 계속 만들어야하는 상황이 발생한다.
(예: 사용자가 50개의 문자열을 합하려고 한다. 그럼 50개의 매개변수를 받는 메서드(오버로딩)을 만들어야 한다.)
이럴 때, 가변인자를 사용하면 메서드 하나로 간단히 대체할 수 있다.
String concatencate(String... str) {...}
이렇게 작성하면 이 메서드를 호출할 때 인자의 개수를 가변적으로 할 수 있다. 심지어 인자가 아예 없어도 되고 배열도 인자가 될 수 있다. 하지만 이 장점을 뛰어넘는 엄청난 단점이 숨어있다.
가변인자는 내부적으로 배열을 이용하는 것이다. 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 생성되니까 엄청난 메모리 낭비가 발생한다. 이런 비효율이 숨어있으므로 꼭 필요한 경우에만 가변인자를 사용하자.
'Java' 카테고리의 다른 글
null 대신 Optional 클래스를 사용하자 (0) | 2022.07.06 |
---|---|
예외처리 개념과 예외처리를 할 때 출력만 하면 안되는 이유 (0) | 2022.05.01 |
추상클래스와 인터페이스 개념과 사용법 (0) | 2022.04.30 |
객체지향에서 중요한 개념인 다형성 (0) | 2022.04.30 |
객체지향을 처음 들어보는 분들을 위한 정리 (0) | 2022.04.13 |
- Total
- Today
- Yesterday