여러 데이터를 저장하는 자료형
자동으로 인덱스가 생겨나고 인덱스를 통해 데이터를 조회 할 수 있습니다.
배열은 길이를 정해서 한번 선언하고 나면 길이를 줄이거나 늘릴 수 없습니다.
데이터를 연속적 또는 모아서 저장하고 조회 할때 사용합니다.
배열은 기본적으로 아래 형식으로 선언합니다.
자료형[ ] 배열이름;
또는
자료형 배열이름[ ];
배열이름 = new 자료형[ ] {자료1, 자료2, 자료3....};
배열 선언 방법에는 두가지 방법이 있습니다.
첫번째는 자료를 바로 집어 넣어 데이터와 배열길이를 지정하는 방법 입니다.
중요한 부분은 선언 할때 자료형이 일치해야하고 자료형에 해당하는 데이터만 입력 할 수 있습니다.
int 자료형의 배열 선언과 값을 입력해보겠습니다.
int[ ] array1 = new int[ ] {1, 2, 3, 4, 5}
따로 배열 크기를 입력하지 않아도 입력된 값에 따라 자동적으로 정해집니다.
두번째는 배열과 선언과 함께 초기화하고 인덱스를 통해 데이터를 배열에 입력하는 방법 입니다.
이번엔 선언과 초기화를 한줄에 해보겠습니다.
String[ ] array2 = new String[5];
문자열 자료형, 길이 5의 배열을 선언했습니다.
데이터도 입력해보겠습니다.
인덱스는 0부터 시작하기 때문에 0부터 4까지 인덱스를 사용하여 값을 넣을 수 있겠네요.
array2[0] = "value1";
array2[1] = "value2";
아래 코드를 한번 실행시켜 볼까요?
array2의 값을 출력해보겠습니다.
값을 조회 할때도 배열이름[index]를 통해 해당 값을 조회 할 수 있습니다.
public class MainClass {
public static void main(String[] args) {
// 배열 선언하기
int[] array1 = null;
// 배열에 값 넣기
arr1 = new int[] {1, 2, 3, 4, 5};
// 배열 선언과 크기 초기화 하기
String[] array2 = new String[5];
// 배열에 값 입력하기
array2[0] = "value1";
array2[1] = "value2";
System.out.println(array2[0]);
System.out.println(array2[1]);
System.out.println(array2[2]);
}
}

입력값이 잘 출력되는 것을 확인 할 수 있고, index 2는 메모리는 할당 되었으나 값을 입력해주지 않아서 null로 출력 되는 것을 볼 수 있습니다.
그럼 배열을 하나씩 출력하지 않고 한번에 조회 할 수 없을까요?
잘 모르겠지만 왠지 인덱스를 지정하지 않고 배열명만 println에 넣으면 다 출력 될 것 같습니다.
(println(array2); 와 println(array2.toString()); 모두 출력값 동일)
한번 결과를 볼까요?

뭔가 이상합니다. 배열 전체가 나열 될 줄 알았는데 이상한 문자열이 출력되었습니다.
하나씩 살펴보면
[Ljava.lang.String;@
[ : 배열을 나타냅니다.
L : 참조형 타입(자료형)을 의미 합니다. array2는 String 배열을 선언하였는데 String은 값을 Heap 영역에 저장하고 주소 값을 가지고 있는 참조형 입니다.
java.lang.String : String 클래스의 배열을 의미합니다.
@ : 메모리 주소값을 나타내는 식별자 입니다.
22f71333 : 메모리의 주소값 입니다.
즉 String 배열의 주소값이 출력되었네요.
왜그럴까???????????
배열이름은 배열의 주소 값이다.
배열 데이터는 Heap 영역 메모리공간에 저장하고 필요할 때마다 찾아가서 조회 합니다.
이때 주소값은 Stack 영역에 저장됩니다.
배열을 선언하면서 배열명을 지정해주었잖아요?
배열명이 의미하는 바는 해당 배열의 주소 값 입니다.
따라하세요.
배열 이름은 배열의 주소 값이다.
배열 이름은 배열의 주소 값이다.
배열 이름은 배열의 주소 값이다.
그렇기 때문에 배열이름을 println로 출력하면 배열의 주소 값이 출력되는 것 입니다.
저는 배울 때 이런생각이 들었어요. 왜 이딴 식으로 이루어져 있을까?
그냥 변수처럼 배열명을 쓰면 모든 값을 조회 할 수 있게끔하면 얼마나 편리 할까?
한번 좁은 주방의 요리사가 되어 요리도구에 비교 해보겠습니다.
요리를 할 때 작업대 크기는 한정되어 있습니다.
집게, 가위, 젓가락, 스푼 이런 작은 도구들은 크기가 작기 때문에 수저통에 모아서 작업대에 항상 있어도 크게 불편하지 않습니다.
근데, 오븐이나, 제면기, 가마솥이 필요하다면 어떡할까요?
그래도 언젠가 필요하니까 싱크대에 모두 올려둘까요?
사용하지 않을 때는 좁아진 작업대를 쓰느라 불편하고 다른 도구들을 밀칠 수도 있겠네요.
그래서 큰 요리도구들은 선반, 넓은 공간에 보관하고 필요할 때마다 꺼내오거나, 가서 사용하는게 더 효율적일 것 입니다. 다만 해당 도구가 어디있는지 메모를 해둔채로요.
배열도 크기가 작을 수도 있지만 큰 배열을 만들어야 할 수도 있기 때문에 실제 데이터는 Heap 영역에 저장하고 해당 값의 위치를 Stack 영역에 저장합니다.
배열 전체를 한번에 출력하는 방법은 크게 두가지 입니다.
- 배열을 반복문 사용하여 출력하기
- Arrays.toString(배열이름) 사용하기
아래 두 출력 방법에 대한 코드와 결과 값 입니다.
import java.util.Arrays;
public class TestClass {
public static void main(String[] args) {
// 배열 선언하기
int array1[] = {1, 2, 3, 4, 5};
for (int i = 0; i < array1.length; i++) {
System.out.println("array1 for 반복문 사용하기 : " + array1[i]);
}
System.out.println("array1 Arrays.toString()사용하기 : " + Arrays.toString(array1));
}
}
결과 값

for 문에서 i 반복 길이를 숫자를 직접 명시해주어도 되지만 배열 길이를 의미하는 .length를 사용하여 지정해주었습니다.
length()와 .length 가 자꾸 헷갈리기 때문에 간단하게 한번 적어보겠습니다.
length : 배열의 길이를 구할 때.
length() : 문자열의 길이를 구할 때.
int array1[] = {1, 2, 3, 4, 5};
System.out.println(array1.length); // 5 출력
String word1 = "KIMOTTI"
System.out.println(word1.length()); // 7 출력