배열

배열은 단일 타입의 고정된 수의 값을 저장하는 컨테이너 객체입니다. 배열의 길이는 배열이 생성될 때 설정됩니다. 생성 후에는 길이가 고정됩니다. “Hello World!” 애플리케이션의 메인 메서드에서 배열의 예시를 이미 보았습니다. 이 섹션에서는 배열에 대해 더 자세히 설명합니다.

An array of 8 elements.

8개 요소로 구성된 배열입니다.

배열의 각 항목을 _element_라고 하며, 각 요소는 숫자 _index_로 액세스합니다. 앞의 그림에서 볼 수 있듯이 번호는 0부터 시작합니다. 따라서 예를 들어 6번째 요소는 인덱스 5에서 액세스됩니다.

다음 프로그램인 ArrayDemo는 정수 배열을 생성하고 배열에 몇 가지 값을 넣은 다음 각 값을 표준 출력으로 인쇄합니다.

class ArrayDemo {
    public static void main(String[] args) {
        // declares an array of integers
        int[] anArray;
 
        // allocates memory for 10 integers
        anArray = new int[10];
 
        // initialize first element
        anArray[0] = 100;
        // initialize second element
        anArray[1] = 200;
        // and so forth
        anArray[2] = 300;
        anArray[3] = 400;
        anArray[4] = 500;
        anArray[5] = 600;
        anArray[6] = 700;
        anArray[7] = 800;
        anArray[8] = 900;
        anArray[9] = 1000;
 
        System.out.println("Element at index 0: "
                           + anArray[0]);
        System.out.println("Element at index 1: "
                           + anArray[1]);
        System.out.println("Element at index 2: "
                           + anArray[2]);
        System.out.println("Element at index 3: "
                           + anArray[3]);
        System.out.println("Element at index 4: "
                           + anArray[4]);
        System.out.println("Element at index 5: "
                           + anArray[5]);
        System.out.println("Element at index 6: "
                           + anArray[6]);
        System.out.println("Element at index 7: "
                           + anArray[7]);
        System.out.println("Element at index 8: "
                           + anArray[8]);
        System.out.println("Element at index 9: "
                           + anArray[9]);
    }
}

이 프로그램의 출력은 다음과 같습니다:

Element at index 0: 100
Element at index 1: 200
Element at index 2: 300
Element at index 3: 400
Element at index 4: 500
Element at index 5: 600
Element at index 6: 700
Element at index 7: 800
Element at index 8: 900
Element at index 9: 1000

실제 프로그래밍 상황에서는 앞의 예제에서처럼 각 줄을 개별적으로 작성하는 대신 지원되는 루핑 구조 중 하나를 사용하여 배열의 각 요소를 반복할 것입니다. 그러나 이 예는 배열 구문을 명확하게 보여줍니다. 제어 흐름 문 섹션에서 다양한 루핑 구문(for, while, do-while)에 대해 알아볼 수 있습니다.

 

배열을 참조하는 변수 선언하기

앞의 프로그램은 다음 코드 줄로 배열(anArray라는 이름의 배열)을 선언합니다:

// declares an array of integers
int[] anArray;

다른 타입의 변수에 대한 선언과 마찬가지로 배열 선언에는 배열의 타입과 배열의 이름이라는 두 가지 구성 요소가 있습니다. 배열의 타입은 type[]으로 작성되며, 여기서 type은 포함된 요소의 데이터 타입이고 괄호는 이 변수가 배열을 담고 있음을 나타내는 특수 기호입니다. 배열의 크기는 타입의 일부가 아니므로 괄호가 비어 있습니다. 배열의 이름은 클래스 생성하기 섹션에서 설명한 규칙과 규칙을 따른다면 무엇이든 원하는 대로 지을 수 있습니다. 다른 타입의 변수와 마찬가지로 선언은 실제로 배열을 생성하는 것이 아니라 컴파일러에 이 변수가 지정된 타입의 배열을 보유할 것임을 알려줄 뿐입니다.

마찬가지로 다른 타입의 배열을 선언할 수 있습니다:

byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;

배열 이름 뒤에 대괄호를 넣을 수도 있습니다:

// this form is discouraged
float anArrayOfFloats[];

그러나 관례에 따라 괄호는 배열 타입을 식별하며 타입 지정과 함께 표시되어야 합니다.

 

배열 생성, 초기화 및 액세스하기

