Java의 메서드 서명에 반환 유형이 포함되어 있습니까?


102

Java 클래스 / 인터페이스의 메서드 서명에 반환 유형이 포함되어 있습니까?

예:

Java는이 두 가지 방법의 차이점을 알고 있습니까?

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

아니면 메소드 이름과 매개 변수 목록 만 중요할까요?


7
그건 그렇고, JVM이 서명에서 반환 유형을 사용하고 선택적으로 호출하기 때문에 Java 6에서 제네릭을 처리하는 데 버그가있어 두 가지 방법을 모두 가질 수 있습니다. 이것은 Java 7에서 수정되었습니다. vanillajava.blogspot.co.uk/2011/02/…
Peter Lawrey 2011

답변:


146

Oracle Docs 에서 인용 :

정의 : 메서드 선언의 구성 요소 중 두 가지는 메서드 서명 (메서드 이름과 매개 변수 유형)으로 구성됩니다.

여기에 이미지 설명 입력

이 예제를 포함하도록 질문이 편집되었으므로 :

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

아니오, 컴파일러는 서명 myMethod(int param)이 동일하기 때문에 차이점을 알 수 없습니다 . 두 번째 줄 :

    public char myMethod(int param) {}

오류가 발생할 수 있습니다. method is already defined in class , 이는 위의 문을 추가로 확인합니다.


그래서 우리는 같은 메서드 이름, 다른 반환 유형을 가진 동일한 매개 변수를 가진 클래스에 두 개의 메서드를 가질 수 없다는 것을 의미합니까?
Kasun Siyambalapitiya 2015 년

6
@KasunSiyambalapitiya 우리는 할 수 없습니다. 컴파일러는 이와 같은 시나리오에서 호출 할 메서드를 어떻게 알 수 foo.bar(baz);있습니까?
Kolyunya

@Jops, throws 키워드가 있으면 어떨까요? 서명에도 속합니까?
Akila Amarasinghe

19

Java의 클래스 메서드 서명에 반환 유형이 포함되어 있습니까?

Java에서는 그렇지 않지만이 JVM에서는 명백한 혼란을 초래할 수 있습니다.

Java의 인터페이스 메서드 서명에 반환 유형이 포함되어 있습니까?

클래스 메소드와 동일합니다.

아니면 메소드 이름과 매개 변수 목록 만 있습니까?

Java의 메소드 이름 및 매개 변수 유형. 예를 들어 매개 변수 주석 및 이름은 중요하지 않습니다.


1
"Java에서는 그렇지 않지만 JVM에서는 그렇습니다."란 무엇을 의미합니까? JVM에 대해 자세히 설명해 주시겠습니까?
Tarun Maganti 2017

3
@TarunMaganti JVM은 메서드 서명에 반환 유형을 포함합니다. 언어로서의 자바는 그렇지 않습니다.
Peter Lawrey

3
@xyz 이것은 자바 코드가 아닌 바이트 코드를 읽어서 볼 수있는 것입니다. 모든 바이트 코드는 이것을 보여줍니다.
Peter Lawrey

8

바이트 코드 수준에서 "반환 유형"은 메서드 서명의 일부입니다. 이걸 고려하세요

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}

바이트 코드에는 두 개의 clone () 메서드가 있습니다.

public clone()LTest1; throws java/lang/CloneNotSupportedException 

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

반환 유형에 의해서만 다릅니다.


1
인스턴스 메서드가 암시 적으로 인스턴스를 첫 번째 매개 변수로 사용하므로 이는 오해의 소지가 있습니다. om (a)가 실제로 m (o, a)라고 생각할 수 있습니다. 복제의 경우와 같이 차이점은 반환 유형이 아닌 인수입니다.
Huy Le


7

Java Language Spec 말한다

이름과 인수 유형이 동일한 경우 두 메서드는 동일한 서명을 갖습니다.

