맛있는물회

[맛있는물회] <JAVA>배열(Array) 본문

IT/자바

[맛있는물회] <JAVA>배열(Array)

맛있는물회 2018. 7. 4. 18:45

자바를 공부한지 2달 정도 된것같다. 수업내용말고 따로 공부하는 것을 한번 정리해봐야 겠다.


C를 공부했었기 때문에 비슷한 내용은 제외하고 자바만의 특성이나 내가 몰랐던 것들만 적어 봐야겠다.


1. 선언방법


ㅇ타입[] 변수이름;           (int[] score;    String[] name;)


ㅇ타입 변수이름[];           (int score[];   String name[];)

내가 보는 책의 저자는 대괄호가 변수이름의 일부라기보다는 타입의 일부라고 보기때문에 대괄호를 타입에 붙이는 

쪽을 선호한다고 한다.

배열을 선언한 다음 배열을 생성해야한다.


여기서 배열을  선언하는 것은 단지 생성된 배열을 다루기 위한 주소값 즉 참조변수를 위한 공간이 만들어 질뿐이다.


그래서 다시 배열을 생성해줘야한다. 여기서 쓰이는 연산자는 'new'이다.


ㅇ타입[] 변수이름;
  변수이름 = new 타입[길이]
->(한줄로) int[] arr = new int[5];

new 연산자에의해 메모리의 빈공간에 5개의 int형 데이터를 저장할 수있는 공간이 마련되면 배열요소는 자동적으로 타입의 기본값으로 초기화가 된다. 여기선 int의 초기값인 '0'으로 초기화된다.


2. 
ㅇ유효한 범위를 벗어난 값을 index로 사용하는 것은 배열을 다룰 때 하는 가장 흔한 실수이다.


그렇게 되면 ArrayIndexOutOfBoundsException이라는 에러가 발생하게 된다.


수업시간엔 try catch 문이나 throws 문으로 에러를 잡기도 했었다. 나중에 예외처리 부분에 가서 한번 정리를 해봐야겠다. 


이러한 에러는 컴파일 시에는 아무런 문제가 없지만(왜냐하면 배열의 index로 변수를 많이 사용하는데, 변수의 값

은 실행 시에 대입되므로 컴파일러는 이값의 범위를 확인 할 수 없기때문이다.) 실행시에는 에러가 발생한다!


ㅇ배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다.


int[] arr = new int[0]

ㅇ배열이름.length는 '상수'이다. 


이미 생성된 배열의 길이는 변하지 않는다. 즉, 값을 읽을 수만 있을 뿐 변경할 수 없다.


-> 배열 길이 변경하기


1. 더 큰 배열을 새로 생성한다.


2. 기존 배열의 내용을 새로운 배열에 복사한다


3.


ㅇ배열의 출력


for문은 이미 아는 것이기 때문에 Arrays.toString 메서드를 정리하겠다.


이 메서드는 배열의 모든 요소를 '[첫번째 요소, 두번째 요소,...]'와 같은 형식의 문자열로 만들어서 반영한다.


ex)
int[arr] = {100, 95, 80};


System.out.println(Arrays.toString(arr));


->[100, 95, 80]


 여기서 알아야 할점!


println에서 배열 자체를 출력하면 어떻게 될까?


System.out.println(arr);


-> [I@14318bb     (실행할 때 마다 달라질 수 있다.)


[I는 1차원 int배열이라는 의미이고, @뒤의 16진수는 배열의 주소인데 실제주소가 아닌 내부주소이다.


BUT 


char[] chararr 이와 같은 char배열은 println메서드로 출력하면 각 요소가 구분자 없이 그대로 출력된다.



4. 배열의 복사


ㅇ1. for문을 이용한 배열 복사


새로운 배열을 생성한후 for문안에서 그대로 복사해 주면된다.


그리고 마지막에 


arr = tmp(arr를 tmp에 복사)

로 해주면 참조변수 arr에 참조변수 tmp의 값을 저장하게된다. arr의 값은 0X100(원래 arr주소값)에서 


tmp의 주소값인 0X200으로 바뀌고 arr는 배열 tmp를 가리키게 된다.

-> 즉 배열 arr와 배열 tmp는 이름만 다를 뿐 동등한 배열이다. 그리고 전에 arr이 가리키던 배열을 더 이상 사용할 수없게 되고 가비지 컬렉터에 의해 자동적으로 메모리에서 제거된다.


ㅇ2. System.arraycopy()를 이용한 배열복사


이 문제로 중간고사에서 한문제 틀렸다.ㅎㅎㅎ 2차원배열을 다른 2차원 배열로 복사하는 문제였는데 내가 주소값


을 복사해버려서 복사한 이후 원래 배열을 바꾸니깐 복사된 배열도 바뀌어서 틀렸다. 제대로 정리한번 해봐야겠다


-> 2차원배열에서    (Src가 원래배열, Dst가 복사받은 배열)


for(int i=0;i<arraySrc.length;i++)


System.arraycopy(arraySrc[i],0,arrayDst[i],0,arraySrc[i].length); 


이렇게 하면 올바르게 값만 복사되고


for(int i=0;i<arraySrc.length;i++) 


System.arraycopy(arraySrc,0,arrayDst,0,arraySrc.length); 


이렇게 했더니 주소값이 복사되어서 나중에 Src를 1로 초기화 했더니 Dst도 1로 초기화가 되버렸다ㅠㅠ

어쨌든 arraycopy는


System.arraycopy(num, 0, newNum, 0, num.length);


로 parameter가 정해지는데 이 뜻은 


num[0]에서 newNum[0]으로 num.length개의 데이터를 복사한다는 뜻이다.

오늘은 여기까지~

(출처 - 자바의 정석(남궁성지음) )



Comments