Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 배열 완벽 가이드: 초보자를 위한 기초부터 실전까지

하나의 변수만 선언해서 여러 값을 저장할 수 있다면 얼마나 편할까요? 다행히 자바(Java)에는 바로 이런 작업을 가능하게 해주는 배열(array)이라는 개념이 있습니다. 배열을 사용하면 여러 값을 하나의 변수에 담을 수 있어 코드를 깔끔하고 체계적으로 유지할 수 있습니다.

이 가이드에서는 배열의 동작 원리, 배열을 사용하는 이유, 그리고 배열의 내용을 조작하는 방법까지 차근차근 살펴봅니다. 몇 가지 예제를 통해 실제로 어떻게 작동하는지 함께 확인해 보겠습니다.

배열이란 무엇인가?

배열은 '리스트(list)'라고도 불리며, 순서가 있는 요소들의 나열을 담는 자료 구조입니다. 배열에는 0개 이상의 항목을 저장할 수 있지만, 모든 항목은 반드시 같은 타입이어야 합니다. 예를 들어 하나의 배열에 문자열 100개를 저장하거나 숫자 52개를 저장할 수 있습니다.

배열은 비슷한 성격의 값들을 한데 묶어 관리할 수 있다는 점에서 유용합니다. 예를 들어 커피 종류 목록을 만든다고 생각해 보세요. 커피 종류마다 별도의 변수를 선언하는 대신, 배열 하나에 모두 담아 그룹화할 수 있습니다.

배열을 한 번 선언해 두면, 반복문을 통해 배열의 모든 값에 동일한 메서드와 연산을 손쉽게 적용할 수도 있습니다.

배열은 '값들의 모음'이라고 생각하면 이해하기 쉽습니다. 오늘 처리해야 할 할 일 목록이 배열과 비슷합니다. 처리해야 할 작업들이 리스트로 정리되어 있고, 각 작업은 특정한 순서대로 저장되어 있죠.

배열 선언하기

자바에서 배열을 선언하는 것은 아주 간단합니다. 배열의 이름을 정하고 데이터 타입을 지정하기만 하면 됩니다. 다음은 coffees라는 이름의 배열을 선언하는 예제입니다:

String[] coffees;

이 코드는 coffees라는 배열을 생성합니다. 왼쪽에는 배열에 저장될 데이터 타입이 위치하고, 그 뒤에 빈 대괄호 쌍이 붙습니다. 이 대괄호가 있으면 단순한 문자열 변수가 아니라 배열을 정의한다는 의미가 됩니다. 오른쪽에는 변수의 이름이 옵니다.

하지만 아직 끝난 것이 아닙니다. 배열을 선언할 때는 프로그램에게 배열이 몇 개의 항목을 저장할지 알려줘야 합니다. 그래야 자바가 배열에 값을 저장하는 데 필요한 메모리를 미리 확보할 수 있습니다.

우리의 coffees 배열에는 단골 커피숍의 최애 블렌드 세 가지를 저장하고 싶다고 가정해 봅시다. 이를 위해 배열이 담을 수 있는 요소의 개수를 3으로 지정합니다:

coffees = new String[3];

이렇게 하면 배열 안에 채워 넣을 수 있는 빈 값 세 개가 생성됩니다.

배열에 몇 개의 값을 저장할지 미리 신중하게 생각해야 합니다. 중요한 점은 한 번 배열의 크기를 정하면 나중에 변경할 수 없다는 것입니다.

물론 선언과 메모리 할당을 한 줄로 압축할 수도 있습니다:

String[] coffees = new String[4];

이것이 배열을 선언하는 가장 좋은 방법입니다. 간결하고 명확하기 때문입니다. 이 방식이 통하지 않는 유일한 경우는 배열에 몇 개의 값을 저장할지 아직 모를 때입니다. 이럴 때는 먼저 배열을 선언해 두고, 프로그램이 필요한 크기를 파악한 후에 메모리를 할당하는 것이 좋습니다.

위 예제에서는 문자열 값을 담는 배열을 만들었지만, 정수 배열, 객체 배열, 배열의 배열, 혹은 그 밖의 다른 데이터 타입을 담는 배열도 얼마든지 선언할 수 있습니다.

배열 초기화하기

배열 설정이 아직 완전히 끝난 것은 아닙니다. 지금까지 우리는 배열을 선언했을 뿐인데, 문제는 아직 아무 값도 담고 있지 않다는 점입니다. 변수를 선언하면서 동시에 초기값들을 지정하는 문법은 다음과 같습니다:

String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };

이 예제에서는 배열에 세 개의 값을 할당했습니다.

배열 요소에 접근하기

배열의 매력은 접근이 쉽다는 점입니다. 비유하자면, 집중하고 싶은 할 일 항목에 표시를 하는 것과 같습니다.

배열 안의 모든 항목에는 고유한 번호가 부여되는데, 이를 인덱스(index)라고 합니다. 인덱스 번호는 0부터 시작하며, 배열의 각 항목마다 1씩 증가합니다. 다음 목록을 살펴보세요:

  • 0: Rwanda Izuba
  • 1: French Roast
  • 2: Vietnam Da Lat Arabica

