개발군싹

[Java] 배열 본문

Java

[Java] 배열

개발자군싹 2023. 9. 12. 18:51

Java

배열이란?

기존에 데이터를 저장하는 방법은 자료형과 변수를 선언하여 변수 안에 데이터를 저장하는 방법으로 코드를 작성하였다. 이번에는 배열에 대해서 알아보자.

배열은 동일한 데이터 유형의 요소를 변수보다 더 효율적으로 저장할 수 있는 데이터 구조이다.

같은 자료형의 변수를 하나의 묶음으로 다루며 배열은 각 저장된 데이터마다 인덱스 번호가 부여되어 인덱스 번호로 해당 데이터에 접근할 수 있다.

변수와 배열의 구조차이

배열 선언 및 할당

배열 선언 및 할당

배열은 위와 같이 선언 및 할당을 할 수 가 있다. 

배열의 저장 구조

배열은 참조형 변수로 Heap영역에 저장된다. 

 

int[] arr; 로 선언된 'arr' 배열 변수는 Heap영역에 생성된 배열의 주소를 가지는 참조형 변수가 된다.

int[] arr = new int[4]; //크기가 4인 배열 생성 및 할당

System.out.println("배열arr의 값은 무엇이 들었을까? "+arr); //배열 변수에 무엇이 들었는지 출력해보기

출력 결과

출력결과에서 볼 수 있듯이 'arr'은 선언한 배열의 주소를 가리키고 있다. 이렇게 주소값을 가지고 있는 변수를 Java에서는 참조형 변수라고 한다. 그렇다면 이 주소를 통해 배열을 접근하는 방법은 무엇일까? 바로 인덱스를 이용하여 해당 배열의 값을 불러올 수 있다. 

int[] arr = new int[] { 1, 2, 3, 4 }; //선언과 동시에 초기화

System.out.println(arr); //배열의 주소값 출력

for (int i = 0; i < arr.length; i++) { //반복문을 이용하여 배열의 각 인덱스 0,1,2,3에 접근하여 데이터 확인

System.out.println("배열arr["+i+"]의 값은 무엇이 들었을까? " + arr[i]); //원하는 결과 1,2,3,4 출력확인

}

출력 결과

이번에는 arr에 선언과 동시에 초기화하여 '1,2,3,4'를 각 배열에 저장하였다.

결과에 따르면 같은 배열의 주소가 출력되고, 각 인덱스 번호에 접근하여 선언과 동시에 초기화로 넣어준 '1,2,3,4'가 출력되는것을 볼 수 있다. 이처럼 우리는 배열에 같은 자료형의 데이터를 저장하고 인덱스 번호를 이용하여 해당 배열의 저장 값을 불러 올 수 있음을 확인 할 수 있다.

※ 배열에는 크기가 고정되어 있다. 위 코드의 배열의 크기는 4로 정해져있다. 'int[] arr = new int[] {1,2,3,4};'와 같이 선언과 동시에 초기화 값을 저장한다면 저장된 값의 갯수만큼 배열의 크기가 자동으로 저장된다.

이처럼 배열의 크기는 정해져 있으며 우리는 '배열명.length'를 이용하여 배열의 크기를 쉽게 이용할 수 있다.

 

배열의 저장된 값을 같은 자료형의 기본 변수에 저장 할 수 있다.

int arrValue = arr[0]; //같은 자료형의 변수에 배열에 저장되어있는 값을 저장할 수 있다.

System.out.println("arr[0]번의 값을 arrValue에 넣었다. arrValue에 들어 있는 값은 무엇일까? "+arrValue);

출력 결과

배열의 초기화 방법

배열은 아래의 3가지 방법으로 초기화 할 수 있다. 

배열의 복사 (얕은 복사, 깊은 복사)

코드를 작성하다보면 배열의 값을 복사해야할 때가 있다. 배열의 복사의 개념을 알아보자.

배열의 복사에는 '얕은 복사'와 '깊은 복사'가 있다. 

 

얕은복사

얕은 복사

얕은 복사는 배열로 선언된 참조형 변수의 주소 값을 복사하여 복사하는 방법이다.

'arr1'에 선언되어 데이터가 저장된 배열을 복사하기 위해서 'arr2'에 'arr1'이 가지고 있는 배열의 주소를 복사하여 'arr2'가 배열을 생성한것 처럼 접근하게 할 수 있는 방법이다. 이는 주소값만 가져와 참조형 변수에 저장하고 하나의 배열을 두 변수가 참조하고 있는 것이다. 이를 '얕은 복사'라고 한다.

 

깊은복사

깊은 복사

깊은 복사는 새로운 배열을 생성하고 기존의 배열의 데이터를 복사하는 것이다. 

얕은 복사와 달리 'arr1'과 'arr2'가 가지고 있는 참조 주소가 다르고 'arr2' 또한 배열을 직접적으로 가지고 있다.

이때 'arr1'의 배열의 인덱스를 이용하여 직접 접근해서 'arr2'의 배열 각 저장소에 데이터를 복사하는 것이다.

이는 외부 구조 뿐만 아니라 내부 데이터 또한 복사되기 때문에 복사본과 원본을 완전히 격리시켜 각 다른 배열로 가질 수 있다.

 

'Java' 카테고리의 다른 글

[Java]객체(2) - 생성자(Contructor)와 this  (0) 2023.09.15
[Java] 객체란(1)?  (0) 2023.09.15
[Java] 반복문  (0) 2023.09.12
[Java] 조건문  (0) 2023.09.12
[Java] 연산자  (0) 2023.09.11