본문 바로가기

1.1 배열이란?

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이다. 서로 다른 타입은 저장이 불가능하고 같은 타입만 저장할 수 있다.

 

 

1.2 배열의 선언과 생성

배열의 선언

원하는 타입의 변수를 선언하고 변수 또는 타입에 배열을 의미하는 대괄호를 붙인다.

int [] scores;
int scores[];

배열의 생성

배열을 선언하고 선언한 변수에는 배열을 생성해야한다. new연산자를 이용해서 배열을 생성할 수 있다.

int[] score;
score = new int[5];

 

 

아래 코드는 선언과 동시에 배열을 생성까지하는 코드이다. 위에서 작성한 코드는 선언과 생성을 따로하고 있다. 즉, 선언을하고 생성을 하지 않으면 메모리 공간만 확보한것이고 값을 저장하지는 못하는것이다.

int[] score = new int[5];

배열의 인덱스

배열에는 요소마다 일종의 일렬번호가 있다. 배열은 항상 0번 인덱스부터 시작하고 배열의 길이 - 1 까지 저장할 수 있다. 만약 배열의 범위를 벗어나는 곳에 데이터를 조작하려하면 indexOutOfBoundsException 이 발생한다.

int [] score = new int[5]; // 0번부터 4번인덱스까지 범위에 포함

 

 

1.3 배열의 초기화

배열은 생성과 동시에 자동으로 자신의 타입에 해당하는 기본값으로 초기화 된다. 원하는 값으로 초기화 하려면 각 요소마다 값을 지정해서 넣어야 한다. 이때, 초기값을 채우기 위해서 반복문을 돌리는 방법도 있지만 Arrays.fillIn() 을 이용하면 손쉽게 초기값을 설정할 수 있다.

 

int [] score = new int[5] {1,1,1,1,1};
Arrays.fillIn(score,1);

 

 

1.4 배열의 복사

복사에는 두가지 유형이 있다. 얕은복사와 깊은복사인데 깊은복사는 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소값만을 복사하는 것이다.

 

얕은복사의 경우 여러 객체가 같은 주소를 바라보고 있기 때문에 어디선가 값을 변경하면 복사한 다른대상의 데이터가 깨지기 때문에 정합성에 문제가 생긴다. 하지만, 정말 변경할 일이 100% 없다면 메모리를 절약할 수 있는 장점도 있다. (근데, 100%변경할일이 없더라도 어떻게든 바꿔버리는 사람이 있기 때문에... 좋지않은 방법이다.)

 

깊은복사의 경우 복사를 하더라도 참조하고 있는 공간이 다르기때문에 얕은복사에서 발생하는 문제를 해결할 수 있다.

 

 

얕은복사

int[] a = { 1, 2, 3, 4 };
int[] b = a;

 

 

깊은복사

int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length]; 
for (int i = 0; i < a.length; i++) {
   b[i] = a[i];
}

 

 

자바에서 제공하는 배열 복사 api

위의 코드에서 확인한것 처럼 깊은복사의 코드는 조금 보기가 싫다. 자바에서는 배열을 복사하는 여러가지 api를 제공해주고 있다.

  1. Object.clone()

clone을 이용하면 손쉽게 깊은 복사를 할 수 있다.

int[] a = { 1, 2, 3, 4 };
int[] b = a.clone();
  1. Arrays.copyOf()

Arrays클래스는 배열을 조작하는데 필요한 여러가지 행위들을 모은 util 클래스이다. copyOf메서드를 잉요하면 배열의 시작점부터 원하는 lengh까지 깊은 복사를 할 수 있다.

int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length);
  1. Arrays.copyOfRange()

copyOf과 다르게 시작점도 지정할 수 있다. 사용법은 copyOf과 동일하다.

다차원 배열에서의 깊은복사

1차원 배열에 대한 깊은복사만 확인했다. 하지만 2차원으로 가면 아래와 같은 형태로 메모리에 데이터가 저장된다.

a[x][y] 인 배열을 위에서 알게된 메서드를 사용하더라도 a[x]부분만 깊은복사가되고 결국 a[x][y]부분의 데이터는 깊은복사가 아닌 얕은복사가 된다. 따라서, 2차원 이상의 배열은 반복문을 돌리면서 일일이 값을 옮겨줘야한다.

'Java' 카테고리의 다른 글

Java에서 동기화를 보장하는 방법  (0) 2021.11.05
자바 객체 생성되는 과정에 대해서  (0) 2021.09.02
자바 String 클래스에 대해서  (1) 2021.08.27
Thread Dump로 DeadLock 확인하기  (0) 2021.06.12
자바 - enum  (0) 2020.09.01

댓글