* JAVA - 오버로딩

jodbsgh·2022년 3월 17일
0

💡"JAVA"

목록 보기
15/67

오버로딩이란?

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩'이라고 한다.

오버로딩의 조건

같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.
오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  • 위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생.
  • 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

오버로딩의 장점

  • 여러 메서드들이 하나의 이름으로 정의될 수있다면, 하나의 메서드 이름만 기억하면 되므로 기억하기 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 많이 줄일 수 있다.
  • 메서드의 이름만 보고도 '이 메서드들은 이름이 같으니, 똑같은 기능을 하겠구나' 라고 예측할 수 있다.
  • 메서드의 이름을 절약할 수 있다.
    하나의 이름으로 여러개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있다.

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

가변인자는 '타입... 변수명'과 같은 형식으로 선언하며, PrintStreadm클래스의 printf()가 대표적인 예다.

public PrintStream printf(String format, Object... args)
{
...
}

위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 그렇지 않으면, 컴파일 에러가 발생한다. 가변인지 아닌지를 구별할 방법이 없기 떄문에 허용하지 않는 것이다.

//컴파일 에러 발생 - 가변인자는 항상 마지막 매개변수여야 한다.
public PrintStream printf(Object... args, String format)
{
...
}

만일 여러 문자열을 하나로 결합하여 반환하는 concatenate메서드를 작성한다면, 아래와같이 매개변수의 개수를 다르게 해서 여러 개의 메서드를 작성해야할 것이다.

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

이럴 때, 가변인자를 사용하면 메서드 하나로 간단하게 대체할 수 있다.

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

System.out.println(concatenate(new String[] {"A", "B"}));
//배열도 가능
  • 가변인자는 배열을 이용하는 것이다. 그래서 가변인자가 선언된 메서드를 호출할 때 마다 배열이 새로 생성된다. 이처럼 비효율이 숨어있으므로 꼭 필요한 경우에만 가변인자를 사용해야 된다.
  • 가변인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 구별되지 못하는 경우가 발생하기 쉽다.
    따라서, 가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글