배열을 생성하는 한 가지 방법은 new 연산자를 사용하는 것입니다. ArrayDemo 프로그램의 다음 문은 10개의 정수 요소를 위한 충분한 메모리가 있는 배열을 할당하고 배열을 anArray 변수에 할당합니다.

// create an array of integers
anArray = new int[10];

이 문이 누락되면 컴파일러는 다음과 같은 오류를 출력하고 컴파일에 실패합니다:

ArrayDemo.java:4: Variable anArray may not have been initialized.

다음 몇 줄은 배열의 각 요소에 값을 할당합니다:

anArray[0] = 100; // initialize first element
anArray[1] = 200; // initialize second element
anArray[2] = 300; // and so forth

각 배열 요소는 해당 숫자 인덱스로 액세스합니다:

System.out.println("Element 1 at index 0: " + anArray[0]);
System.out.println("Element 2 at index 1: " + anArray[1]);
System.out.println("Element 3 at index 2: " + anArray[2]);

또는 바로 가기 구문을 사용하여 배열을 생성하고 초기화할 수 있습니다:

int[] anArray = {
    100, 200, 300,
    400, 500, 600,
    700, 800, 900, 1000
};

여기서 배열의 길이는 중괄호 사이에 제공되고 쉼표로 구분된 값의 수에 따라 결정됩니다.

