Chapter 7. 기본자료형 배열

SeungHyun Son·2021년 6월 24일

본 내용은 KH정보교육원 에서 제공한 교재 내용을 개인적인 공부를 위한 목적으로 작성되었습니다.
만약 아래의 내용을 무료로 배부하거나 상업적으로 이용할 경우 법적 처벌을 받을 수 있음을 경고합니다.

배열의 개요

같은 자료형의 변수 여러 개를 하나의 묶음으로 만들어 하나의 이름으로 다루는 것을 배열이라고 한다.
데이터를 저장하기 위해 여러 개의 변수를 선언할 수도 있지만 관리해야 하는 변수가 많아지면 코드가 매우 복잡하고 많아지게 된다. 이러한 경우 하나의 배열 이름으로 여러 개의 변수들을 다룰 수 있으면 코드를 간단하게 처리할 수 있게 된다.
자바에서는 배열 공간은 자유 메모리 영역인 Heap 영역에 할당하도록 지정되어 있으며, 배열 변수는 할당된 배열 공간의 주소를 저장하며, 배열 공간의 주소를 이용해 인덱스(순번, Index)를 참조하는 방식으로 값들을 처리하도록 정해두었다.

배열의 선언과 생성

배열의 선언 : 배열 공간의 주소 저장용 참조(Reference) 변수를 만드는 것

타입[] 변수이름;
타입 변수이름[]

배열을 선언하면 참조형 변수가 생성된다. 배열을 선언한다고 해서 값을 저장하는 공간이 생기지는 않는다.

int[] arr;
int arr;

배열의 생성 : Heap 영역에 값을 저장하는 변수들을 연속 나열 할당하고, 발생한 배열 공간의 시작주소를 선언된 배열 레퍼런스에 대입한다.

배열참조변수 = new 데이터타입 [연속 할당될 변수 갯수];

배열을 생성할 때 배열의 길이(첨자)를 지정해 주면 해당 데이터 타입의 값을 저장할 수 있는 저장 공간을 길이 갯수 만큼 연속 할당한다. 배열의 선언과 생성은 한 줄로 가능하다.

데이터타입[] 변수 = new 데이터타입 [첨자];

예를 들어 길이가 3인 문자열(String) 배열을 생성한다면

String[] strArr = new String[3];

배열의 초기화

배열 공간 할당과 동시에 초기값을 기록하는 것을 말하며, 배열 초기화 시에는 배열의 길이를 따로 지정하지 않고 초기화에 사용되는 값의 개수가 자동 배열의 길이로 처리된다.
자바에서는 배열 공간의 초기화를 따로 지정하지 않아도 자동 초기화 처리가 되도록 각 자료형별 기본값이 준비되어 있다.
기본값은 boolean은 false, char은 'Wu0000', 정수형은 0.0, 참조형은 null이다.

데이터타입[] 배열참조변수 = [1,2,3, ...};
데이터타입[] 배열참조변수 = new 데이터타입[] {1,2,3, ...};

TestArrayInit.java

01 public class TestArrayInit {
02     public static void main(String[] args) {
03         String strArr[] = {"Apple", "Banana", "Orange"};
04
05     for (int i = 0; i < 3; i++)
06     System.out.println(strArr[i]);
07     }
08 }

배열의 인덱스

생성된 배열 공간의 각 저장공간을 요소(Element)라고 부르며, '배열이름[인덱스]' 형식으로 요소에 접근할 수 있다. 배열의 저장공간의 개수를 배열의 길이(Length)라고 하며, 인덱스는 0부터 시작해서 배열의 길이 -1까지 지정된다.

배열의 길이

  • 배열의 길이는 배열 이름.lendth를 이용해 알 수 있다.

TestArrayLength.java

01 public class TestArrayLength {
02     public static void main(String[] args) {
03         String strArr[] = {"Apple", "Banana", "Orange"};
04
05         System.out.println("배열의 길이는 " + strArr.length + "입니다.");
06     for (int i = 0; i < strArr.length; i++)
07         System.out.println(strArr[i]);
08     }
09 }

배열의 복사

배열의 복사는 참조하는 배열공간의 주소를 다른 참조변수에 복사하는 얕은 복사(Shallow Copy)와 배열공간의 값들을 다른 배열공간에 하나씩 복사하는 깊은 복사(Deep Copy)가 있다.

TestShallowCopy.java

01 public class TestShallowCopy {
02     public static void main(String[] args) {
03         String originArr[] = {"Apple", "Banana", "Orange"};
04         String destArr[]; // 배열의 주소 복사용 배열 레퍼런스 선언
05 
06         destArr = originArr; // 주소 복사
07
08     for (int i = 0; i < 3; i++)
09     System.out.println(originArr[i] + " : " + destArr[i]);
10     System.out.pritnln("------------------------");
11
12     originArr[1] = "Pineapple"; // 원본 배열 2번째 인덱스의 값 수정
13
14     for(int i = 0; i < 3; i++)
15     System.out.println(originArr[i] + " : " + destArr[i]);
16     }
17 }
------
Apple : Apple
Banana : Banana
Orange : Orange
--------------------------
Apple : Apple
Banana : Banana
Orange : Orange

