[Java] 배열(Array)

yeeyo·2025년 3월 4일

Java

목록 보기
2/5
post-thumbnail

배열

배열은 동일한 자료형의 묶음이다. 보통 연속된 메모리 공간에 값을 저장하고 사용하기 위한 용도로 사용된다.

배열은 힙(heap) 영역에 new 연산자를 통해 할당이 된다. 또한, 배열의 길이는 최초 선언한 값으로 고정되며, 인덱스를 통해 데이터에 접근할 수 있다.

즉, 처음 초기화 할 때 배열의 크기를 지정해주어야 한다.


배열을 사용하는 이유

만약 데이터를 저장하려고 할 때 배열을 사용하지 않는다면 아래와 같이 데이터 마다 각각의 변수에 저장하여 사용해야 한다.

int num1 = 1;
int num2 = 2;
int num3 = 3;

...

int num100 = 100;

그래서 우리는 연관된 데이터를 저장하기 위해 굳이 변수를 각각 선언 해줄 필요 없이 배열을 사용하여 같은 자료형의 데이터들을 하나의 배열 안에 초기화 하는 식으로 사용해 줄 수 있다.



1차원 배열

1차원 배열을 선언하는 방법은 여러가지가 있다.

int[] arr = new int [5];

위 처럼 1차원 배열은 최초 선언 시에 배열의 크기와 값을 바로 할당해줄 수 있다.


또한, 아래 코드와 같이 참조 변수만 먼저 선언하고 이후에 크기와 값을 초기화 시켜줄 수도 있다.

public class Main{
	public static void main(String[] args){
				
			//참조 변수만 먼저 선언
			int[] arr;
			arr = new int[5]; //크기나 값을 나중에 초기화
	}
}

이렇게 배열 선언 이후에 1차원 배열에 있는 값에 접근하기 위해서 우리는 인덱스를 이용할 수 있다.

인덱스는 정수만 가능하고, 0부터 시작하기 때문에 배열의 크기가 5라면 배열의 인덱스는 0~4가 된다.

public class Main{
	public static void main(String[] args){
			int[] arr = new int[5];
				
			arr[0] = 1; //인덱스로 배열에 값을 초기화
			arr[1] = 2;
			arr[2] = 3;
			arr[3] = 4;
			arr[4] = 5;
				
			System.out.println(arr[3]); //인덱스로 배열에 접근
				
	}
}


2차원 배열

2차원 배열은 1차원 배열 여러 개를 하나로 묶어서 관리하는 배열이다.

int[][] arr = new int[3][4];

2차원 배열을 선언할 때는 1차원 배열일 때와 다르게 괄호를 두 개를 써주며 각각 행, 열이 된다.

위의 2차원 배열은 3행 4열인 배열로 선언 해준 것이다.

public class Main{
	public static void main(String[] args){
			int[][] arr = new int[2][3];
				
			arr[0][0] = 1; //인덱스로 배열에 값을 초기화
			arr[0][1] = 2;
			arr[0][2] = 3;
			arr[1][0] = 4;
			arr[1][1] = 5;
			arr[1][2] = 6;
				
			System.out.println(arr[1][0]); //인덱스로 배열에 접근
				
	}
}


배열의 복사

자바에서 배열을 복사하는 유형은 2가지가 있다.

  • 얕은 복사(shallow copy) : stack의 주소 값만 복사
  • 깊은 복사(deep copy) : heap의 배열에 저장된 값을 복사

얕은 복사

자바에서 얕은 복사는 stack에 저장되어 있는 배열의 주소 값만 복사하게 된다.

즉, 하나의 레퍼런스 변수(참조형 변수)에 저장된 배열의 주소 값을 가지고, 같은 주소 값을 가리키고 있는 다른 레퍼런스 변수에서 해당 배열의 내용을 수정하게 되면 변경된 값이 반영되게 된다.

얕은 복사 예제 코드

public class Main{
	public static void main(String[] args){
			int[] originArr = {1,2,3,4,5};
			int[] copyArr = originArr; //얕은 복사. originArr의 주소를 copyArr에도 저장
				
			//hashCode(): 주소 값을 볼 수 있다.
			System.out.println(originArr.hashCode()); 
			System.out.println(copyArr.hashCode()); //두 배열이 동일한 주소 값을 가지고 있는 것을 확인할 수 있음
				
			copyArr[0] = 0; //복사본 배열의 값을 변경
			System.out.println(originArr[0]); //0. 값이 똑같이 변경됨
				
	}
}

깊은 복사

깊은 복사는 heap에 생성된 배열이 가지고 있는 값을 또 다른 배열에 복사 해 놓는 것이다. 두 배열이 같은 값을 가지고 있지만, 얕은 복사와 다르게 주소 값이 다르고, 하나의 배열을 변경 하더라도 다른 배열에 영향을 주지 않는다.

깊은 복사를 하는 방법

깊은 복사를 하는 방법에는 4가지가 있다.

  • 반복문을 이용한 값 복사
  • Object의 clone()을 이용한 복사
  • System의 arraycopy()를 이용한 복사
  • Arrays의 copyOf()를 이용한 복사

1. 반복문을 이용한 값 복사

int[] originArr = new int[] {1,2,3,4,5};
int[] copyArr = new int[5];

for(int i=0; i<originArr.length; i++){
		copyArr[i] = originArr[i]; //동일한 인덱스 값 복사
}

2. Object의 clone()을 이용한 복사

int[] originArr = new int[] {1,2,3,4,5};
int[] copyArr = originArr.clone(); //clone() 이용

3. System의 arraycopy()를 이용한 복사

int[] originArr = new int[] {1,2,3,4,5};
int[] copyArr = new int[10];

//arraycopy(원본 배열, 복사를 시작할 인덱스, 복사본 배열, 복사를 시작할 인덱스, 복사할 길이)
System.arraycopy(originArr, 0, copyArr, 3, originArr.length);

복사 후 copyArr : 0 0 0 1 2 3 4 5 0 0


4. Arrays의 copyOf()를 이용한 복사

시작 인덱스부터 원하는 길이 만큼 복사해서 사용 가능하다.

int[] originArr = new int[] {1,2,3,4,5};
int[] copyArr = Arrays.copyOf(originArr, 7); //시작 인덱스부터 원하는 길이만큼 복사해서 사용

복사 후 copyArr : 1 2 3 4 5 0 0

profile
하나씩 천천히

0개의 댓글