티스토리 뷰

Java

[Java] 고급 배열

nc2u 2018. 10. 27. 19:45

무명 배열

자바에서는 배열의 이름을 지정하지 않고 단순히 초기값만으로 배열을 생성시킬 수 있다. 무명 배열(anonymous arrays)은 즉시 배열을 만들어서 함수의 인수로 전달하고자 할 때 많이 사용된다. 특히 안드로이드 프로그래밍에서 자주 사용된다.

무명 배열을 만드는 방법은 다음과 같다.

// 배열의 이름이 없다. 주어진 초기값을 가지는 배열이 생성된다.
new int[] { 1, 2, 3, 4, 5, 6 7, 8, 9, 10 }

위 수식은 새로운 배열을 할당하고 중괄호 안의 값들로 배열을 채운다. 초기값들의 개수에 따라서 배열의 크기가 결정된다. 무명 배열은 배열이 딱 한 번만 필요하고 다시는 참조할 일이 없는 곳에서 사용된다. 

보통은 어떤 메서드에 대해서 배열을 전달하고자 할 때 사용되는데, 이 때 인수로 전달하는 배열이 메소드에만 전달하면 되고 다른 곳에는 일체 사용될 필요가 없을 때 무명 배열이 사용된다.

/* 예제 */
obj.needArray(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });

 

for-each 루프

JDK 1.5 버전부터는 배열에 대하여 다음과 같은 형식의 for-each 루프라고 불리는 향상된 루프를 사용할 수 있다. 이 루프 구조에서는 인덱스 값을 생각할 필요가 없이 배열 안의 모든 요소를 방문할 수 있다.

/* 형식 */
for ( 변수 : 배열 ) { // 변수에 배열의 요소가 차례대로 대입되면서 반복된다.
    ...
}

간단한 예제를 보자.

public class ArrayTest4 {
    public static void main(String[] args) {
        int[] numbers = { 10, 20, 30 };
        for (int value : numbers)
            System.out.print(value + " ");
    }
}

[실행결과]  10 20 30


반복이 진행되면서 변수 value 에는 numbers 배열의 첫 번째 원소부터 마지막 배열 원소까지 차례대로 대입된다. 이 for-each 루프는 다음과 같은 전통적인 for 루프와 동일한 결과를 낸다.

for (int i = 0; i < numbers.length; i++) {
    System.out.print(numbers[i] + " ");
}

for-each 루프는 전통적인 for 루프보다 사용하기 쉽고, 배열의 크기에 신경  쓰지 않아도 되고, 인덱스 값을 저장하는 변수를 생성할 필요도 없다. 또한 사용법이 간결한 만큼 오류의 발생 가능성도 적다. 따라서 배열에서 요소를 하나씩 꺼내어 처리하는 경우라면 for-each 루프를 사용하는 것이 권장된다.

반면 배열 요소의 값을 변경하는 경우, 역순으로 배열 요소를 처리하는 경우, 전체가 아니로 일부 요소만을 처리하는 경우, 하나의 반복 루프에서 두 개 이상의 배열을 처리하는 경우에는 for-each 루프가 부적합하므로 for 루프를 사용하여야 한다.


참고로 배열의 모든 요소의 값을 출력하려면 더 간단한 방법도 있다. Arrays 클래스의 toString() 메소드를 사용하는 것이다.


System.out.println(Arrays.toString(numbers));

[실행 결과] 10 20 30



배열 복사

하나의 배열 변수를 다른 배열 변수로 복사할 수 있다. 이런 경우에 2개의 변수가 동일한 배열을 참조하는 참조값(주소)을 가지게 된다.

만약 한 배열의 모든 값을 다른 배열로 복사하고 싶다면 Arrays 클래스의 copyOf() 메소드를 사용하는 것이 좋다.

/* 예제 */
int [] list_copy = Arrays.copyOf(list, list.length);

copyOf()의 두 번째 매개 변수는 새로 생성되는 배열의 크기이다. copyOf()는 특히 배열의 크기를 증가하는데 많이 사용된다. 에를 들어서 현재 배열의 크기를 2배로 변경하려면 다음과 같은 문장을 사용하면 된다.

list = Arrays.copyOf(list, 2 * list.length);

 

main() 매개 변수

