본문 바로가기

Java

[IT국비지원교육_코딩_비전공자] 배열의 초기화/ 배열의 복사

배열의 길이와 인덱스

배열의 길이 : 배열의 저장공간 크기 (배열의 요소 개수, 즉 값을 저장할 수 있는 공간의 칸 개수이다)

                : 배열의 길이(최대값 약 20억 ; int타입) 제한은 거의 없다고 볼 수 있으며, 길이가 0인 배열도 생성 가능 

배열의 요소 : 생성된 배열의 저장공간

배열의 장점 : Index로 상수 대신 변수나 수식도 사용 가능 (여러개의 배열 index 수식을 for문으로 간단히 할 수 있다)

배열을 다룰 때 주의사항 : index의 범위를 벗어난 값을 index로 사용하면 컴파일 오류는 없으나 실행시 에러 발생 (ArrayIndexOutOfBoundsException 오류 발생)     

                                        다음의 예시는 index로 상수 대신 변수 i 를 사용하여
                                     for문으로 제어변수 i 값을 0부터 4까지 증가시키고 있다
                    score[0] = 0 ;
                    score[1] = 10 ;                        for (int i = 0 ; i < 5 ; i++) {
                    score[2] = 20 ;               =             score [i] = i * 10 ;
                    score[3] = 30 ;                             
                    score[4] = 40 ;

인덱스(Index) : 배열의 요소마다 붙여진 일련번호 (저장공간을 구별하는데 사용됨)

인덱스의 범위 : 0부터 '배열길이 -1'까지 (1이 아닌 0부터 시작하기 때문에 범위에 -1을 적용)  

score[3] = 100;         // 배열 score의 4번째 요소(저장공간)에 100값을 저장한다 
int value = score[3];   // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장

위의 코드에 대한 과정을 그림으로 살펴보자

 

▲ 배열 score의 4번째 저장공간(score3)에 100울 저장

 

▲ 배열 score의 4번째 저장공간(score3)의 값을 읽어서 value에 저장

 

배열이름 . length (배열 길이 값 = 배열이름 .length)
int[] arr = new int [5]                   // 길이가 5인 int 배열
int tmp = arr.length;                     // arr.length의 값은 5이고 tmp에 5가 저장된다
int[] arr = new int [6]                   // 배열의 길이를 5에서 6으로 변경 
for(int i = 0; i < score.length; i++) {   // 변경된 길이와 동일하게 score.length의 길이도 6이 된다
         System.out.println(score[i]);    // 조건식을 변경하지 않아도 된다
 
→ 자바는 JVM이 모든 배열 길이를 별도로 관리하여 '배열이름.length'를 통해 배열의 길이에 대한 정보를 얻을 수 있다
→ 배열은 한번 생성하면 길이를 변경할 수 없는 '상수'이므로 값을 읽을 수만 있다 (배열이름.length = 상수)

→ '배열이름.length'는 배열의 길이가 변경되면 함께 자동적으로 변경되기 때문에 배열과 함께 사용되는 for문의

    조건식을 일일이 변경해주지 않아도 된다 

→ 배열의 길이를 변경하는 방법 (1) 더 큰 배열을 새로 생성한다 (2) 기존 배열의 내용을 새로운 배열에 복사한다
   이때, 이전 인덱스는 그대로 가지고 있고 새배열의 주소를 덮어씌우는 것인데 길이를 너무 크게 잡으면 메모리를
   낭비하게 되므로 기존의 2배정도 길이로 늘리는 것이 좋다 (5칸을 사용하다가 모자른 경우 10칸으로 늘리자) 
 
배열의 초기화

배열은 생성과 동시에 기본값 0 으로 초기화 되므로 배열 사용 전 따로 초기화를 해주지 않아도 된다.
하지만 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해 줘야한다.

int[] score = new int[5];    // 길이가 5인 int형 배열을 생성한다
score[0] = 50;               // 각 요소(저장공간)에 직접 값을 저장한다 
score[1] = 60;       
score[2] = 70;               for(int o = 0; i < score.length; i++)
score[3] = 80;                   score[i] = i * 10 + 50; 
score[4] = 90;               // 길이가 큰 경우 요소 하나하나에 값을 지정하기보다 for문을 사용하자
for문으로 배열을 초기화하려면, 저장하려는 값에 일정한 규칙이 존재해야 한다.
다음의 방법으로 배열을 간단히 초기화 할 수 있다. 
int[] score - new int [] {50, 60, 70, 80, 90);   // 배열의 생성과 초기화를 동시에 한다
int[] score = {50, 60, 70, 80, 90};              // 괄호{} 안에 값의 개수에 의해 배열의 길이가 자동 결정되므로 괄호[] 안에 배열의 길이는 적지 않아도 된다  
                                                 // new int[]를 생략할 수 있음

int[] score;                                     // 배열의 선언과 생성을 따로 하는 경우에는 생략이 불가함
score = {50, 60, 70, 80, 90};                    // 에러. new int를 생략할 수 없음
다음의 3가지 수식 모두 길이가 0인 배열의 생성을 뜻한다. 
int[] score = new int[0];      // 길이가 0인 배열
int[] score = new int [] {};   // 길이가 0인 배열
int[] score = {};              // 길이가 0인 배열, new int가 생략됨
 
배열의 출력

배열에 저장된 값을 확인할 때도 배열을 초기화할 때와 같이 for문을 사용하면 된다

int[] iArr = {100, 95, 80, 70, 60,};         // 마지막 요소 60 뒤에 컴마,가 붙어도 틀린게 아님         
for (int i = 0; i< iArr.length; i++) {       // 배열의 요소(저장공간)를 순서대로 하나씩 출력
    System.out.println(iArr[i]);
    
int[] iArr = {100, 95, 80, 70, 60};          // Arrays.toString(배열이름) 메서드를 이용한 출력
System.out.println(Arrays.toString(iArr));   // 배열 iArr의 모든 요소를 출력한다
                                             // [100, 95, 80, 70 , 60]이 출력된다   
    
System.out.println(iArr);                    // 배열을 가리키는 참조변수 iArr의 값을 출력한다
                                             // [I@14318bb와 같은 형식의 문자열이 출력된다
                                             
char[] chArr = {'a', 'b', 'c', 'd'};         // 예외적으로 charr 배열을 println 메서드로 출력할 때만 각 요소가 구분자 없이 그대로 출력된다   
System.out.println(chArr);                   // 콤마,를 제외한 abcd가 출력된다
                                             // 다른 배열과 달리 chat배열은 for문을 사용하지 않고도 print()나 println()으로 배열에 저장된 모든 문자 출력 가능
 
배열의 복사
배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다
for문은 요소 하나하나에 접근하여(순차탐색) 복사하지만 arraycopy는 지정된 범위의 값들을 한번에 통째로 복사한다 
 

▲ 각 요소들이 연속적으로 저장되어있는 배열의 특성때문에 가능한 처리방법