자바의 배열
배열은 같은 유형의 변수들을 사용하기 편하도록 하나로 묶은 것을 말합니다. 배열은 힙(Heap)영역에 생성되면 배열의 변수는 스택(Stack)영역에 저장되어 해당 배열의 참조값을 가지고 있게 됩니다.
배열을 사용하는 이유
먼저 배열을 사용하는 이유에 대해서 알아봅시다. 변수는 하나의 값만 저장할 수 있습니다. 만약 저장 하고 싶은 데이터의 수가 적으면 상관이 없겠지만, 수가 굉장히 많아지면 그 수만큼 비례한 변수가 필요하게 됩니다. 따라서 코드의 양이 굉장히 많아지게 되는 문제점이 발생하게 됩니다.
예를 들어, 학생 20명의 데이터를 저장하고 싶다고 한다면, 먼저 20개의 변수를 선언해서 코드를 입력해야 합니다.
int student1Score = 90;
int student2Score = 81;
int student3Score = 82;
int student4Score = 75;
int student5Score = 92;
//중략
int student20Score = 87;
위처럼 같은 유형의 변수들을 20번씩 선언해서 일일이 값을 대입해야 합니다. 만약 학생 수가 10명 더 늘어난다면, 10개의 변수를 추가로 더 선언을 해주어야 합니다.
이렇게 같은 유형의 변수를 반복해서 선언하고 사용할 때의 문제점을 해결해 주는 것이 배열입니다.
배열의 선언과 생성 방법
배열을 사용하기 위해서는 먼저 기본형 변수처럼 배열 변수를 선언해 주어야 합니다. 배열 선언은 다음과 같이 두 가지 방법으로 선언이 가능합니다.
int[] array;
//타입[] 변수명
int array[];
//타입 변수명[]
보통 첫 번째 방식이 자주 사용됩니다.
일반적인 변수와 다르게 배열 변수는 [](대괄호)가 추가됩니다.
배열은 같은 타입의 변수들만 저장이 가능하기 때문에 배열도 타입별로 선언을 해주어야 합니다.
int [] 배열에는 int형 변수나 정수들만, String [] 배열에는 String형 변수나 문자열들만 저장할 수 있습니다.
이렇게 배열 선언을 하고 나면 배열 생성을 해주어야 사용이 가능합니다. 배열 생성 방법에도 두 가지 방법이 있습니다. 먼저 첫 번째 방법에 대해서 알아보겠습니다.
int[] array = {13,764,19};
//3칸의 길이를 가진 배열 생성
//int 변수 3개를 선언한 것과 같은 효과
위와 같이 배열 선언과 동시에 중괄호 안에 값들을 넣어주어서 해당 배열의 길이와 값들을 저장합니다.
int형 변수 3개를 선언한 것과 동일한 효과를 가집니다. 따라서 크기도 동일합니다.
이 방법을 사용할 때 주의할 점은, 선언과 동시에 초기화를 해주지 않으면 중괄호 하나만으로 값을 대입할 수는 없습니다.
int[] array;
array = {13,764,19}; // 컴파일 오류 발생
메서드의 매개 변수를 통해 배열의 값을 넣어 줄 때도 마찬가지로 컴파일 오류가 발생하게 됩니다.
public void callArray(int[] array) { ... }
callArray({13,77,17}); // 컴파일 오류 발생
위 두 가지 경우처럼 배열을 선언한 시점과 값을 대입하는 시점이 다르다면 new 연산자와 [](대괄호)를 중괄호 앞에 붙여서 작성한다면 대입이 가능합니다.
int[] array;
array = {13,764,19}; // 컴파일 오류 발생
array = new int[] {13,764,19}; // 에러 발생하지 않음
public void callArray(int[] array) { ... }
callArray({13,77,17}); // 컴파일 오류 발생
callArray(new int[] {13,77,17}); // 에러 발생하지 않음
값을 미리 지정하지 않고 배열의 길이만 미리 설정해서 선언할 수 있습니다.
int[] array = new int[5]; //배열 생성
//타입 변수명 = new 타입[배열의 길이];
int[] array = {0,0,0,0,0}; //위와 동일함
new int [5]라고 입력하게 되면 총 5칸의 길이를 가진 배열이 생성됩니다. 따라서 int 형 변수 5개를 다룰 수 있는 배열을 생성하게 됩니다. 이 경우 생성된 배열 내부에는 기본적인 초기값이 저장되게 됩니다. int형 배열에는 0의 초기값이 저장되므로, 모든 배열의 저장 공간에는 0의 값이 저장됩니다.
데이터 타입에 따른 초기값은 다음과 같습니다.
데이터 타입 | 초기값 | |
기본타입 | byte[] char[] short[] int[] long[] |
0 '\u0000' 0 0 0L |
float[] double[] |
0.0F 0.0 |
|
boolean[] | false | |
참조 타입 | 클래스[] 인터페이스[] |
null null |
배열 사용
인덱스(index)
배열에 저장된 값에 접근하기 위해서는 배열 변수명에 더해서 [](대괄호) 내부에 숫자 번호를 입력해서 접근합니다. 배열의 위치를 나타내는 숫자를 인덱스(index) 번호라고 합니다. 사용 방법은 다음과 같습니다.
//배열 선언
int[] array = new int[3];
//값 대입
array[0] = 15; //인덱스 번호0
array[1] = 17; //인덱스 번호1
array[2] = 18; //인덱스 번호2
//값 접근
System.out.println(array[2]); //18 출력
new int [3]와 같이 배열을 생성하게 되면 3개의 길이를 가진 배열이 생성됩니다. 인덱스 번호도 이에 맞춰서 1부터 시작해 3으로 끝날 것 같지만, 0부터 시작해서 2로 끝나게 됩니다. 따라서 원하는 위치의 인덱스에 접근하기 위해서는 n-1의 번호로 접근해야 합니다.
만약 array [3]처럼 인덱스 범위를 넘어선 값에 접근할 경우 ArrayIndexOutOfBoundsException오류가 발생합니다.
배열에 값 대입
배열 내부에 값을 초기화하거나 대입할 때도 일반적인 변수에 값을 대입하는 것과 동일합니다. [](대괄호) 안에 인덱스 번호만 추가하여 원하는 인덱스에 대입할 수 있습니다.
System.out.println(array[0]); //15 출력
array[0] = 1;
System.out.println(array[0]); //1 출력
for문을 활용한 배열 사용
for문을 활용해서 배열을 좀 더 효율적으로 사용할 수 있습니다. 다음의 예시를 보겠습니다.
//배열 선언
int[] array = {1,3,5,7,9};
//배열 출력
System.out.println("배열의 0 번째 인덱스 : " + array[0]);
System.out.println("배열의 1 번째 인덱스 : " + array[1]);
System.out.println("배열의 2 번째 인덱스 : " + array[2]);
System.out.println("배열의 3 번째 인덱스 : " + array[3]);
System.out.println("배열의 4 번째 인덱스 : " + array[4]);
위와 같이 배열의 값을 하나하나 출력하기 위해서 배열의 길이만큼 출력 코드를 작성해 주었습니다. 만약 배열의 길이가 10000개라면? 10000줄의 코드를 작성해야 합니다. 하지만 for문을 활용한다면 어떤 크기의 배열이든 3줄로 작성을 완료할 수 있습니다.
//배열 선언
int[] array = {1,3,5,7,9};
//for문 작성
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]); //배열 출력
}
array.length를 활용해서 해당 변수에 저장된 배열의 길이의 값을 가져올 수 있습니다. 따라서 위 array는 5의 길이를 가지므로 array.length의 값은 5를 가지게 됩니다. 따라서 for문은 5번 반복하게 되며, i의 초기값이 0이므로 0번째 인덱스부터 마지막 인덱스까지 차례로 출력을 진행합니다.
향상된 for문
앞서 활용한 for문과는 다르게 배열의 활용을 좀 더 편리하게 처리할 목적으로 다음과 같이 조건식과 증감식을 쓰지 않고서도 for문 사용이 가능합니다.
//배열 선언
int[] array = {1,2,3,4,5};
//일반적인 for문
for (int i = 0; i < array.length; i++ {
System.out.println(array[i]);
}
//향상된 for문
for (int num : array) { // (초기화 식 : 배열명)
System.out.println(num); // 실행문
}
num이라는 변수에 자동으로 array [0]의 값을 대입하고, 이후 실행문으로 num의 값을 출력한 후 다시 num에 array [1]의 값을 대입합니다. 이후 마지막 인덱스까지 자동으로 for문이 실행하고, 출력한 후 종료합니다.
향상된 for문은 배열과 컬렉션을 활용할 때만 사용이 가능합니다.
만약 인덱스 번호를 직접 활용하고 싶다면 향상된 for문은 사용하지 못하고 일반 for문을 사용해야 합니다.
2차원 배열
2차원 배열은 말 그대로 하나의 차원 추가된 배열을 의미합니다. 배열 내부에 또 다른 배열에 접근해서
2차원 배열을 선언하고 접근하는 방식은 다음과 같습니다.
//2차원 배열 선언과 생성 방법1
int[][] array = new array[2][3];
//2차원 배열 선언과 생성 방법2
int[][] array = {
{1,2,3}, //1행 선언
{4,5,6}, //2행 선언
{7,8,9}, //3행 선언
}
//2차원 배열 값 접근
int num = array[1][3]; //1행의 3열에 접근 = 3을 저장
System.out.println(num); //출력 결과 3
수학에서의 행렬과 같이 2차원 배열도 같은 구조로 이루어져 있습니다. 행을 영어로(row), 열을 영어로 (column)이라고 합니다.
첫 번째 방법을 사용할 경우 기존 배열 선언과 마찬가지로 배열의 크기만 먼저 설정해 주게 됩니다. 첫 번째 대괄호에는 행의 수를 입력하고, 두 번째 대괄호에는 열의 수를 입력해서 배열의 전체적인 크기를 설정합니다.
두 번째 방법을 사용하면 중괄호 내부에 또 다른 중괄호들의 개수로 행의 개수를 설정하고, 중괄호들의 내부의 데이터 수만큼 열의 개수를 설정해 주게 됩니다.
'Backend > Java' 카테고리의 다른 글
자바의 객체 지향 프로그래밍 (0) | 2024.05.30 |
---|---|
자바의 상속(inheritance) (0) | 2024.03.02 |
자바의 final (0) | 2024.02.28 |
자바의 생성자(constructor) (0) | 2024.02.19 |
자바의 패키지(package) (2) | 2024.02.16 |
댓글