위와 같이 배열의 주소를 복사한 경우에는 두 개의 배열 레퍼런스가 같은 대상을 공유하게 된다. 별도의 배열 공간을 따로 할당한 다음 원본 배열의 값들을 복사할 경우 for문을 이용해서 직접 인덱스별로 하나씩 복사하는 방법을 사용할 수도 있고, java.lang.System 클래스의 arrayCopy() 메소드를 이용하는 방법이 있다.

for문을 이용하여 별도의 배열 공간에 하나씩 복사하는 방법

  • 복사본 배열 공간을 따로 생성한 후에 for문을 이용해 각 인덱스 별 데이터를 하나씩 복사한다.

TestDeepCopy.java

01 public class TestdeepCopy {
02     public static void main(String[] args) {
03         String originArr[] = {"Apple", "Banana", "Orange"};
04         String destArr[];
05
06         destArr = new String [originArr.length];
07
08         for(int i = 0; i < originArr.length; i++)
09             destArr[i] = originArr[i];
10
11         for(int i = 0; i < originArrlength; i++)
12             System.out.println(i + " : " + originArr[i] + ", " + destArr[i];
13     }
14 }

arrcopy() 함수를 이용한 복사
System.arraycopy(src, srcPos, dest, destPos, length) 함수를 이용한 방법
매개변수(src : 원본 배열, src : 원본 배열 시작 인덱스, dest : 복사할 배열, destPos : 복사할 배열 시작 인덱스, length : 복사할 길이)를 지정해서 복사한다. for문을 이용한 복사보다 arraycopy() 함수를 이용한 방법이 더 효율적이다.

java.lang.System.arrayCopy() 메소드를 이용한 방법은 다음과 같다.

TestArrayCopy.java

01 public class TestDeepCopy {
02     public static void main(String[] args) {
03         String originArr[] = {"Apple", "Banana", "Orange");
04         String destArr[] = new String [originArr.length];
05
06     System.arrayCopy(originArr, 0, destArr, 0, originArr.length);
07
08     for(int i = 0; i < destArr.length; i++)
09         System.out.println(i + " : " + originArr[i] + ", " + destArr[i];
10    }
11 }

다차원 배열

같은 자료형 변수들의 묶음을 1차원 배열이라 하고, 자료형이 같은 1차원 배열들의 묶음을 2차원 배열이라 한다. 1차원 배열은 배열 기호 [] 가 1개이며 2차원 배열은 배열 기호가 [][] 2개이다. 같은 자료형 2차원 배열들의 묶음을 3차원 배열이라고 하며 배열기호는 [][][] 3개로 표시된다. 이러한 2차원 이상의 배열들을 다차원 배열이라고 한다.

2차원 배열의 선언

데이터타입 배열참조변수[][];
데이터타입[] 배열참조변수[];
데이터타입[][] 배열참조변수;

2차원 배열의 생성

배열참조변수 = new 데이터타입[행 길이][열 길이];    // 정변배열
배열참조변수 = new 데이터타입[행 길이][];         // 가변배열, 행만 선언
배열참조변수[행인덱스] = new 데이터타입[열 길이];   // 행에 대한 열 선언

행 길이는 묶여질 1차원 배열의 개수를 의미하고, 열 길이는 각 1차원 배열의 값 개수를 의미한다. 2차원 배열에서 행 길이와 열 길이가 같은 경우를 정변배열이라고 하고, 행 길이와 행별 열 길이가 다른 경우를 가변배열이라고 한다.

2차원 배열의 초기화

데이터타입 배열이름[][] = {{00열 값, 01열 값, ...},{10열 값, 11열 값, ...}, ...};

TestTwoDimensionalArray

01 public class TestTwoDimensionalArray {
02     public static void main(String[] args) {
03         int score[][] = {{1, 2, 3}, {4, 5, 6}};
04
05         for (int i = 0; i < score.length; i++) {
06             for (int j = 0; j < score[i].length; j++) {
07                 System.out.println(i + "행" + j + "열 : " + score[i][j] + "\t");
08             }
09             System.out.println();
10         }
11     }
12 }

2차원 가변배열 초기화

TestTwoVariableArray.java

01 public class TestTwoVariableArray {
02     public static void main(String[] args) {
03         int score[][] = new int[3][];
04         score[0] = {1, 2, 3, 4, 5};
05         score[1] = {12, 24, 36};
06         score[2] = {11, 22, 33, 44};
07
08         for (int i = 0; i < score.length; i++) {
09             for(int j = 0; j <score.length; j++) {
10                 System.out.println(i + "행" + j + "열" + score[i][j] + "\t");
11         }
12         System.out.println();
13     }
14 }

0개의 댓글