자바 프로그램에는 main()메소드가 있고 main()은 String[] args 매개 변수를 가지고 있다. 이 매개 변수는 바로 문자열 배열이다. 이 문자열 배열에는 우리가 명령어 프롬프트에서 프로그램을 실행시킬 때 주는 인수들이 저장된다. 


배열 정렬

배열을 정렬하는 가장 손쉬운 방법은 Arrays 클래스의 sort() 메소드를 사용하는 방법이다. 퀵정렬은 일반적인 경우에 가장 빠르고 효율적인 정렬 알고리즘이다.

/* sort() 메소드 사용 예제 */
int[] a = new int[100];
a[0] = 32;
a[1] = 21;
...
Arrays.sort(a);

 


2차원 배열

배열은 많은 데이터들을 하나로 묶어서 처리할 때 유용한 자료구조이다. 특히 2차원 배열은 열과 행을 가진 시트데이터를 편리하게 표현할 수 있다.

int[][] s = new int[3][5];

위 문장은 3행, 5열의 요소를 가지는 2차원 배열을 선언한 것이다. 2차원 배열을 사용할 때도 인덱스를 사용하는데 첫 번째 인덱스는 행의 번호이고 두 번째 인덱스는 열의 번호이다. 예를 들어서 1행의 3열의 요소는 s[1][3]이다.


2차원 배열의 초기화

2차원 배열의 초기화도 중괄호를 이용한다. 2차원의 배열에서는 같은 행의 요소를 중괄호로 묶으면 된다.

int[][] testArray = {
    { 10, 20, 30 },
    { 40, 50, 60 },
    { 70, 80, 90 }
}

1차원 배열의 경우와 마찬가지로 초기화 리스트가 존재하는 겨우에는 new 연산자를 사용할 필요가 없다.


다차원 배열

다른 언어와 마찬가지로 자바에서도 얼마든지 다차원 배열을 생성할 수 있다. 예를 들어서 다음 문장은 3차원 배열을 생성한다.

double[][][] = sales = new double[3][2][12];

위의 배열은 회사의 매출액을 지역별, 부서별, 월별로 분류하여 저장하는데 사용될 수 있다.


ArrayList

자바에는 전통적인 배열보다 훨씬 사용이 편리한 배열이 있다. 바로 ArrayList 이다. 전통적인 배열의 경우 배열을 생성할 때 배열의 크기를 지정해 주어야 하는데 크기가 한 번 결정되면 절대 변경할 수 없고 잘못된 요소 크기가 주어질 경우 에러가 발생한다. 이것은 실제 프로그래밍에서 상당히 불편하다. 

ArrayList 는 전통적인 배열과 달리 실행 도중에 배열의 크기를 변경할 수 있는 동적배열이며,  다음과 같은 형식으로 사용한다.

/* ArrayList 사용 형식 */
ArrayList <자료형> list = new ArrayList<>();

친구들의 리스트를 ArrayList로 생성하는 예제는 다음과 같다.

// ArrayList 생성하기
ArrayList list = new ArrayList<>();

위 문장이 실행되면 비어있는 리스트가 생성된다. 다음과 같이 add() 메소드를 호출하여 요소들을 리스트에 추가할 수 있다.

list.add("철수");
list.add("영희");

리스트에서 요소를 삭제할 때는 다음과 같이 하면 된다.

list.remove(1);  // 1번째 요소 삭제

ArrayList가 배열과 다른 점은 다음과 같다.


  • 배열에서는 []을 사용하여 요소에 접근한다.
  • ArrayList에서는 ()를 사용하여 요소에 접근한다.

size() 메소드는 리스트의 현재 크기를 반환한다.

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

정수 배열을 생성할 때는 다음과 같이 int가 아니라 Integer를 적어주어야 한다.

ArrayList list = new ArrayList<>();
list.add(98);
int firstNumber = list.get(0);


'Java' 카테고리의 다른 글

[Java] super 키워드  (0) 2018.10.27
[Java]객체 지향 프로그래밍의 특징  (0) 2018.10.27
[Java] 내장 클래스  (0) 2018.10.27
[Java] 자료형(data type)의 종류  (0) 2018.10.27
[Java] 접근 제어 지정자  (0) 2018.10.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크