이 목록에서 Rwanda Izuba 블렌드의 인덱스 값은 0, French Roast는 1, Vietnam Da Lat Arabica는 2입니다. 다음 배열을 보겠습니다:

String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };

이 배열의 첫 번째 항목에 접근하려면 다음 코드를 사용할 수 있습니다:

System.out.println(coffees[0]);

이 코드는 다음을 출력합니다: Rwanda Izuba.

인덱스 값은 대괄호 사이에 넣어 배열에 전달합니다. 유효한 인덱스 값의 범위는 0부터 '배열 길이 - 1'까지입니다. 앞서 말했듯이 배열은 0부터 인덱싱되기 때문입니다.

존재하지 않는 인덱스 값에 접근하려고 하면 오류가 발생합니다:

ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

여기서는 배열의 인덱스 3에 접근하려고 했습니다. 하지만 인덱스 값은 최대 2까지만 존재하기 때문에(기억하세요, 배열은 0부터 시작합니다!) 오류가 반환된 것입니다.

이제 한 단계 더 나아가 보겠습니다. 배열의 모든 항목을 순회하면서 각 항목에 어떤 연산을 수행하고 싶다고 가정해 봅시다. 여기서는 배열의 모든 항목을 콘솔에 출력해 보겠습니다. 이 작업은 for-each 루프로 간단히 처리할 수 있습니다:

class CoffeeArray {
    public static void main(String[] args) {
        String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };
        for (String coffee : coffees) {
            System.out.println(coffee);
        }
    }
}

이 코드의 실행 결과는 다음과 같습니다:

Rwanda Izuba
French Roast
Vietnam Da Lat Arabica

이 예제에서 코드는 coffees 배열의 모든 항목을 순회하며 각 항목을 콘솔에 출력합니다. 일반적인 for 루프 대신 for-each 루프를 사용한 이유는 카운터 변수가 필요 없어 더 간결하고 읽기 쉽기 때문입니다.

배열 항목 변경하기

잠깐, 문제가 생겼습니다! 알고 보니 우리가 좋아하는 French 블렌드의 실제 이름은 French Roast가 아니라 French Classic이었네요. 이를 수정하려면 인덱싱을 활용하면 됩니다.

다음 코드를 살펴보세요:

class CoffeeArray {
    public static void main(String[] args) {
        String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da Lat Arabica" };
        coffees[1] = "French Classic";
        System.out.println(coffees[1]);
    }
}

대입 연산자(=)를 사용해 인덱스 1 위치의 커피 값을 변경했습니다. 값이 French Roast에서 French Classic으로 바뀌었습니다. 이 코드는 다음을 출력합니다: French Classic.

자바 배열 종합 예제

지금까지 배운 개념들을 하나의 예제로 정리해 보겠습니다. 지난 일주일 동안 커피에 총 얼마를 지출했는지 계산하는 프로그램을 만들어 봅시다.

먼저 클래스와 프로그램에 필요한 변수들을 설정합니다:

class CoffeePrices {
    public static void main(String[] args) {
        Double[] purchases = {2.55, 2.75, 2.99, 3.05};
        double sum = 0;
    }
}

두 개의 변수를 선언했습니다. 하나는 구매 내역 목록을 저장하고, 다른 하나는 지출 총액을 누적할 변수 역할을 합니다. 다음 단계는 for-each 루프를 만들어 모든 커피 구매 금액을 순회하면서 "sum" 변수에 더하는 것입니다:

for (double purchase : purchases) {
    sum += purchase;
}

System.out.println("You've spent $" + sum + " on coffee in the last week.");

모든 코드를 함께 실행하면 다음과 같은 결과가 출력됩니다:

You've spent $11.34 on coffee in the last week.

일주일에 $11.34면 나쁘지 않네요! 참 유용한 프로그램입니다.

마무리 (그리고 도전 과제)

배열은 같은 데이터 타입의 여러 값을 저장할 수 있는 자료형입니다. 좋아하는 책 목록, 게임 플레이어 명단, 평균을 계산하고 싶은 숫자 목록 등 무엇이든 배열로 만들 수 있습니다.

도전해 볼 준비가 되셨나요? 계속 읽어보세요.

도전 과제: 사용자가 자세히 알아볼 여행 목적지를 선택할 수 있는 프로그램을 작성해 보세요. 여행 목적지들은 하나의 배열에 저장하고, 각 목적지에 대한 한 문장짜리 설명은 별도의 배열에 저장해야 합니다.

사용자가 여행 목적지를 선택하면, 목적지 배열에서 해당 항목을 찾아 인덱스 번호를 계산합니다. 그런 다음 그 인덱스 번호를 사용해 해당 목적지의 한 문장 설명을 콘솔에 출력하면 됩니다.

이제 여러분도 프로처럼 자바에서 배열을 활용할 준비가 되었습니다!