본문 바로가기
Java/자료구조

[자료구조-Java] 배열(Array)?

by WaterPunch 2022. 1. 16.

자료구조란?

데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계를 말합니다

쉽게 말해서 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법입니다

 

 

배열

배열은 같은 자료형의 변수로 이루어진 구성요소(Component)가 모인 것입니다

변수가 하나의 데이터를 저장하기 위한 것이라면, 배열은 여러 데이터를 저장하기 위한 것이라 할 수 있습니다

 

 

배열의 선언

데이터 타입에 대괄호[] 를 붙이는 방법변수의 이름에 대괄호[] 를 붙이는 방법, 이렇게 두가지가 있는데

주로 데이터 타입에 대괄호[] 를 붙이는 방법을 많이 사용합니다

int[] number;	// 많이 사용하는 방법
int number[];

String[] str;	// 많이 사용하는 방법
String str[];

 

배열의 생성

구성요소(Component)의 데이터 타입이 int형이고, 구성 요소의 개수가 5개인 배열은 아래와 같이 선언합니다

타입[] 변수명 = new 타입[길이];

int[] number;		// 선언하기
number = new int[5];	// 참조하기

// 위의 과정을 한번에
int[] number = new int[5];

요소개수가 5개인 int형의 배열 본체를 생성하고 (new int[5])
그것을 변수 number가 "참조"하도록 설정한다는 것입니다

new 연산자가 생성하는 것은 배열 본체에 대한 참조
참조하는 곳이 number에 대입되어 결과적으로 배열 변수 number가 배열 본체를 참조하게 되는 것입니다

배열 변수와 배열 본체

 

위에 선언한 배열에 값을 대입 해보겠습니다

number[1] = 27;
number[2] = 88;
number[4] = 31;

for(int i=0; i<number.length; i++) {
	System.out.println("number[" + i + "]=" + number[i])
}

//결과값
number[0] = 0;
number[1] = 27;
number[2] = 88;
number[3] = 0;
number[4] = 31;

int타입 배열의 구성요소는 자동으로 0으로 초기화되는 규칙이 있습니다 

배열 본체에 값을 대입한 결과

 

 

배열의 인덱스와 길이

배열의 각 저장공간을 '구성요소(element)' 라고 하며, '배열이름[index]'의 형식으로 구성요소에 접근합니다.

index는 구성요소마다 붙여진 일련번호로 요소를 구분하는데 사용합니다. index는 1이 아닌 0부터 시작합니다.

변수명이 a인 배열의 구성요소가 n개인 배열의 구성 요소는 a[0], a[1], a[2], … a[n-1]입니다. a[n]은 존재하지 않습니다.

 

배열의 길이

배열의 길이는 값을 저장할 수 있는 공간의 개수입니다.

배열의 본체와 함께 구성요소의 개수인 배열의 길이(구성 요솟수)를 나타내는 length라는 변수가 생성됩니다.

배열이름.length	// 배열의 길이(구성 요솟수)

number.length // 5

 

배열의 초기화

배열 본체는 배열 초기화(array initializer)를 사용하면 배열 본체의 생성과 동시에 각 요소의 초기화가 가능합니다

int[] a = {10, 20, 30, 40, 50};
int[] a = new int[]{10, 20, 30, 40, 50}; // new 타입[]을 생략해도 되나 이 방법이 조금더 명확하다
// 이렇게 하면 배열 a의 요소 a[0], a[1], a[2], a[3], a[4]는
// 처음부터 순서대로 10, 20, 30, 40, 50으로 초기화됩니다

for(int i=0; i<a.length; i++) {
	System.out.println("a[" + i + "] = " + a[i]);
}

//결과값
a[0] = 10
a[1] = 20
a[2] = 30
a[3] = 40
a[4] = 50

 

배열의 복제(클론)

배열의 복제는 clone 메서드를 호출하여 쉽게 만들 수 있습니다

