배열이란?
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 말한다. 이 포스팅을 보시는 분들은 대게 현업경험이 아예없거나 있어도 조금 있으신 분들이라고 판단하고 여러 변수를 하나의 묶음으로 다루는 것이 왜 필요한지 예를 들어 보겠다. 만약 특정 프로그램을 개발하는데 같은 타입의 변수를 100개 정도 사용하겠다라고 가정해보자. 이러한 상황에서 배열이 없다면 우리는 변수 100개를 선언하여 사용하여야 한다. 벌써 상상만으로도 머리가 지끈거린다. 이럴 때 사용되는것이 바로 배열이며, 보다 손쉽게 방대한 데이터를 손쉽게 다룰 수 있다.
배열의 선언 및 생성
배열의 선언과 생성 방법 예시는 다음과 같다.
// 배열 선언
int[] a;
// 배열 생성
a = new int[3];
// 배열 선언 및 생성
int[] a = new int[3];
// 배열 선언 및 생성과 동시에 데이터를 할당함으로써
// 데이터의 할당 갯수만큼의 배열크기를 지정할 수 도있다.
int[] a = new int[] {10, 20, 30};
// new 연산자를 생략한 배열의 선언 및 생성
int[] a = {10, 20, 30};
// add 메서드를 활용한 배열의 선언 및 생성
int a = add(new int[] {10, 20, 30});
// add메서드를 활용하고 new연산자는 생략한 배열의 선언 및 생성
int add(int[] a) {10, 20, 30};
그런데 여기서 주의할점이 있다. new연산자를 생략하는 배열생성은 다음과 같은 케이스에서 에러를 발생시킨다.
- 배열의 선언과 생성을 분리하면서 배열의 크기를 데이터할당으로 지정할 때
int[] a;
a = {10, 20, 30}; // 에러
- add 메서드를 활용해 배열의 선언과 생성을 동시에 할 때
int a = add({10, 20, 30}); // 에러
배열의 요소와 인덱스
배열을 생성하면 생성시 명시했던 배열 길이만큼의 저장공간이 생기며, 이러한 각 저장공간을 배열의 요소라고한다. 배열의 요소에는 생성 시 지정했던 타입의 데이터들이 담기게 되는데, 그렇다면 배열의 각 요소에 담긴 데이터에 접근하려면 어떻게 해야할까?
그렇다. 인덱스를 활용하는것이다. 배열의 요소에는 각각의 인덱스가 있다. 예를 들어 길이가 2인 배열을 생성했다고 가정하자. 그럼 배열의 요소가 2개가 있을 것이고 각각의 요소는 인덱스 0과 1로 할당된다. 인덱스는 배열의 요소마다 붙여진 일련번호이며 0부터 시작한다. 인덱스를 활용해 배열에 담긴 데이터에 접근하는 예제 코드는 다음과 같다.
int[] a = new int[] {10, 20}; // 배열을 다루기 위한 참조변수 선언 및 생성
a[1]; // 배열의 2번째 요소에 접근
위와 같이 참조변수에 대괄호를 작성후 대괄호 안에 배열의 인덱스를 작성하면 해당 인덱스를 가진 배열요소에 담긴 데이터를 추출할 수 있다. a[1]을 출력하면 20이 나올것이다.
배열 초기화 및 수정과 삭제
이번엔 배열 초기화와 수정 그리고 삭제하는 방법에 대해 알아보자.
배열 초기화
배열 초기화에도 여러가지 방법이 있다. 그 중 배열의 선언과 생성과 동시에 초기화하는 방법은 앞전에 배열의 선언 및 생성 목차에서 예시가 있기때문에 생략하고, 선언 및 생성을 한 후에 초기화하는 방법만 예제 코드를 통해 살펴보자. 방법은 간단하다.
int[] a = new int[3]; // 배열 선언 및 생성
a[0] = 10; // 배열의 요소 첫번째를 10으로 초기화
a[1] = 20; // 배열의 요소 두번째를 20으로 초기화
a[2] = 30; // 배열의 요소 세번째를 30으로 초기화
만약 배열의 초기화 작업을 하지않는다면 배열 생성 시 지정한 데이터타입의 기본값이 셋팅되어있다.
ex) int는 0, String은 null
배열의 데이터 수정
배열의 값을 수정하는 방법은 너무 간단하면서 쉽다. 초기화하는 방법처럼 코드를 작성해주면된다. 덮어써서 값이 바뀐다고 생각하면된다. 예제 코드는 다음과 같다.
int[] a = new int[3]; // 배열 선언 및 생성
a[0] = 10; // 배열의 요소 첫번째를 10으로 초기화
a[0] = 20; // 배열의 요소 첫번째를 20으로 수정
배열의 데이터 삭제
배열의 데이터를 삭제하는 방법은 다양하게 존재한다. 필자는 수많은 방법 중 fill메서드를 활용한 배열 데이터 삭제 방법을 작성해보겠다.
예제 코드는 다음과 같다.
int[] a = new int[] {10, 20};
Arrays.fill(a, 0);
기존에 할당되어있던 데이터를 fill메서드를 활용해 기본값으로 셋팅한 것이다. 조금 응..? 하실수도 있는데 배열의 데이터 삭제는 디폴트값으로 변경하는것이라고 이해하면된다. 필자가 제공한 삭제방법은 배열 요소 전체를 삭제한 방법이다. 특정 요소만 삭제하는 방법이나 전체 요소를 삭제하는 또다른 방법 등은 독자분들이 찾아보시면서 추가적으로 공부해보시길 바란다. 시간의 여유가 생긴다면 또다른 삭제방법들에 대해 추가 포스팅을 해보도록 하겠다.
배열의 복사
배열을 복사하는 방법 또한 여러가지가 있겠지만 필자는 2가지를 꼽아 작성해보겠다.
- for문을 활용한 배열복사
- System.arraycopy()를 활용한 배열복사
for문을 활용한 배열복사
예제코드는 다음과 같다.
int[] a = new int[3];
int[] tmp = new int[a.length * 2];
for(int i = 0; i < a.length; i++) {
tmp[i] = a[i];
}
a = tmp;
이런 작업들은 비용이 많이 들기 때문에, 처음부터 배열의 길이를 넉넉히 잡아 새로 배열을 생성해야하는 상황이 가능한 적게 발생하도록 해야한다. 그렇다고 무리하게 배열의 크기를 잡아버리면 메모리낭비가 커지기때문에 기존의 크기에 2배정도 잡으면된다.
System.arraycopy()를 활용한 배열복사
System.arraycopy() 활용한 배열복사는 for문을 활용한 배열복사보다 효율적이다. 방법은 다음과 같다.
int[] a = new int[3];
int[] tmp = new int[a.length * 2];
System.arraycopy(a, 0, tmp, 0, a.length);
arraycopy 메서드는 5개의 파라메타를 요구하며 각 파라메타의 내용은 다음과 같다.
- Object src : 기존 배열
- int srcPos : 기존배열의 몇번 인덱스부터 읽어올지에 대한 값
- Object dest : 복사 배열
- int destPos : 복사 배열의 몇번 인덱스부터 복사될 것인지에 대한 값
- int length : 기존 배열에서 복사 배열까지 얼만큼 복사해올지 범위를 정하는 값
읽어주셔서 감사합니다. 😊
참고:
자바의 정석 - 남궁성
https://www.delftstack.com/ko/howto/java/clear-an-array-in-java/
'JAVA' 카테고리의 다른 글
JAVA / 메서드(method) (0) | 2020.04.03 |
---|---|
JAVA / 클래스와 객체 (0) | 2020.04.03 |
JAVA / 캐스팅(형변환)이란? (0) | 2020.03.30 |
JAVA / 상수와 리터럴 (0) | 2020.03.27 |
JAVA / 데이터 타입 (0) | 2020.03.24 |