Overloading이란?
: 하나의 클래스 안에서 같은 이름의 메소드를 여러개 정의하는 것을 말한다.
오버로딩을 위한 조건 :
- 매개변수 갯수가 다르거나
- 갯수가 같다면 매개변수 타입이 다르거나
- 타입과 갯수가 같다면 매개변수 순서가 달라야한다.
위 조건에 부합하면 메소드의 이름이 같아도 다른 메소드로 본다.
단, 반환타입과는 전혀 관계가 없다.
원래는 하나의 클래스안에서 메소드를 중복정의해서 사용할 수 없지만 오버로딩을 통해서 가능한 것이다.
예제를 보면서 알아보자
▲ 위 두 메소드는 메소드명이 같다. 또한 매개변수의 갯수와 타입 그리고 순서가 모두 같기 때문에 오버로딩이아닌 그저 같은 메소드인 것이다. 각각 반환타입이 int형과 String형이고 return하는 값도 다르지만 이러한 조건은 오버로딩과는 아무 관련이 없다.
오버로딩의 개념은 요리에 비유할 수 있겠다.
메소드는 요리, 매개변수는 양념이라고 생각하면 쉽다. 우리가 같은 이름의 메소드 즉, 똑같은 음식 종류인 김치찌개 두개를 하려고하는데 들어가는 양념이 다르게 들어가거나 순서가 다르게 들어가면 다른 맛을 가진 다른 종류의 김치찌개가 될 것이다. 즉, 양념에 해당하는 매개변수의 종류나 갯수, 넣는 순서가 다르면 다른 종류의 음식 즉, 다른 메소드로 처리하게 된다는 것이다.
1)
▲ 메소드의 이름과 매개변수의 갯수는 같지만 매개변수의 타입이 다르다. 오버로딩이다. 즉 모두 다른메소드이다.
2)
▲ 메소드의 이름과 매개변수의 타입은 같지만, 매개변수의 갯수가 다 다르다. 즉 오버로딩, 모두 다른메소드이다.
3)
▲ 메소드의 이름이 동일하고 매개변수의 갯수도 동일하고, 각각의 메소드 모두 int형 1개, float형 1개, double형 1개를 가지고 있다. 하지만 매개변수의 순서가 다르므로 다른 메소드로 인식한다.
이것이 오버로딩의 개념이다.
하지만 여기도 불편함이 생긴다. 위 방식으로 하려면 매개변수의 갯수를 계속 늘리면서 메소드를 만들어야 하기 때문에 만들어지는 메소드가 무한정이 되어버리는 것이다.
이럴 때 사용할 수 있는 것이바로 VarArgs라는 기능이다.
VarArgs란?
: JDK5.0이상부터 메소드의 기능은 동일하고 매개변수의 타입이 동일한 하나의 자료형일 경우 매개변수 갯수에 따라서 매번 오버로딩하지 않고 하나의 메소드로 처리할 수 있는 기능이다.
VarArgs기능을 미사용 시 여러개 메소드를 오버로딩 해야한다. 미사용의 경우를 아래에서 보자.
▲ 누적합을 구하기 위한 메소드이다. 누적합을 할 인자들이 늘어나면 늘어날수록 끝없이 오버로딩해서 메소드를 생성해야 하는 것이다. 엄청 비효율적이다.
이럴 때 VarArgs를 사용하면 아래처럼 쓸 수있다.
▲ VarArgs를 사용하면 배열이 생성된다. 바로 매개변수명이 배열명이 되는 특징이 있다.
▲ 점 3개로써 수많은 매개변수들을 포함한 것이된다. 또한 매개변수명인 param이 배열명인 배열이 생성되며 각각의 매개변수로 받은 인자는 배열에 담기게 되며 매개변수의 갯수가 배열의 크기가 된다.
▲ 메인메소드에서 인자값과 갯수만 달리해서 메소드를 호출하면 하나의 메소드형식으로 무한이 많은 결과값을 출력할 수 있다.
▲ 각각의 배열은 모두 다른 배열인 것도 확인 할 수 있다.
'Java' 카테고리의 다른 글
[Java]this() - 자기 자신의 기본생성자 (0) | 2022.03.14 |
---|---|
[Java]생성자(Constructor) (0) | 2022.03.11 |
[Java]this (0) | 2022.03.11 |
[Java]캡슐화(Encapsulation) - 진짜 캡슐화 (0) | 2022.03.11 |
[Java]캡슐화(Encapsulation) - Getter와 Setter (0) | 2022.03.11 |