여러개의 저장공간이 붙어서 형성되는 것.
같은 타입의 값들을 한번에 저장하기 위해 사용.
배열의 선언
1. 자료형[ ] 배열명 = new 자료형[길이] ;
- new사용시 내가 초기화하지 않아도 초기화가 된다. ( 자동 초기화 )
2. 자료형 배열명 [ ] = {값1, 값2....} ;
- 원하는 지정값이 있을때 { }사용
- 선언과 동시에 초기화되는 배열 선언 방식
3. 자료형 [ ] 배열명 ;
배열을 이해하기 위해 내부적으로 들어가보자.
저장공간이 같은 타입으로 여러개가 선언이 되었을때
RAM에서는 따로 따로 한칸씩 생성이 된다.
예로들어 같은 타입의 변수가 4개가 선언이 되어야 한다면..
변수4개를 만들게 되면 굉장히 비효율적이니
4칸짜리 배열을 선언하면 어떨까!
if >
arrayNum이라는 배열안에 int 타입의 변수 3.4.1.2 가 있다고 가정을 해보자.
arrayNum이라는 배열의 저장공간 안에는 첫번째 저장공간의 주소가 들어가있다.
왜냐하면 각각의 저장공간에는 주소가 부여되기 때문이다.
+ (참고하여 이해)
stack = 지역변수 = 영역안에 갇혀있는 변수
project > packge > class ↓
클래스에서 가장 큰 범위인 class의 중괄호 { } 안에
main이라는 메서드 안에 중괄호 { } 영역이 있다.
-> main이라는 지역 안에 갇혀있는 모든 변수가 stack영역에 들어가게 된다.
그에 따라,
stack안에 arrayNum이라는 (배열)저장공간이 생기게 된것이고
arrayNum은 배열의 시작주소를 가지게 된다.
그렇다면 4칸짜리 공간은 어디에 생길까?!
-> heap이라는 영역에 4칸짜리 공간이 생기게 된다.
+ heap은 저장공간은 있으나 이름을 붙일 수 없는 공간. heap에는 주소들만 존재한다.
arrayNum은 heap메모리에 할당된
4칸짜리 배열의 "시작주소만" 가지고 있다.
쉽게 말해서,
칸, 공간 -> heap메모리 영역에 생성.
배열의 시작 주소 - > stack의 해당 배열의 저장공간에 담김.
우리가 필요한건 주소값에 담긴 값!!!
값에 접근하자..!
값에 접근할 때 쓰는 것 :
=> 그 주소값에 참조해보니 3이라는 값이 들어있네.
참조를 하기위해서 [ ]를 사용.
arrayNum [ ] 괄호 안에는 index가 들어간다.
-> index를 방번호라고 생각을 하자.
첫번째방이 0번째 index : arrayNum [ 0 ] = 3;
배열은 0부터 시작한다. 왜?!
c언어에서 시작되었기에 c언어로 접근을 해보자.
arrayNum배열의 구조.
100번째 다음은 104번째이다. 왜냐하면..
int는 4byte임으로 한 칸의 크키는 4이며 주소값도 4만큼 이동한다.
시작값은 arrayNum이 가지고 있다.
arrayNum +1 하면 104번지로 이동이 된다.(c언어 포인터 연산)
+2 , +3 ....동일
c언어는 '*'로 참조를 한다. ( = 주소값을 왔다갔다시킨다.)
c언어 *arrayNum으로 접근
*(arrayNum + 0) -> 3 (=> +0 :첫번째방)
<문제점>
연산기호(4개)가 너무 많고,
포인터를 모르면 배열을 쓸수 없어서 대괄호로 치환을 하게 된다.
변수명과 연산값만 남기게 된다.
=> arrayPrice[0]
그런데!
배열안에 4개의 방이 있다면 총 4번을 써야하는데
변수 4개를 쓰는거랑 똑같은데??
인덱스 번호를 보게 되면 1씩증가하며 같은게 여러번 반복된다.
즉! 반복문 사용이 가능하다.
배열기본형
int arrayNum[] = new int[x];
new : 기타 연산자 ( heap메모리 영역에 들어가는 명령어. )
예제를 통해 더 알아보자.
< example >
int[] arData = new int[4]; //배열선언 방식1
int arData2[] = {1,2,3,4,5}; //배열선언 방식2
System.out.println(arData); //[I@5e91993f
4칸짜리 배열의 시작주소가 튀어나오게 된다.
[I@5e91993f
해석 : 배열이구요, integer타입이예요. @는 구분점이고 그 뒤에는 주소값입니다.
주소값에 접근하자! 참조!
그래야 값을 볼수있다.
System.out.println(arData[0]); //0
-> new를 했기 때문에 0으로 자동 초기화가 된다.
배열의 길이를 알 수 있는 변수.
System.out.println(arData.length); //배열의 길이
배열이 선언되는 순간 고정되는 변수이다.( 이미 배열에 있는 변수 )
for(int i =0; i<arData2.length; i++) {
if(arData2[2] == 3) {
System.out.println("숫자3이 들어있습니다.");
}
System.out.println(arData2[i]); //1,2,3,4,5
-> if문을 통해서 검사/검색이 가능하다.
< examlple >
배열을 이용해 (for문이용) 10~1까지 출력
int [] arOut = new int[10];
for(int i = 0; i<arOut.length; i++) {
arOut[i] = 10-i;
System.out.println(arOut[i]);
}