따라서 아니요, 반환 유형은 메서드 서명의 일부가 아닙니다.


6

JAVA 및 기타 여러 언어에서는 변수없이 메서드를 호출하여 반환 값을 유지할 수 있습니다. 반환 유형이 메서드 시그니처의 일부인 경우 반환 값을 보유하는 변수를 지정하지 않고 호출 할 때 어떤 메서드가 호출되는지 알 수있는 방법이 없습니다.


4

Bro, Java에서는 이름과 매개 변수로 메소드를 호출하여 코드에서 사용합니다.

myMethod (20, 40)

따라서 JAVA는 해당 선언 (이름 + 매개 변수)에서 일치하는 유사한 항목 만 검색합니다. 이것이 메소드 서명에 메소드의 이름과 매개 변수 만 포함되는 이유입니다. :)



3

아니요, Java에서 메서드 서명에는 반환 유형이 포함되지 않지만 선언에는 포함됩니다.

public             String         getString(String myString)

^access modifier   ^return type   ^name    ^parameter type and name

아래 피드백을 기반으로 편집 :)


1
그것은 JLS가 말하는 것이 아닙니다. "동일한 이름 및 인수 유형"입니다. 액세스 수정 자 및 매개 변수 이름도 메소드 서명의 일부가 아닙니다.
Peter Lawrey 2013-04-22

괜찮아 테스트 질문,하지만 난이 프로그램 내가 공개에는 getString를 (쓰고 있지 않다)을 쓰고 있다면, 나는 공공 문자열에는 getString () 쓰고 있어요 경우
제프 호손

1
액세스 한정자, 반환 형식 및 유형 (들) 발생은 당신이 할 수없는 이유입니다 서명의 일부가 아닌 String method( String s )Double method( String s )같은 클래스에서, 예를 들면.
Ray Stojonic 2013

2
아마 당신은 혼동 method signaturemethod declaration
피터 Lawrey

@Ray 나는 그가 초기 질문을 편집하기 전에 내 대답을 썼습니다. 그가 물었던 것은 서명의 일부였습니다. (단순한 프로그램을 테스트하기 위해 작성하여 사실, 그는 자신의 질문에 대답 수 있었다 말했다 수) 형식을 반환
제프 호손을


1

AspectJ (org.aspectj.lang.reflect.MethodSignature)를 사용하면 반환 유형이 있습니다.


1

방법 서명에는 반환 유형이 포함됩니다.

컴파일러는 중복을 확인해야 할 때이를 무시합니다. Java의 경우 반환 유형 만 다른 서명을 가진 두 개의 메서드를 갖는 것은 불법입니다.

시도해보십시오.

public class Called {
    public String aMethod() {
        return "";
    }
}

public class Caller {
    public static void main(String[] main) {
        aMethod();
    }
    public static void aMethod() {
        Called x = new Called();
        x.aMethod();
    }
}

프로젝트를 빌드하고 bin 디렉토리로 이동하여 Caller.cass를 어딘가에 복사하십시오 . 그런 다음 호출 된 메서드를 변경합니다.

public int aMethod() {
    return 0;
}

프로젝트를 빌드하면 Called.class와 Caller.class 모두 새 타임 스탬프가있는 것을 볼 수 있습니다. 위의 Caller.class를 바꾸고 프로젝트를 실행하십시오. 예외가 있습니다.

java.lang.NoSuchMethodError: it.prova.Called.aMethod()Ljava/lang/String;


0

이클립스에서 언급 한 코드를 실행하려고하면 자바 컴파일러가 자바 메소드를 구별하기 위해 찾는 요소에 대한 답을 얻을 수 있습니다.

class Foo {
    public int  myMethod(int param) {
        return param;}
    public char *myMethod*(int param) { //this line throws an error 
        return param;
    }
}

발생하는 오류는 다음과 같습니다. 중복 메서드 myMethod (int) in type Foo.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.