ksouth9

객체지향언어(5) - 오버로딩(overloading) 본문

Java

객체지향언어(5) - 오버로딩(overloading)

ksouth9 2022. 3. 4. 01:16

오버로딩(overloading)


한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

 

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다.

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

오버로딩 조건


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

오버로딩 예시


오버로딩 예시로 가장 대표적인 것은 println메서드이다. println메서드에 괄호 안에 값만 지정해주면 화면에 출력하는데 아무런 어려움이 없었다. 하지만, 실제로는 println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.

printstream클래스에는 어떤 종류의 매개변수를 지정해도 출력할 수 있도록 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);

println메서드를 호출할 때 매개변수로 넘겨주는 값의 타입에 따라서 위의 오버로딩된 메서드들 중 하나가 선택되어 실행된다.

 

예시1(매개변수의 이름이 다른 경우)

int add(int a,int b) {return a+b;}
int add(int x,int y) {return x+y;}
  • 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에 오버로딩이 성립하지 않는다.
  • 매개변수의 이름이 다르면 메서드 내에서 사용되는 변수의 이름이 달라질 뿐, 아무런 의미가 없다.

예시2(리턴타입만 다른 경우)

int add(int a, int b) {return a+b;}
long add(int a,int b) {return (long)(a+b);}
  • 매개변수의 타입과 개수가 일치하기 때문에 어떤 메서드가 호출될 것인지 결정할 수 없기 때문에 오버로딩으로 간주되지 않는다.

예시3(매개변수 순서가 다른 경우)

long add(int a,long b) {return a+b;}
long add(long a,int b) {return a+b;}
  • 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 오버로딩으로 간주한다.

오버로딩 장점


  • 여러 메서드들이 하나의 이름으로 정의될 수 있다.
  • 메서드의 이름을 짓기 편리하고 쉽게 기억하고 예측할 수 있어 오류의 가능성을 줄일 수 있다.
  • 메서드의 이름을 절약할 수 있다.

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


메서드의 매개변수 개수를 동적으로 지정해 줄 수 있는 기능을 '가변인자'라고 한다.

 

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

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

위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 

그렇지 않으면, 컴파일 에러가 발생한다. 가변인자인지 아닌지를 구별할 방법이 없기 때문에 허용하지 않는다.

 

 

'Java' 카테고리의 다른 글

객체지향언어(7) - 상속  (0) 2022.03.05
객체지향언어(6) - 생성자  (0) 2022.03.04
객체지향언어(4) - 메서드(4)  (0) 2022.03.04
객체지향언어(4) - 메서드(3)  (0) 2022.03.03
객체지향언어(4) - 메서드(2)  (0) 2022.03.03