Java:Array

aiden·2023년 8월 18일

Java

목록 보기
4/30

Array

배열은 여러 데이터를 한번에 저장하기 위한 자료구조라고 할 수 있다. 배열을 사용하면 각각의 변수를 생성할 필요가 없으며 데이터를 함께 저장할 수 있을 뿐만 아니라 인덱스를 통한 순차적 접근이 가능해진다.
한 배열에 저장할 데이터들의 자료형은 동일해야 한다.

배열의 선언과 생성

c언어에서는 배열 생성 시 자료형, 배열의 이름, 배열의 길이를 기재해 배열을 선언과 동시에 생성했었다.

int arr[5]; //배열 생성

자바에서의 배열 생성 과정은 c와는 다르게 레퍼런스 변수를 선언한 후 변수에 배열을 동적으로 할당한다.

int arr[]; //또는 int [] arr;
		   //배열에 대한 레퍼런스 변수 선언
arr = new int[5]; //레퍼런스 변수에 배열 생성

레퍼런스 변수 선언 시에는 배열 공간이 할당되지 않는다. 아직 변수에 값을 대입하지 않았으므로 레퍼런스 변수의 값은 null이다.

❗자바에서 배열 선언 시 크기를 지정하면 안됨을 주의

new 연산자를 통한 배열 생성 과정이 있어야 배열 공간이 할당된다. 이 때에 배열의 크기를 지정한다.

배열을 선언과 동시에 생성하려는 경우 다음과 같이 작성한다.

int arr[] = new int[5];

다음과 같이 new 연산자를 사용하지 않고 선언과 동시에 초기화할 수 있다.

int arr[] = {1, 2, 3, 4, 5};

이 때 배열의 크기는 데이터 개수에 따라 자동으로 정해지므로 작성해서는 안된다.
배열의 크기가 결정되면 이후 변경할 수 없다.

배열 인덱스와 원소 접근

배열 인덱스는 0부터 시작한다. 음수 인덱스는 사용 불가하며 배열 레퍼런스만 선언하고 배열 공간은 생성하지 않은 경우 인덱스를 사용할 수 없다.

레퍼런스 치환

자바에서 여러 레퍼런스 변수를 통해 배열 공간을 공유할 수 있다.

레퍼런스 변수를 선언하고 배열 공간을 할당한 상태에서 새로운 레퍼런스 변수에 동일한 배열 공간을 참조하도록 하였다. 위의 상황에서 두 변수는 하나의 배열을 가리키게 된다. 배열이 복사되는 것이 아니라, 배열에 대한 주소만 복사된다.

다음과 같이 공유 중인 하나의 배열을 여러 변수를 통해 접근할 수 있다.

배열의 크기

자바에서의 배열은 객체이다. 배열 객체는 length 필드(속성)이 존재하는데, 이는 배열의 크기 정보를 저장하고 있는 변수이다.
다음과 같이 접근한다.

int arr[] = new int[5];
int size = arr.length;

for-each

for-each문을 통해 배열 원소에 순차접근할 수 있다. 다음과 같은 구조를 갖는다.

변수 부분에는 배열에 저장된 데이터의 자료형과 변수 이름이 들어간다. 다음 예시들을 살펴보자.

정수 배열 예시

문자열 배열 예시

다차원 배열

다차원 배열 또한 레퍼런스 변수 선언 후 배열을 생성한다.

2차원 배열

2차원 배열의 레퍼런스 변수는 다음과 같이 선언한다.

int arr[][]; //또는 int [][]arr;

배열 공간 생성 시에는 new 연산자를 이용한다.

arr = new int [3][3];

다음과 같이 new 연산자를 사용하지 않고 선언과 동시에 초기화할 수 있다.

int arr[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}

이 때, length는 다음과 같은 의미를 가진다.

arr.length -> 배열의 행의 수
arr[0].length -> 배열의 0번째 행의 열의 수

비정방형 배열

자바에서는 각 행마다 다른 열의 길이를 가진 비정방형 배열을 생성할 수 있다.

비정방형 배열은 다음과 같이 행의 길이만 기재하고 열의 길이는 비워둔 채 각 행을 따로 생성해준다.

int arr[][] = new int[4][];

arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[4];

이 경우 각 행의 열의 길이는 다르게 저장된다.

비정방형 배열을 선언과 동시에 초기화하려면 다음과 같이 작성한다.

int arr[][] = {{1}, {1, 2}, {1, 2, 3},{1, 2, 3, 4}}

다음 예시를 보자.

public class Practice {
    public static void main(String[] args){
        int arr[][] = new int[4][];
        arr[0] = new int[1];
        arr[1] = new int[2];
        arr[2] = new int[3];
        arr[3] = new int[4];

        int num = 0;
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[i].length; j++)
                arr[i][j] = num++;
        }

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

0
1 2
3 4 5
6 7 8 9

배열 리턴

메소드에서 배열을 리턴하는 경우, 배열 공간 자체를 리턴하는 것이 아닌 배열에 대한 레퍼런스를 반환한다.
리턴 타입 선언 시 배열의 크기를 지정하지 않는다.

다음은 함수로부터 리턴된 배열을 변수에 저장하는 과정이다.

2차원 배열도 동일하게 배열의 크기를 지정하지 않고 레퍼런스로 받으면 된다.

main()

지금까지 main() 메소드 작성 시 매개변수로 main(String[] args)라는 문자열 배열을 전달했었다. 이는 명령으로 입력된 인자를 문자열 배열로 만들어 메소드에 전달하기 위함이다.
커맨드 라인에서 자바 클래스 실행 시 인자를 전달할 수 있다.

profile
파인애플 좋아하세요?

0개의 댓글