메서드 시그니처(Method Signature)란
메서드를 고유하게 식별하기 위해 사용하는 정보이다.
Java 기준으로 메서드 시그니처는 다음으로 구성된다.
메서드 이름 + 매개변수 타입 목록
반대로, 다음 요소들은 메서드 시그니처에 포함되지 않는다.
1. 반환 타입
2. 접근 제한자 (public, private 등)
3. static, final 키워드
void test(int a)
int test(int a) // ❌ 시그니처 동일 → 컴파일 에러
위 두 메서드는 이름과 매개변수 타입이 같기 때문에
리턴 타입이 달라도 같은 시그니처로 판단된다.
메서드 오버로딩(Overloading)은
같은 이름의 메서드를 여러 개 정의하는 것이다.
성립 조건
void test(int a) {}
void test(int a, int b) {}
void test(double a) {}
위 메서드들은 모두
매개변수 목록이 서로 달라 서로 다른 메서드 시그니처를 가지므로
오버로딩이 성립한다.
오버로딩 시 주의사항
int test(int a) {}
double test(int a) {} // ❌ 컴파일 에러
Java에서 메서드 시그니처에는 리턴 타입이 포함되지 않는다.
따라서 리턴 타입만 다른 경우는
메서드 시그니처가 동일하게 판단되어 오버로딩이 성립하지 않는다.
메서드 오버라이딩(Overriding)은
부모 클래스의 메서드를 자식 클래스에서 재정의하는 것이다.
오버라이딩을 통해 자식 클래스는
부모 클래스의 동작을 자신의 상황에 맞게 변경할 수 있다.
성립 조건
class Parent {
Number getValue(int a, int b) {
return a+b;
}
}
// Parent 클래스의 getValue() 메서드를 Child 클래스에서 오버라이딩
class Child extends Parent {
@Override
Integer getValue(int a, int b) {
return a * b;
}
}
오버라이딩 시 리턴 타입은 다음 규칙을 따른다.
java.lang.Number → java.lang.Integer