배열(배열의 모든 것) (1)


이번 포스팅에선 배열에 대해서 알아보겠습니다.

배열이란 같은 type의 데이터를 모아 놓는 자료 구조를 말합니다.
[ ]은 배열을 가르키는 것으로 타입이라 생각하시면 되겠습니다.
배열도 프리미티브 타입이 아닌 참조타입입니다.
즉, 값이 직접 들어가는게 아니라 주소값이 들어가는 것입니다.

코드부터 보시죠~

배열

간단히 예로 들자면, int형으로 여러개의 값을 일일히 타이핑해서 각각 값을 주는건 불편하겠죠? 물론 그게 5개, 10개정도면 타이핑이 빠를 수도 있겠죠
근데 그 수가 100개 200개 이런식으로 넘어가면 일일히 타이핑 치기엔 어려움이 있습니다.
그래서 배열이란 것을 사용하는 것이고 배열은 우리가 앞시간에 배운 반복문을 이용해서 많이 사용합니다.

배열은 [ ] 대괄호를 이용하는데 박스라고 생각하시면 편합니다.
우리가 기존에 int i=3; 이라고 했던 것 기억나시죠?
이것은 
int i;
i=3; 
을 줄여서 표현한겁니다. 배열도 마찬가지에요
int[ ] all;
all = new int[100]; 
이걸 줄여서
int [ ] all = new int[100]; 이런식으로 사용합니다.
all이라는 int를 담을 수 있는 그릇을 새로 만들고 그 공간에 100개를 넣겠다는 뜻입니다.
char도 넣을 수 있고 처음 선언 시, [100]은 공간을 의미합니다.
그 다음에 괄호를 계속 쓰는 것은 배열의 index를 뜻해요. 몇번째냐는 것을 표현하는거죠.
100개라고 했고 컴퓨터에선 0부터 시작이라고 했으니 실제 all배열에는 0~99까지 100칸이 있는 겁니다. 
만약, 여기서 all[3]이라고 하면, all배열에서 4번째 칸을 의미합니다.

그리고 배열의 길이를 length로 자주 표현합니다. 이 표현은 매우 유용해서 알아두시기 바랍니다.

어떤 경우에도 배열에는 값을 직접 넣는게 아니라 주소가 들어가는데, 그 이유는 객체가 몇byte인지 모르기 때문입니다. 뭐가 들어올지 모르기 때문이죠.
미리 공간을 연속적으로 잡아야하기에 안에 값을 주는게 아니라 참조하는 주소값을 넣습니다. 글자로 예를 들면, java가 들어올지 javastudy가 들어올지 모르기 때문입니다.
배열은 reference타입이기 때문에 이름 옆에 바로 값이 없고 주소값이 들어갑니다.

for문처럼 반복문을 돌릴 때 all 배열의 크기 100을 안적고 all.length로 적는게 관례입니다.

for문을 보시면, 
i=0부터 시작해서 100(all.length가 100이므로)까지 하나씩 주겠다는 뜻입니다.
0번째에는 1, 1번째에는 2... 99번째에는 100이겠네요


그림으로 표현하면 다음과 같습니다. 


@100은 임의로 제가 주소값을 설정한 것이구요. 메모리 구조로 볼 때 new를 이용하므로 instance영역에서 다음 그림처럼 배열에 100개의 칸이 들어갑니다.

이처럼 배열은 여러개의 값을 묶을 때 쉽게 표현할 수 있기에 매우 유용합니다.

이번엔 이전에 배운 String으로 배열을 만들어보죠
new로 만든 String은 각각이 전부 다른 객체라고 했죠?


메모리 구조 그림으로 표현해보면 다음과 같습니다.


5칸을 지정했으니 0번부터 4번째까지 칸이 생기구요.
all[0]을 보면 String을 위한 공간에 java라는 글자가 들어가는 200번지가 생깁니다.
(각각의 1칸은 char형으로 char형은 2byte기 때문에 4칸으로 총 8byte)
(그렇다고, 저 배열을 char형으로 생각하진 않습니다. 1자 이상이면 그냥 String으로 표현하면 됩니다.)
그림에는 그리지 않았지만 all[1]은 내용은 전부 같지만 주소값이 다른 전혀 다른 객체가 생기구요(편의상 @300)
""으로 만들면 StringLiteralPool 공간에서 만든다고했죠?
그래서 all[2]와 all[3]은 같은 주소값을 가집니다.(편의상 @1)
5칸을 만들었기에 나머지 1공간은 null로 비어있습니다.


이제 JVM의 실행 메커니즘으로 보면서 코드에 대해 다시 설명 드리겠습니다.

load – main 제외 static초기화 상속확인 –main수행

String [] all = new String[5]
인스턴스영역에 객체를 생성하는데 new하면 메모리를 새롭게 잡게되는데 String부터 보는게 아니라 [ ] 보고 상자부터 만들게됩니다.
그다음 refrence보게되고 주소값을 넣기 위해 4byte5칸을 할당합니다.
(int가 아닌데도 한칸 4byte – 이유 주소값이 들어가야하기 때문)
그렇다면 이 상자를 all이라는 이름으로 가리키겠다.
아직까지 string로드안함
all[0] = new String (“java”);를 보면
이제 new를 보고 새롭게 인스턴스영역에서 자리를 할당받습니다.
어떤 경우에도 배열에는 값을 직접 넣는게 아니라 주소가 들어갑니다.
(객체가 몇byte인지 모르기 때문에 뭐가 들어올지 모르기 때문)
미리 공간을 연속적으로 잡아야해서 안에 값을 주는게 아니라 참조하는 주소값을 넣습니다.  java가 들어올지 javastudy가 들어올지 모르기 때문이죠.

String s1 = new String(“java”);라고 한다면, Stringreference타입이기 때문에 값을 넣는게 아니라 그 내용을 가진 주소값을 가지게 됩니다.

글이 길어져서 다음 포스팅에서 이어서 작성하겠습니다.



댓글 없음:

Powered by Blogger.