Java 배열

​컴퓨터 과학에서 배열이란 번호와 번호에 대응하는 데이터들로 이루어진 자료 구조이다.

배열의 형태는 그림과 같다.
int형으로 선언된 변수 x가 4개의 배열로 구성되어있다.
index 해당 배열의 값을 접근할 수 있도록 해준다.
value 는 x[index(0)] 은 10이 담겨 있고, x[index(1)] 은 20이 담겨 있다.
bit 는 배열이 차지하는 메모리 공간이다. 선언된 int 형 변수는 4바이트를 차지하고, 배열을 4개로 구성하였으니 4x4=16바이트 메모리를 차지하게 된다.

💡
2차원, 3차원 배열은 중간 값으로 Padding이 있으니 메모리 관리가 필요한 경우 주의하도록 한다.

Java 사람의 키를 입력하고 출력하는 코드를 만들기

배열을 활용한 예제.

3명의 사람이 있고 각각의 키를 입력하여 콘솔로 출력한다.

Java 코드 작성

public class PeoplesHeight {
    public static void main(String[] args) {
        int[] peopleHeight;
        peopleHeight = new int[3];

        peopleHeight[0] = 156;
        peopleHeight[1] = 172;
        peopleHeight[2] = 167;

        System.out.println("첫 번째 사람의 키: " + peopleHeight[0]);
        System.out.println("두 번째 사람의 키: " + peopleHeight[1]);
        System.out.println("세 번째 사람의 키: " + peopleHeight[2]);
    }
}

출력 예시

첫 번째 사람의 키: 156
두 번째 사람의 키: 172
세 번째 사람의 키: 167
  • int[] peopleHeight; 배열의 변수를 선언한다.
    • 배열을 사용할 때 변수를 선언해야한다.
    • 변수 앞에 int[] 괄호를 붙어줘야 한다.
    • 선언 된 배열은 바로 사용할 수 없다. 배열 생성이 필요하다.
  • peopleHeight = new int[3]; 배열을 생성한다.
    • new 뜻은 새로 생성하고, new int[3] 라고 입력해야 괄호의 숫자만큼 int형 변수가 만들어진다.
    • 생성한 int[3] 배열은 peopleHeight 변수로 참조하도록 한다.
    • new int[3]; 배열을 생성하면 자동으로 초기화를 해주는데 int 형 값은 숫자 0으로 초기화 된다.
💡
일반 int a; 변수 선언 시 a의 값은 초기화가 안되어 값을 알 수 없지만, 배열 new int[3] 생성 시 자동으로 초기화를 해준다.

배열 참조 타입

  • 배열의 타입은 Reference Type 참조형 변수이다. 메모리에 간접 접근한다.
    • 다른 일반 변수 int, long, double은 Primitive Type 기본형으로 메모리에 직접 접근한다.
    • 참조형 변수는 기본형 변수와 다르게 접근 해야 한다.
  • 배열 new int[3] 를 생성하면 자바는 이 배열을 접근할 수 있는 메모리 주소를 반환한다. 이때 생성된 배열의 주소는 x10f87f48 이라고 값이라고 가정한다.
    • 이 상태에서는 int 형 변수 3개를 만들 뿐, 이름이 없기 때문에 접근 방법이 필요하다.
  • 배열이라고 선언한 int[] peopleHeight 변수로 참조값(배열의 주소)을 x10f87f48 할당한다.
    • 이제 변수 int[] peopleHeight 는 참조값을 통해 메모리에 담겨 있는 x10f87f48 배열로 접근하여 사용할 수 있다.
public class Array {
    public static void main(String[] args) {
        int[] peopleHeight;
        peopleHeight = new int[3];

        System.out.println("배열의 참조 값: " + peopleHeight);

    }
}

출력

배열의 참조 값: [I@10f87f48
  • [I 는 int형 뜻이다.
  • 10f87f48 는 배열의 참조하고 있는 주소 값이다.

배열 사용

배열을 선언하고, 생성하여 참조까지 완료하였다면 이제 사용해보도록 한다.
int[] people;
people = new int[4];

참조 그림

배열 Index

배열 4개의 요소로 생성하였다면 index는 0, 1, 2, 3 이 존재하고 배열은 0부터 시작한다. 배열 인덱스의 범위는 0 ~ (n-1)으로 n이 4개이고 하나를 빼면 인덱스 3까지 사용할 수 있다. 인덱스 3은 int[4]의 마지막 요소이다.

이제 인덱스로 배열안에 값을 할당해보도록 한다.

int[] people;
people = new int[4];

people[0] = 5;
people[1] = 2;

아래 그림과 같이 people의 첫 번째 요소의 값을 5를 넣었으며, 두 번째 요소는 2를 넣었다.

값을 할당하였으니 해당 people[0] 첫 번째 요소의 값을 접근해서 사용한다.

System.out.println("첫 번째 리뷰 점수 " + people[0]);

빌드 한 경우 다음과 같이 출력한다.
첫 번째 리뷰 점수 5

동적 런타임

배열은 참조형 변수로 런타임에 접근하여 동적으로 크기를 정할 수 있다.

int size = 100;
int[] people;
people = new int[size]; // 이 코드를 접근할 시점에 size 값에 따라 크기가 정해 진다.
  • 코드에서는 size = 100 리터럴로 할당했지만,
    만약 멤버변수 또는 매개변수 Parameter로 접근하는 방식으로 활용하면 배열을 실행할 시점에 크기가 정해 진다.

일련의 공간을 이용해서 값을 할당하고 접근하는 배열을 활용해보는 것을 확인하였다.

트러블슈팅

  • java: incompatible types: int cannot be converted to int[]
    • 배열 값 할당 당시 people = 1; 요소의 인덱스 누락으로 발생하는 에러이다.
  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 4
    • length 길이가 4번째 까지인데 6번째 값을 할당하여 발생하는 문제이다.
    • 코드 예: people = new int[4]; people[6] = 5; // 6번째 값 할당