int[] a = {10, 20, 30, 40, 50};
int[] b = a.clone();
int[] c = a;

// a배열의 for문
for(int i=0; i<a.length; i++) {
	System.out.println("a[" + i + "] = " + a[i]);
}

// a배열의 요소값 변경전 a배열
a[0] = 10
a[1] = 20
a[2] = 30
a[3] = 40
a[4] = 50


// a배열의 요소값 변경
a[2] = 323;
a[4] = 777;

// 변경후 a배열의 for문
for(int i=0; i<a.length; i++) {
	System.out.println("a[" + i + "] = " + a[i]);
}

// b배열의 for문
for(int i=0; i<b.length; i++) {
	System.out.println("b[" + i + "] = " + b[i]);
}

// c배열의 for문
for(int i=0; i<a.length; i++) {
	System.out.println("c[" + i + "] = " + c[i]);
}



// a배열의 요소값 변경후 결과값 비교
a[0] = 10		b[0] = 10		c[0] = 10
a[1] = 20		b[1] = 20		c[1] = 20
a[2] = 323		b[2] = 30		c[2] = 323
a[3] = 40		b[3] = 40		c[3] = 40
a[4] = 777		b[4] = 50		c[4] = 777

a 배열을 참조하는 것이 아닌 복제를 하는 것이기 때문에 복제 후에 a배열의 요솟값을 수정해주어도 값은 수정전의 값과 동일합니다.

a배열의 요소값 변경전
a 배열의 요소값 변경후

 

다차원 배열

Java에는 엄밀한 의미에서 다차원 배열이 없습니다. 이유는, 2차원 배열을 '배열의 배열' 로 생각하고, 3차원 배열을 '배열의 배열의 배열'로 생각하기 때문입니다

//2차원 배열의 선언
타입[][] 변수명 = new 타입[행][열];	// 이 방법을 가장 많이 사용한다
타입[] 변수명[] = new 타입[행][열];
타입 변수명[][] = new 타입[행][열];

// 예시
int[][] a = new int[][]{
	{1, 2, 3},
	{2, 4, 6},
	{3, 6, 9}
}; // new 타입[]을 생략해도 되나 이 방법이 조금더 명확하다
		
for(int i=0; i<a.length; i++) {
	System.out.println(a[i][0] + " " + a[i][1] + " " +  a[i][2]);
}

//결과
1 2 3
2 4 6
3 6 9

a[5][3] 배열 예시

 

다차원 배열의 복제(클론)

다차원 배열의 복제는 최상위의 1레벨만 수행합니다

int[][] a = new int[][]{
			{1, 2, 3},
			{2, 4, 6},
			{3, 6, 9}
		}; // new 타입[]을 생략해도 되나 이 방법이 조금더 명확하다
int[][] b = a.clone();
		
System.out.println("<a>");
for(int i=0; i<a.length; i++) {
	System.out.println(a[i][0] + " " + a[i][1] + " " +  a[i][2]);
}

// a[0][2] 배열값 수정
a[0][2] = 300;

System.out.println("<b>");
for(int i=0; i<b.length; i++) {
	System.out.println(b[i][0] + " " + b[i][1] + " " +  b[i][2]);
}

//결과
<a>
1 2 3
2 4 6
3 6 9
<b>
1 2 300
2 4 6
3 6 9

위처럼 a[0][2]의 값을 바꿔주었는데 a 배열을 클론한 b 배열의 b[0][2] 값이 바뀐 것을 볼 수 있습니다.

a[0] a[1] a[2] 는 복제되나, 그 아래 레벨의 배열 a[0][0~2], a[1][0~2], a[1][0~2] 은 복제되지 않고 공유(참조)하기 때문입니다.

반응형

'Java > 자료구조' 카테고리의 다른 글

[자료구조] 선형구조(Linear Structure)  (1) 2022.01.21
[자료구조-Java] Class 클래스?  (0) 2022.01.18

댓글