오버로딩이란?
- 오버로딩(overloading)의 사전적 의미는 '과적하다'. 즉, 많이 싣는 것을 뜻한다.
- 메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져아 한다.
- 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 '오버로딩(overloading)'이라고 한다.
- 보통 하나의 메서드 이름에 하나의 기능만을 구현해야하는데, 하나의 메서드 이름으로 여러 기능을 구현하기 때문에 붙여진 이름이라 생각할 수 있다.
오버로딩의 조건
- 같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.
- 비록 메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능한 것이다.
- 위 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다.
- 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
오버로딩의 예
- 오버로딩의 예로 가장 대표적인 것은 println 메서드이다.
- pirntln 메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.
- PrintStream 클래스에는 어떤 종류의 매개변술르 지정해도 출력할 수 있도록 10개의 오버로딩된 println 메서드를 정의하고 있다.
- println 메서드를 호출할 때 매개변수로 넘겨주는값의 타입에 따라서 위의 오버로딩된 메서드들 중의 하나가 선택되어 실행되는 것이다.
오버로딩의 장점
- 오버로딩을 통해 여러 메서드들이 하나의 공통된 이름으로 정의될 수 있다면, 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 많이 줄일 수 있다.
- 메서드의 이름만 보고도 '이 메서드들은 이름이 같으니, 같은 기능을 하겠구나'라고 쉽게 예측할 수 있게 된다.
- 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 절약할 수 있다.
가변인자(varargs)와 오버로딩
- 기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며, 이 기능을 '가변인자(variable arguments)'라고 한다.
- 가변인자는 '타입... 변수명'과 같은 형식으로 선언하며, PrintStream클래스의 printf()가 대표적인 예이다.
- 위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다.
그렇지 않으면, 컴파일 에러가 발생한다. 가변인자인지 아닌지 구별할 방법이 없기 때문에 허용하지 않는 것이다.
'Java > Basic' 카테고리의 다른 글
[Java] 오버라이딩(overriding) (0) | 2020.03.24 |
---|---|
[Java] 상속(inheritance) (0) | 2020.03.23 |
[Java] 생성자(Constructor) (0) | 2020.03.21 |
[Java] 클래스 메서드(satic메서드)와 인스턴스 메서드 (0) | 2020.03.20 |
[Java] 기본형 매개변수, 참조형 매개변수 + 참조형 반환타입 (0) | 2020.03.20 |