배열이란?
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 의미한다.
여기서 중요한 것은 '같은 타입'이어야 한다는 것이며,
서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.
배열의 선언 방식은 다음과 같다.
- 타입[] 변수이름 ;
- 타입 변수이름[] ;
배열을 선언한 다음에는 배열을 생성해야한다.
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고,
배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.
배열을 생성하기 위해서는 다음과 같이 배열의 타입과 길이를 지정해주어야 한다.
타입[] 변수이름 ;
변수이름 = new 타입[길이] ;
그 다음, 배열의 인덱스에 해당하는 값을 초기화 해주면 되는데,
다음과 같이 배열 생성과 동시에 초기화를 하는 것도 가능하다.
int[] a = new int[]{10, 20, 30, 40, 50};
int[] a = {10, 20, 30, 40, 50}; // new int[] 를 생략할 수 있음
다음은 배열의 길이, 배열을 출력하는 방법을 적용한 실습프로그램을 살펴보자.
처음 배열을 선언한 곳을 보면 배열을 선언하고 생성하는 방식이 여러개인 것을 알 수있다.
배열을 출력하는 방식 또한 for문을 활용해서 출력할 수도 있지만,
Arrays.toString을 이용하여 배열을 문자열로 만들어서 반환하여 출력하는 방법도 있다.
그리고 여기서 주의할 점은 배열을 출력할 때, 26라인처럼 단순히 배열의 참조변수만 적어선 안된다.
이렇게하면 배열의 주소가 출력되는데, 결과를 보면 알 수 있듯이 '타입@주소'의 형식으로 출력된다.
하지만 27라인처럼 char배열은 println메소드로 출력하면 각 요소가 구분자 없이 그대로 출력되는데,
이것은 println메소드가 char배열일 때만 이렇게 동작하도록 작성되었기 때문이다.
배열의 복사
배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면
보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야한다.
배열을 복사하는 방법은 다음과 같다.
int[] arr = new int[5];
int[] tmp = new int[arr.length*2];
for(int i=0; i<arr.length; i++){
tmp[i] = arr[i]; //arr[i]의 값을 tmp[i]에 저장
}
arr=tmp //참조변수 arr이 새로운 배열tmp를 가르키게 된다.
이렇게되면 배열tmp는 arr의 두배의 길이를 가진 배열을 생성하게 되고,
for문에 의해 arr의 값들이 tmp의 배열에 들어가게된다.
그리고 arr=tmp에 의해 참조변수 arr과 tmp는 같은 배열을 가르키게 된다.
즉, 배열 arr과 배열 tmp는 이름만 다를 뿐 동일한 배열이다.
그리고 전에 arr이 가르키던 배열은 더 이상 사용할 수 없게된다.
다음 실습 프로그램을 보면 정확히 이해가 갈 것이다.
이렇게 for문을 이용하여 배열을 복사할 순 있지만
System.arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사할 수 있다.
for문은 배열의 요소 하나하나에 접근해서 복사하지만,
arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다.
사용방식은 다음과 같다.
for(int i=0; i<num.length; i++) { newNum[i] = num[i]; } 라고 했다면,
System.arraycopy(num, 0, newNum, 0, num.length); 라고만 적어주면 된다.
이 뜻은 배열 num의 내용을 배열 newNum으로,
배열 num의 첫 번째 요소부터 시작해서 num.length개의 데이터를 newNum의 첫 번째 요소에 복사한다.
다음 실습프로그램을 살펴보면 더욱 이해가 쉬울것이다.
배열의 활용
1. 정해진 배열에서의 최댓값 최솟값 구하기 프로그램을 살펴보자.
배열의 요소 하나하나씩 비교하기 위해 맨 첫번 째 요소를 max, min값으로 정한다.
그 다음에 for문을 이용하여, 맨 첫번 째 요소를 기준으로 비교하여 최댓값, 최솟값을 구한다.
2. 배열 요소의 순서를 반복해서 바꾸는 프로그램을 살펴보자.
먼저 배열을 생성하고, 배열 numarr[0]의 값을 교환하는 일을 100번 반복한다.
만일 random을 통해 얻은 값이 3이라면, 0번자리와 3번자리의 값을 바꾼다.
이 작업을 반복적으로 수행하면 배열 numarr의 값들이 뒤섞이게 된다.
3. 배열의 요소를 오름차순, 내림차순으로 정렬하는 프로그램을 살펴보자.
먼저, 길이가 10인 배열에 0과 9사이의 임의의 값으로 채운다음, 크기순으로 정렬하는 예제이다.
배열의 길이가 n일 때, 배열의 첫 번째부터 n-1까지의 요소에 대해, 근접한 값과 크기를 비교하여 자리바꿈을 반복한다.
만약 배열의 길이가 5라면, 0과1, 1과2, 2와3, 3과4를 비교하는 총 4번을 비교하기 때문에
(배열의길이-1)번 만큼 반복한 것이다.
또한, 내부에 있는 for문에서 (배열의길이-1-i) 라고 한 이유는
반복을 진행할 때마다 배열의 마지막값은 어차피 최댓값이기 때문에 비교할 필요가 없기 때문이다.
'JAVA > Basic' 카테고리의 다른 글
[JAVA-basic] 다차원 배열 (0) | 2021.08.09 |
---|---|
[JAVA-basic] String배열 (0) | 2021.08.06 |
[JAVA-basic] 형변환 (0) | 2021.07.28 |
[JAVA-basic] 진법 (0) | 2021.07.27 |
[JAVA-basic] 변수와 상수 (0) | 2021.07.26 |