[Java] 메서드 시그니처

artp·2025년 9월 15일

java

목록 보기
29/32
post-thumbnail

Java의 메서드 시그니처 (Method Signature)

1. 메서드 시그니처란?

메서드 시그니처는 자바 컴파일러가 클래스 내에서 각 메서드를 구별하기 위해 사용하는 고유한 식별 정보입니다. 간단히 말해, 메서드의 이름과 매개변수 리스트의 조합을 의미합니다.

JVM(자바 가상 머신)은 이 시그니처를 통해 호출해야 할 정확한 메서드를 찾아냅니다.

2. 메서드 시그니처의 구성 요소

메서드 시그니처는 다음 두 가지 요소로 구성됩니다.

1. 메서드 이름 (Method Name)

  • 호출될 메서드의 이름입니다.

2. 매개변수 리스트 (Parameter List)

  • 메서드가 받는 인자들의 타입, 순서, 개수를 의미합니다. 매개변수의 이름(a, b 등)은 시그니처에 포함되지 않습니다.

예를 들어, 다음 두 메서드는 매개변수의 순서가 다르므로 서로 다른 시그니처를 가집니다.

void calculate(int amount, double rate) { ... }
void calculate(double rate, int amount) { ... }

3. 시그니처에 포함되지 않는 요소

메서드를 구성하는 다른 요소들은 시그니처에 포함되지 않습니다. 이는 메서드를 식별하는 기준이 아님을 의미하며, 이 요소들만으로는 동일한 이름의 메서드를 구분할 수 없습니다.

1. 반환 타입 (Return Type)

  • 메서드가 어떤 타입의 값을 반환하는지는 시그니처의 일부가 아닙니다.
  • 따라서, 아래와 같이 반환 타입만 다른 두 메서드를 같은 클래스에 선언하면 컴파일 오류가 발생합니다.
// 컴파일 오류: 이미 정의된 메서드입니다.
class SignatureExample {
    int getResult() { return 1; }
    String getResult() { return "hello"; } // 반환 타입만 다르므로 중복 정의로 간주
}

2. 접근 제어자 (Access Modifiers)

  • public, protected, private와 같은 접근 제어자는 시그니처에 포함되지 않습니다.

3. 예외 선언 (throws Clause)

  • 메서드가 발생시킬 수 있는 예외를 선언하는 throws 절 또한 시그니처의 일부가 아닙니다.

4. 메서드 시그니처의 중요성

메서드 오버로딩(Overloading)의 핵심 규칙

메서드 시그니처는 메서드 오버로딩의 성립 여부를 결정하는 핵심 규칙입니다. 오버로딩은 메서드 이름은 같지만 시그니처는 다른 메서드를 여러 개 정의하는 것을 허용합니다.

컴파일러는 호출 코드에 전달된 인자의 타입, 개수, 순서를 보고 어떤 시그니처의 메서드를 호출할지 결정합니다.

예시 코드

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) 호출
    }
}
profile
donggyun_ee

0개의 댓글