2014-12-11 3 views
4

Herbert Schildt의 "Java : A Beginners Guide (5th Edition)"책을 읽고 있는데 배열을 선언하는 고유 한 방법을 계속 알아 차리고 있습니다.Java 배열 크기 초기화

여기이 연습의 화신 내 자신의 예입니다 : 이제

public int[] generateArray(int size) { 
    int[] x = new int[size+1]; 
    return x; 
} 
int[] y = generateArray(3); 

을, 어떤이 저자는 항상 크기에 +1와 배열을 만드는하고있다. 나는 왜 그가 이것을 할 것인지 이해하지 못한다. ArrayOutOfBounds 예외를 피할 수 있습니까? 게다가, 만약 그가 1 씩 증가 시키려면 3 대신에 4를 보냅시다.

다음은이 질문의 모호성 정리하는 그의 책에서 예제 :이 책을 모르는

// A dynamic queue. 
class DynQueue implements ICharQ { 
    private char q[]; 
    private int putLoc, getLoc; 
    public DynQueue(int size) { 
     q = new char[size+1]; //allocate memory 
     putLoc = getLoc = 0; 
    } 
} 
+1

저자에게 물어볼 필요가 있습니다. 그것은 ** 정확히 ** 귀하의 예제에서 4를 전달하고 +1을 사용하지 않는 것과 같습니다. –

+0

@manouti oops !! –

+0

당신이 동의하지 않는다면 왜 그의 생각을 무시하지 않습니까? 그것은 하나의 객체 참조입니다 - 4 바이트. 끔찍한 낭비가 아니야. 나는 동의한다. 나는 이렇게 쓰지 않을 것이다. – duffymo

답변

4

을하지만,이 예는 완전히 잘못된 것입니다! 기본적으로 new int[3+1]은 3이 아닌 4 크기의 int 배열을 초기화합니다. int[] generateArray(int size) 메서드를 사용하면 크기가 1이 아닌 인수로 전달 된 크기의 배열을 생성 할 것으로 기대됩니다. 메서드가 수행 할 수있는 유일한 방법은 어떤 의미가 있습니다 : generateArrayThatHasLastIndex (int lastIndex). 그 밖의 다른 방법은 잘못되었습니다.

+0

나는 책에서 예제를 추가했다. 더 이상 오해하지 마십시오! –

4

버릇은 null 바이트를 사용하여 배열의 끝을 나타내는 "센티넬"을 종료하는 C와 같은 언어의 특정 유형과 비슷할 수 있습니다. 예를 들어 "C-strings"이되며 char[] 또는 char *의 형식을 취합니다.

Java는 C가 아니며, 저자가 왜이 일을 선택하지 않았는지는 알 수 없습니다. 오해의 소지가 있으며 절대적으로 나쁜 습관으로 간주됩니다. 예외를 완화하기 위해이 작업을 수행하는 것에 대한 귀하의 의견 역시 정확할 수 있지만 의도 한 것보다 다른 크기의 배열을 만드는 것은 적절한 방법이 아닙니다.

편집 : 당신이 제공 한 예를 바탕으로

, 나는 "오해 크기의"배열을 만드는 습관에 대한 응용 프로그램 코드를 설계하는 문제의 함수에 지나지 않는다 말할 것이다 해결하다.

예를 들어, DynQueue은 첫 번째 또는 마지막 색인이 배열의 나머지 데이터와 어떻게 든 차별화되는 데이터를 나타낼 수 있으므로 ... q[0] (첫 번째 요소는 어떤 알고리즘이나 처리 (말하자면 "앞"에있다)에서 고려 될 '다음'이지만 아직 어레이에서 제거되지 않은 char을 나타내는 을 나타냅니다.

(여전히 그 방법이 잘못되었다는 사실은 변하지 않습니다.)