。공부 。

[JAVA] 2차원 배열 동적할당

kyoe 2008. 2. 27. 23:49
우리는 배열을 이용해서 힙영역에 내가 원하는 크기만큼의 배열을 동적할당할수 있습니다.
왜굳이 동적할당을 해야하나? 그냥 넉넉하게 지정해주면 안되나? 하는 분들도 있겠지만 그렇게 되면 메모리손실이 뜻하지 않게 너무커져버릴수 있기 때문입니다.
고등학교를 예로 든다면 반별로 학생수가 다를수가 있습니다 1반에는 30명 2반에는 35명 이렇게 있을수가 있다는 거죠..
이럴땐 그냥 넉넉하게 배열을 50씩 잡아줄수 있겠지만 우리는 동적할당을 이용해서 배열을 크기를 지정해 보도록하죠.

import java.io.*;

public class Exam_array {
    public static void main(String[] args)throws IOException{
        BufferedReader in  = new BufferedReader(new InputStreamReader(System.in));
        int[][] array = null;        //배열을 만들어 주고 널값을 넣어준다.
       
        System.out.print("배열의 행을 입력 : ");
        int x = Integer.parseInt(in.readLine());
        array = new int[x][];        //new 라는 키워드를 이용해 입력받은 값으로 배열의 행을 동적할당한다.
       
        for(int i=0; i<array.length; i++){
            System.out.print("배열의 "+ i +"번째 열을 입력 : ");
            int y = Integer.parseInt(in.readLine());
            array[i] = new int[y];
        }
       

        for(int i=0; i<array.length; i++){
            for(int j=0; j<array[i].length; j++){
                System.out.println("["+ i +"]["+ j +"]");
            }
        }
    }
}

위와 같이 하면 행과 열을 입력 받을수 있습니다.
new라는 키워드를 이용해 배열의 크기를 지정해주면 쉽게 동적할당이 되는데 여기서 주의해서 볼것이 있습니다
array.length 와 array[].length 가 그것인데..
둘의 차이가 무엇이 길래 array뒤에 '[]' 을 붙여줄때도 있고 안붙일때도 있는지 말이죠
length가 있는걸로 봐서는 배열의 크기를 반환한다는것이죠.  맞습니다 분명 배열의 크기를 배환하는것입니다.
하지만 array앞에 '[]' 가 붙지않는다면 바로 행의 크기를 반환하고 '[]'가 붙는다면 열의 크기 반환한다는것입니다.
사용자 삽입 이미지












위의 이미지는 int array[][] = new int[3][2]; 였을때 메모리 영역에 할당되는 것을 그림으로 표현해 본것입니다. int array라는 것은 스텍영역에 4Byte로 할당되는 것을 볼수 있습니다 만약 char형이였다면 몇바이트가 할당될까요? 2Byte라고요? 아니죠 데이터를 힙영역에 할당하고 있기때문에 변수 array는 레퍼런스 변수가 됩니다 즉 주소를 가르키게되는 포인터가 되는것이죠 그렇기때문에 자료형이 무엇이든간에 new라는 키워드로 만들어진 변수의 크기는 4Byte가 됩니다.
이 array라는 녀석은 힙영역에 있는 int[3]을 가리키게 됩니다 자바에선 1차원 배열만을 가르킬수 있기때문에 바로 앞에 있는 공간 즉 그주소를 가르키게 되는것입니다 그리고 그주소는 또다시 바로 앞에 있는 주소를 가르키게 되는것이죠 배열은 레퍼런스이기 때문에 가르키는 주소값은 4Byte 됩니다. 마지막공간은 실제 자료형의 크기를 갖게 되는데 여기서는 이역시 int형이기 때문에 4Byte를 갖게 되는것입니다. 만약 char형이라면파란색세로줄 부분의 4라는 숫자는 2로 표기를 했을겁니다.
우리는 왜 '[]'를 붙여주고 안붙여 주는지를 알았습니다.
그럼 array.length 는 배열 array[3][2]  의 첫번째 값이 3을 반환하게 되는것이죠
array[].length는 2를 반환하게 되는겁니다.

흠.. 제표현이 맞았는지 모르겠네요.. 틀린점있음 바로 수정 들어가겠습니다. ^^;