‘문자열[][]` 이름과 같이 두 개 이상의 대괄호 집합을 사용하여 배열 배열(다차원 배열이라고도 함)을 선언할 수도 있습니다. 따라서 각 요소는 그에 해당하는 수의 인덱스 값으로 액세스해야 합니다.

Java 프로그래밍 언어에서 다차원 배열은 구성 요소 자체가 배열인 배열입니다. 이는 C나 포트란의 배열과는 다릅니다. 그 결과 다음 MultiDimArrayDemo 프로그램에서 볼 수 있듯이 행의 길이가 다양할 수 있습니다:

class MultiDimArrayDemo {
    public static void main(String[] args) {
        String[][] names = {
            {"Mr. ", "Mrs. ", "Ms. "},
            {"Smith", "Jones"}
        };
        // Mr. Smith
        System.out.println(names[0][0] + names[1][0]);
        // Ms. Jones
        System.out.println(names[0][2] + names[1][1]);
    }
}

이 프로그램의 출력은 다음과 같습니다:

Mr. Smith
Ms. Jones

마지막으로 내장된 length 속성을 사용하여 배열의 크기를 확인할 수 있습니다. 다음 코드는 배열의 크기를 표준 출력으로 출력합니다:

System.out.println(anArray.length);

 

배열 복사

System 클래스에는 한 배열에서 다른 배열로 데이터를 효율적으로 복사하는 데 사용할 수 있는 arraycopy() 메서드가 있습니다:

public static void arraycopy(Object src, int srcPos,
                             Object dest, int destPos, int length)

두 개의 Object 인수는 복사할 배열과 복사할 배열을 지정합니다. 3개의 int 인수는 소스 배열의 시작 위치, 대상 배열의 시작 위치 및 복사할 배열 요소의 수를 지정합니다.

다음 프로그램인 ArrayCopyDemoString 요소의 배열을 선언합니다. 이 프로그램은 System.arraycopy() 메서드를 사용하여 배열 구성 요소의 후속 배열을 두 번째 배열로 복사합니다:

class ArrayCopyDemo {
    public static void main(String[] args) {
        String[] copyFrom = {
            "Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
            "Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
            "Marocchino", "Ristretto" };
 
        String[] copyTo = new String[7];
        System.arraycopy(copyFrom, 2, copyTo, 0, 7);
        for (String coffee : copyTo) {
            System.out.print(coffee + " ");
        }
    }
}

이 프로그램의 출력은 다음과 같습니다:

Cappuccino Corretto Cortado Doppio Espresso Frappucino Freddo

 

배열 조작

배열은 프로그래밍에서 사용되는 강력하고 유용한 개념입니다. Java SE는 배열과 관련된 가장 일반적인 조작을 수행할 수 있는 메서드를 제공합니다. 예를 들어, ArrayCopyDemo 예제에서는 소스 배열의 요소를 수동으로 반복하고 각 요소를 대상 배열에 배치하는 대신 System 클래스의 arraycopy() 메서드를 사용합니다. 이 작업은 백그라운드에서 수행되므로 개발자는 한 줄의 코드만 사용하여 메서드를 호출할 수 있습니다.

Java SE는 사용자의 편의를 위해 배열 조작(배열 복사, 정렬 및 검색과 같은 일반적인 작업)을 수행하기 위한 몇 가지 메서드를 java.util.Arrays 클래스에서 제공합니다. 예를 들어, 앞의 예제는 ArrayCopyOfDemo 예제에서 볼 수 있듯이 java.util.Arrays 클래스의 copyOfRange() 메서드를 사용하도록 수정할 수 있습니다. 차이점은 java.util.Arrays 메서드를 사용하면 메서드에서 대상 배열이 반환되므로 메서드를 호출하기 전에 대상 배열을 만들 필요가 없다는 것입니다:

class ArrayCopyOfDemo {
    public static void main(String[] args) {
        String[] copyFrom = {
            "Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
            "Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
            "Marocchino", "Ristretto" };
 
        String[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);
        for (String coffee : copyTo) {
            System.out.print(coffee + " ");
        }
    }
}

보시다시피 이 프로그램의 출력은 동일하지만 코드 줄 수는 더 적습니다. copyOfRange() 메서드의 두 번째 매개변수는 복사할 범위의 초기 인덱스이며, 세 번째 매개변수는 복사할 범위의 최종 인덱스이며, 배타적으로 복사합니다. 이 예제에서 복사할 범위에는 인덱스 9에 있는 배열 요소(문자열 Lungo가 포함됨)가 포함되지 않습니다.

java.util.Arrays 클래스의 메서드에서 제공하는 다른 유용한 연산은 다음과 같습니다:

  • 배열에서 특정 값을 검색하여 해당 값이 위치한 인덱스 가져오기(binarySearch() 메서드).
  • 두 배열을 비교하여 같은지 아닌지 확인(equals() 메서드).
  • 배열을 채우기 위해 각 인덱스에 특정 값을 배치합니다(fill() 메서드).
  • 배열을 오름차순으로 정렬하기. 이 작업은 sort() 메서드를 사용하여 순차적으로 수행하거나 Java SE 8에 도입된 parallelSort() 메서드를 사용하여 동시에 수행할 수 있습니다. 다중 프로세서 시스템에서 대규모 배열의 병렬 정렬은 순차 배열 정렬보다 더 빠릅니다.
  • 배열을 소스로 사용하는 스트림 생성(stream() 메서드). 예를 들어, 다음 문은 이전 예제와 동일한 방식으로 copyTo 배열의 내용을 출력합니다:
java.util.Arrays.stream(copyTo).map(coffee -> coffee + " ").forEach(System.out::print);

스트림에 대한 자세한 내용은 집계 작업을 참조하세요.

  • 배열을 문자열로 변환하기. toString() 메서드는 배열의 각 요소를 문자열로 변환하고 쉼표로 구분한 다음 괄호로 묶습니다. 예를 들어, 다음 문은 copyTo 배열을 문자열로 변환하여 인쇄합니다:
System.out.println(java.util.Arrays.toString(copyTo));

이 문은 다음을 출력합니다:

[Cappuccino, Corretto, Cortado, Doppio, Espresso, Frappucino, Freddo]

 

변수 및 배열 마무리

Java 프로그래밍 언어는 용어의 일부로 “필드”와 “변수”를 모두 사용합니다. 인스턴스 변수(비정적 필드)는 클래스의 각 인스턴스마다 고유합니다. 클래스 변수(정적 필드)는 정적 수정자를 사용하여 선언된 필드로, 클래스가 인스턴스화된 횟수에 관계없이 클래스 변수의 복사본은 정확히 한 개만 존재합니다. 지역 변수는 메서드 내부에 임시 상태를 저장합니다. 매개변수는 메서드에 추가 정보를 제공하는 변수로, 로컬 변수와 매개변수 모두 항상 “필드”가 아닌 “변수”로 분류됩니다. 필드나 변수의 이름을 지정할 때 따라야 하는(또는 반드시 지켜야 하는) 규칙과 규칙이 있습니다.

8가지 기본 데이터 타입은 다음과 같습니다: byte, short, int, long, float, double, boolean, char입니다. java.lang.String 클래스는 문자열을 나타냅니다. 컴파일러는 위 타입의 필드에 대해 합리적인 기본값을 할당합니다. 지역 변수의 경우 기본값이 할당되지 않습니다.

리터럴은 고정 값의 소스 코드 표현입니다. 배열은 단일 타입의 고정된 수의 값을 보유하는 컨테이너 객체입니다. 배열의 길이는 배열을 만들 때 설정됩니다. 생성 후에는 길이가 고정됩니다.