오버로딩
오버로딩이란 메서드의 이름이 같지만 매개변수의 (개수, 타입)이 다른 경우를 말합니다.
즉, 같은 메서드 이름을 가지면서 매개변수의 타입 또는 개수가 다른 여러 개의 메서드를 정의할 수 있는 기능을 의미합니다.
이렇게 오버로딩된 메서드들은 컴파일러에 의해 메서드 호출 시 전달되는 인자의 타입 및 개수에 따라 적절한 메서드가 선택되어 실행됩니다.
이때, 로버로딩된 메서드들은 메서드 시그니처가 달라야 합니다.
메서드 시그니처란?
- 메소드 이름
- 파라미터 수
- 파라미터 타입의 순서
다음의 조건을 모두 만족하면 메서드의 signature가 같다고 할 수 있다.
Example
아래 두 메서드는 같은 signature라고 할 수 있다.
public MyClass {
public String myMethod(String s1, Integer i1) {
....
}
private String myMethod(String s2, Integer i2) {
....
}
}
비록 파라미터의 이름이 다르지만, 이는 메서드 시그니처의 조건에 포함되지 않는다.
중요한 점은 메소드 시그니처가 같은 메서드가 같은 클래스에 2개 이상 존재 할 수 없다는 것이다.
따라서 위 클래스는 컴파일에러가 발생한다.
=> 여기서 알아야 할 점은 반환형은 메서드 시그니처에 포함되지 않는다.
만약 반환형이 메서드 시그니처에 포함된다면 jvm이 판단기준이 어려워진다.
메서드 시그니처(이름, 파라미터 수, 타입의 순서)가 모두 같은 두 개의 메서드가 반환형이
1. Integer
2. Double 라고 가정한다면
System.out.println(myMethod());
라고 할 때, JVM은 어떤 메서드를 호출해야 할지 결정하지 못한다.
따라서 반환형은 메서드 시그니처에 포함되지 않는다.
=> 결론: 오버로딩할 때 반환타입은 같아야 한다.
Overload
// 1번
public static int getPower(int number){
int result = number * number;
return result;
}
// 2번
public static int getPower(String strNumber){
int number = Integer.parseInt(strNumber);
return number;
}
// 3번
public static int getPower(int number, int exponent){
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= number;
}
return result;
}
1,2,3은 각각 메서드의 시그니처가 다른 오버로딩된 3개의 메서드이다.
2번은 매개변수의 타입이 다르고
3번은 타입과 개수까지 다르다.
다시 한번,
말하면 메서드 오버로딩(overloading)이란 같은 이름의 메서드를 중복하여 정의하는 것이다.
public static void main(String[] args) {
// 메소드 오버로딩
// 같은 이름의 메소드를 여러 번 선언 가능
// 1. 전달값의 타입이 다르거나
// 2. 전달값의 갯수가 다르거나
// ==> 만약 반환형이 double형인 메서드를 하나 더 만들 시
// is alreay defined 라고 에러 메시지를 발생하며
// 다른 반환형의 함수를 정의할 수 없다고 나온다.
System.out.println(getPower(3));
System.out.println(getPower(4));
System.out.println(getPower(3, 3));
}
따라서 같은 class파일에서 컴파일하여도 잘 됨을 알 수 있다.
추가적으로 오버로딩할 때, 중복되는 부분을 제거할 수 있다.
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void setOprands(int left, int right, int third){
this.left = left;
this.right = right;
this.third = third;
}
이런 식으로 되어있다면, left와 right는 중복되는 코드이다.
따라서 this 키워드를 이용하여
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void setOprands(int left, int right, int third){
this.setOprands(left, right);
this.third = third;
}
중복이 제거된 클린 한 코드를 만들 수 있다.
'CS🖥️ > OOP' 카테고리의 다른 글
[OOP] 오버라이딩 & 오버로딩 비교하기(핵심정리) (0) | 2023.09.02 |
---|---|
[OOP] 오버라이딩 (overriding) (0) | 2023.09.02 |
[OOP] 상속과 생성자 & super (0) | 2023.09.02 |