Java - 배열은 무엇인가?

김영한님의 Java 강의로 기초다지기 - 배열이란?

Posted by Warner on December 6, 2023

배열이 필요한 이유

같은 타입의 변수를 반복해서 선언하고 반복해서 사용하는 문제를 해결하는 것이 바로 배열이다.

배열의 선언과 생성

int[]students;//1. 배열 변수 선언
students=new int[5]; //2. 배열 생성

1. 배열 변수 선언 Array.png

  • 배열을 사용하려면 int[] students; 와 같이 배열 변수를 선언해야 한다.
  • 일반적인 변수와 차이점은 int[] 처럼 타입 다음에 대괄호 ([])가 들어간다는 점이다.
  • 배열 변수를 선언한다고해서 아직 사용할 수 있는 배열이 만들어진 것은 아니다!
    • int a에는 정수를, double b에는 실수를 담을 수 있다.
    • int[] students와 같은 배열 변수에는 배열을 담을 수 있다.(배열 변수에는 10, 20 같은 값이 아니라 배열이라는 것을 담을 수 있다.)

2. 배열 생성 Array2.png

  • 배열을 사용하려면 배열을 생성해야 한다.
  • new int[5]라고 입력하면 오른쪽 그림과 같이 총 5개의 int형 변수가 만들어진다.
  • new는 새로 생성한다는 뜻이고, int[5]는 int형 변수 5개라는 뜻이다. 따라서 int형 변수 5개를 다룰 수 있는 배열을 새로 만든다는 뜻이다.

배열의 초기화

  • new int[5]라고 하면 총 5개의 int형 변수가 만들어진다. 자바는 배열을 생성할 때 그 내부값을 자동으로 초기화한다.
  • 숫자는0, boolean은 false, String은 null(없다는 뜻이다.)로 초기화 된다.

3. 배열 참조값 보관 Array3.png

  • new int[5]로 배열을 생성하면 배열의 크기만큼 메모리를 확보한다.
  • 배열을 생성하고 나면 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소)(x001)을 반환한다.
  • 앞서 선언한 배열 변수인 int[] students에 생성된 배열의 참조값(x001)을 보관한다.
  • int[] students 변수는 new int[5]로 생성한 배열의 참조값을 가지고 있다.

배열 사용

인덱스 배열은 변수와 사용법이 비슷한데, 차이점이 있다면 다음과 같이 [] 사이에 숫자 번호를 넣어주면 된다. 배열의 위치를 나타내는 숫자를 인덱스(index)라 한다. Array4.png

  • 배열은 0부터 시작한다.

  • 인덱스 허용 범위를 넘어설 때 발생하는 오류

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at array.Array1Ref1.main(Array1Ref1.java:14)

배열의 값 대입

students[0]=90; //1. 배열에 값을 대입
x001[0]=90; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입

배열의 값 읽기

//1. 변수 값 읽기
System.out.println("학생1 점수: "+students[0]);
//2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근
System.out.println("학생1 점수: "+x001[0]);
//3. 배열의 값을 읽어옴
System.out.println("학생1 점수: "+90);

기본형 vs 참조형

자바의 변수 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다. 사용하는 값을 직접 넣을 수 있는 기본형, 그리고 방금 본 배열 변수와 같이 메모리의 참조값을 넣을 수 있는 참조형으로 분류할 수 있다.

  • 기본형(Primitive Type) : int, long, double, boolean처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형(Primitive Type)이라 한다.
  • 참조형(Reference Type) : int[] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형(Reference Type)이라 한다.

참고

배열은 왜 이렇게 복잡하게 참조형을 사용할까?

  • 기본형은 선언과 동시에 크기가 정해진다. 따라서 크기를 동적으로 바꾸거나 할 수는 없다. 반면에 앞서본 배열과 같은 참조형은 크기가 동적으로 할당할 수 있다.
  • 기본형은 사용할 값을 직접 저장한다. 반면에 참조형은 메모리에 저장된 배열이나 객체의 참조를 저장한다. 이로 인해 참조형은 더 복잡한 데이터 구조를 만들고 관리할 수 있다. 반면 기본형은 더 빠르고 메모리를 효율적으로 처리한다.

2차원 배열

지금까지 학습한 배열은 단순히 순서대로 나열되어 있었다. 이것을 1차원 배열이라 한다.
이번에 학습할 2차원 배열은 이름 그대로 하나의 차원이 추가된다. 2차원 배열은 행과 열로 구성된다. DoubleArray.png

2차원 배열은 int[][] arr = new int[2][3]와 같이 선언하고 생성한다. 그리고 arr[1][2]와 같이 사용하는데, 먼저 행 번호를 찾고, 그 다음에 열 번호를 찾으면 된다.

행은 영어로 row(로우), 열은 영어로 column(컬럼)이라 한다.

향상된 for문

향상된 for문을 이해하려면 배열을 먼저 알아야 한다. 각각의 요소를 탐색한다는 의미로 for-each문 이라고도 많이 부른다. 향샹된 for 문은 배열을 사용할 때 기존 for문 보다 더 편리하게 사용할 수 있다.

for (변수 : 배열 또는 컬렉션) {
 // 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
}