Java 메서드 서명 후 이상한 "[]"


119

오늘 Java 코드를 살펴 보니 이상한 구문이 있습니다.

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

나는 그것이 컴파일 할 수 없다고 생각했고 내가 생각했던 오타를 고치고 싶었지만 Java 컴파일러가 실제로 그것을 받아들이는 것을 기억했습니다!

누군가가 의미를 이해하도록 도와 주시겠습니까? 함수의 배열입니까?


10
워, 그의 ... 이상한 ...; D
Nanne


2
내가 본 것 중 가장 미친 것 .. 루비가 마법이 많다고하는데 그 루비를 먹어!
IAdapter 2011 년

16
C에서 함수에 대한 포인터 배열에 대한 포인터를 반환하는 함수의 시그니처에 비해 원격으로 이상해 보이지도 않습니다. :)
Kos

답변:


111

을 반환하는 메서드입니다 int[].

Java 언어 사양 (8.4 메서드 선언)

이전 버전의 Java 플랫폼과의 호환성을 위해 배열을 반환하는 메서드에 대한 선언 양식은 매개 변수 목록 뒤에 배열 유형의 선언을 형성하는 빈 대괄호 쌍 (전체 또는 일부)을 배치 할 수 있습니다.

이것은 노후화 된 프로덕션에서 지원됩니다.

MethodDeclarator :
    MethodDeclarator []

그러나 새 코드에서 사용해서는 안됩니다.


92
이것 중 가장 좋은 점 . 따라서 int의 3 차원 배열을 반환하는 메서드가있는 경우 다음과 같이 할 수 있습니다 public int[] foo()[][] {. 사람들의 눈이 피를 흘리게합니다.
Cowan

나는 그 코드를 본 이후 로 크게 웃고 있다고 말해야한다 ! :-D
sdlins

20

재미있는 질문입니다. 자바에서는 int[] a;뿐만 아니라 int a[];.
이 관점에서 동일한 결과를 얻으려면을 이동 []
하고 작성하면 public int[] get() {됩니다.
여전히 코드가 난 독기에서 나온 것 같습니다 ...


2
난 독자에서? C 프로그래머에게서 더 가능성이 높습니다 (배열을 반환 할 수 없지만 배열 유형에 대한 포인터-예 .. 비슷해 보입니다).
Kos

4
@Kos : 왜 난독 화자와 C 프로그래머가 서로 다른 두 가지가되어야한다고 암시하는 건가요? 여러 번 그렇지 않습니다!
Lii

10

C 태그가 있으므로 C와 C ++에서 유사한 (하지만 동일하지는 않음) 표기법이 가능하다는 점을 지적하겠습니다.

여기서 함수 f는 10 개의 정수 배열에 대한 포인터를 반환합니다.

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java에는 별표와 괄호가 필요하지 않습니다.


n 차원 배열에 대한 포인터를 반환하는 함수에 대한 더 쉬운 구문이 있습니까? (다만있는 int *)
테드

사실, 난 추가해야합니다, PCC 지원은 직접 f()[]뭔가를 의미한다 (*f()).
AnArrayOfFunctions

4

java의 구문은 다음을 허용합니다.

int[] intArr = new int[0];

그리고 또한

int intArr[] = new int[0];

c 스타일 구문에서 오는 것이 더 익숙해 보입니다.

마찬가지로 함수를 사용하면 이름이 [] 앞 또는 뒤에 올 수 있으며 유형은 여전히 ​​int []입니다.


1
이것은 배열이라는 사실이 이름의 일부가 아니라 유형의 일부이기 때문에 실제로 int [] 여야하므로 나를 짜증나게합니다. 내 유니 자바 코스를 작성하는 대학원생은 그의 코드에서 항상 그 반대를 수행합니다.
danpalmer 2011 년

1
@danpalmer, 나는 동의한다. 비록 int name []을 쓰기 위해 자신의 피 속에 그것을 가지고있는 AC 프로그래머의 입장이 되기는하지만. 어쨌든, 그다지 큰 문제는 아니지만 언어는 둘 다 지원하고 대부분의 자바 프로그래머는 int [] 규칙을 사용하므로 성가신 대학원생 또는 두 사람을 제외하고는 드뭅니다. 누가 그들이 당신의 마지막에 다음과 같은 질문을 경우에도 당신의 호의에서 작동 할 수 있습니다, 알
다빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.