배열이란 같은 타입의 여러 변수를 하나의 묶음으로 만들어 다루는 방식을 의미한다. 배열 하나를 만들면 배열의 길이만큼 변수를 만들어 내는 것이라고 볼 수 있다. 그렇기에 변수를 일일히 만들지 않아도 되는 효과가 발생한다.
type [] variable; // 배열을 사용할 변수를 선언
variable = new type[length]; // 실제 배열을 생성. length만큼의 저장공간이 생긴다
배열에 접근할때는 인덱스(index)라는 개념을 사용한다. 이는 배열에서 몇번째 순서에 있는지를 의미하는 수치이며, 0부터 시작해서 배열의 길이-1까지의 index를 가진다.만약 범위에 벗어난 index로 접근하고자 하면 에러가 나기 때문에 유의해야 한다.
배열의 길이는 배열 생성시에 정하게 되는데, 길이의 개념이므로 양의 정수만 들어갈 수 있다. 다만 예외적으로 길이가 0인 배열도 생성할 수 있다. 배열의 길이는 상수의 개념이기에 한번 선언하면 변경할 수 없다. 배열의 길이를 변경하고자 한다면 새로운 배열을 만들어야한다.
처음 배열을 선언하면 모든 값이 default인 0으로 저장되게 된다. 이 때 초기값을 주어 배열을 선언하고 싶다면 다음과 같이 선언하면 된다.
type [ ] variable = new type[ ] {initial value1,initial value2, ...};
위와 같이 배열을 선언하면 initial value의 개수만큼의 길이를 가진 배열이 생성된다. 앞의 예시와 다르게 선언과 생성을 한줄에서 처리하였는데, 만약 선언과 생성을 같이하는 경우에는 new type[] 부분은 생략할 수 있다.
생성한 배열을 출력할 때는 for문을 사용하여 일일히 모든 요소를 출력하거나 Arrays.toString(배열이름)을 사용하여 출력해볼 수 있다. toString 메소드를 사용하면 같은 타입의 문자열로 만들어 반환해준다. 배열 이름 자체를 출력하게 되면 배열이 가리키고 있는 주소가 출력되기 때문에 무의미하다.
배열을 한번 생성하면 길이값이 상수이기 때문에 변경할 수 없다. 만약 저장해야할 변수의 개수가 많아져 새로운 배열을 생성하고 기존의 배열을 복사해야한다면 다음의 방법들을 사용할 수 있다. 새로운 배열의 길이는 기존 배열의 2배정도로 잡는데, 이는 메모리의 낭비를 최대한 막으면서 배열을 복사해야하는 상황을 최소화하기 위함이다.
- for문을 이용하여 기존 배열의 값을 새로운 배열에 일일히 할당한다. 이후, 기존 배열 변수에 새로운 배열 변수를 할당시키면 두 변수 모두 새로운 배열을 가리키게 된다.
- System.arraycopy()를 사용하여 처리하는 방법이 있다. for문보다 효율적이다.
System.arraycopy(old array, start index1, new array, start index2, # of copy)
위 식의 의미는 old array의 start index1부터의 값을 new array의 start index2부터 채워넣기 시작하는데, 그 개수는 # of copy와 같다는 것이다.
배열을 사용하면 배열안에 있는 모든 요소의 총합, 평균, 최대값, 최소값 등등의 계산을 간단히 처리할 수 있다. 그 외에도 shuffle, sort, frequency 등의 기능을 구현하는데 사용된다.
👍