메서드 시그니처는 자바 컴파일러가 클래스 내에서 각 메서드를 구별하기 위해 사용하는 고유한 식별 정보입니다. 간단히 말해, 메서드의 이름과 매개변수 리스트의 조합을 의미합니다.
JVM(자바 가상 머신)은 이 시그니처를 통해 호출해야 할 정확한 메서드를 찾아냅니다.
메서드 시그니처는 다음 두 가지 요소로 구성됩니다.
a, b 등)은 시그니처에 포함되지 않습니다.예를 들어, 다음 두 메서드는 매개변수의 순서가 다르므로 서로 다른 시그니처를 가집니다.
void calculate(int amount, double rate) { ... }
void calculate(double rate, int amount) { ... }
메서드를 구성하는 다른 요소들은 시그니처에 포함되지 않습니다. 이는 메서드를 식별하는 기준이 아님을 의미하며, 이 요소들만으로는 동일한 이름의 메서드를 구분할 수 없습니다.
// 컴파일 오류: 이미 정의된 메서드입니다.
class SignatureExample {
int getResult() { return 1; }
String getResult() { return "hello"; } // 반환 타입만 다르므로 중복 정의로 간주
}
public, protected, private와 같은 접근 제어자는 시그니처에 포함되지 않습니다.throws 절 또한 시그니처의 일부가 아닙니다.메서드 시그니처는 메서드 오버로딩의 성립 여부를 결정하는 핵심 규칙입니다. 오버로딩은 메서드 이름은 같지만 시그니처는 다른 메서드를 여러 개 정의하는 것을 허용합니다.
컴파일러는 호출 코드에 전달된 인자의 타입, 개수, 순서를 보고 어떤 시그니처의 메서드를 호출할지 결정합니다.
class PrintUtil {
// 시그니처: print(int)
public void print(int value) {
System.out.println("Integer: " + value);
}
// 시그니처: print(String) - 오버로딩
public void print(String value) {
System.out.println("String: " + value);
}
// 시그니처: print(String, int) - 오버로딩
public void print(String label, int value) {
System.out.println(label + ": " + value);
}
// 시그니처: print(int, String) - 오버로딩 (매개변수 순서가 다름)
public void print(int value, String label) {
System.out.println(value + " is " + label);
}
/*
// 컴파일 오류: 반환 타입은 시그니처에 포함되지 않음
// 위쪽의 print(int)와 시그니처가 동일하여 메서드 중복 정의 오류 발생
public String print(int value) {
return "Integer: " + value;
}
*/
}
public class Main {
public static void main(String[] args) {
PrintUtil util = new PrintUtil();
util.print(100); // print(int) 호출
util.print("Hello"); // print(String) 호출
util.print("Count", 50); // print(String, int) 호출
util.print(50, "Count"); // print(int, String) 호출
}
}