배열이라는 이름만 들어도 벌써 이과스러운 냄새가 난다.
하지만 코딩이라는 세계에서는 핵심적인 부분이자,
그만큼 앞으로 자주 만나게 될 문법이다.
이번 포스팅에서는 배열에 대해 알아보자.
배열 (= Array)
프로그래밍에서 배열이란, 동일한 타입의 여러 변수를 하나의 묶음으로 만들고
그것을 하나의 변수로써 다루는 것이라 말할 수 있다.
또, 배열은 차원을 가지고 있다는 특징이 있다.
● 1차원 배열의 표현 예시
i[0] | i[1] | i[2] | i[3] | i[4] |
● 2차원 배열의 표현 예시
1열 | 2열 | 3열 | 4열 | 5열 | |
1행 | i[0][0] | i[0][1] | i[0][2] | i[0][3] | i[0][4] |
2행 | i[1][0] | i[1][1] | i[1][2] | i[1][3] | i[1][4] |
위 처럼 배열을 차원으로 표현할 수 있는데,
이를 index(인덱스 = 색인)라 한다.
인덱스는 배열에 담긴 데이터를 식별하기 위해 사용된다.
배열에 담긴 데이터의 위치를 인덱스 값이라고 부르기도 한다.
★ 모든 배열의 인덱스 값은 0부터 시작한다.
배열을 사용하는 이유
가장 근본적인 이유는 데이터의 효율적인 관리라고 말할 수 있다.
우리는 앞으로 수 많은 데이터를 다뤄야 할 것이다.
배열은 그 데이터를 다룰 때의 번거로움을 최소화해주고,
체계적으로 다룰 수 있도록 해준다.
예를 들어, 100명의 고객에 대한 데이터를 저장한다고 가정하겠다.
int client1, client2, client3 ... client100;
배열을 사용하지 않는다면, 위와 같이 100개의 정수형 변수를 작성해야 할 것이다.
100명이 아닌, 1000명~10000명이 넘어간다면, 더욱 번거로울 것이다.
우리는 배열을 사용함으로써, 효율적으로 코드를 작성할 수 있게 되었다.
int[] client = new int[100];
위 처럼, 하나의 변수에 100개의 정수형 데이터를 저장할 수 있는 배열을 생성해 줄 수 있다.
위와 같이 배열을 생성했다면, 다음과 같은 구조를 가지고 있을 것이다.
배열을 생성만 해주었을 뿐, 데이터를 넣지 않았기 때문에
100개의 자리만 만들어져 있다고 생각하면 된다.
값이 모두 0으로 표시된 이유는, 정수형 자료형의 default 값이 0이기 때문이다.
(String 이었다면 null 로 표시된다)
배열 선언
배열을 선언하는 방법으로는 3가지가 있다.
int[] a; //1
int []b; //2
int c[]; //3
1차원 배열을 이용할 때는 3가지 방법 모두 사용 가능하다.
하지만, 2차원 배열을 이용할 때는 첫 번째 방법만 사용 가능하다.
따라서 첫 번째 방법을 주로 사용할 것을 권장한다.
배열의 선언과 초기화 / 값 넣어주기
배열의 선언과 초기화를 동시에 할 때는 다음과 같다.
int[] a = new int[3]; // 사이즈가 3인 배열 초기화
초기화 할 때, 대괄호 안에 배열의 크기를 작성해주면 된다.
이제, 초기화한 배열에 값을 넣어보자.
a[0] = 5;
a[1] = 10;
a[2] = 15;
위와 같이, 배열에 값을 넣을 때는 대괄호 안에 해당 인덱스 값을 작성해준다.
도입부에서 언급했지만, 모든 배열의 인덱스 값은 0부터 시작한다.
따라서 배열의 사이즈가 3이라면 a[0], a[1], a[2] 로 작성해야 한다.
만약 a[3] 을 작성했다면, 콘솔창에서 "out of bounds for length" 에러를 만나게 될 것이다.
(배열의 크기 범위를 벗어났다)
배열 초기화와 동시에 값 넣어주기
이제, 배열을 초기화 할 때, 값을 바로 넣어주는 방법을 알아보자.
int[] b = {10, 20, 30};
new 연산자를 작성하지 않고, 위 처럼 값과 사이즈를 동시에 완성할 수 있다.
배열 출력하기
배열을 출력하는 방법은 2가지로 나눌 수 있겠다.
배열을 통째로 출력하는 방법과,
배열에 담긴 해당 인덱스 값의 데이터를 출력하는 방법이다.
먼저 배열을 통째로 출력하는 방법은 다음과 같다.
// 3의 크기를 가진 배열 선언 및 초기화
int[] a = new int[3];
// 배열의 인덱스 값을 이용해 데이터 입력
a[0] = 5;
a[1] = 10;
a[2] = 15;
// 배열 출력
System.out.println(Arrays.toString(a));
위에서 사용했던 예제를 이어서 작성하였다.
출력하는 부분에 있는 Arrays.toString() 함수만 기억하면 된다.
출력 결과는 다음과 같다.
해당 배열의 인덱스를 그대로 출력해준다.
이제, 인덱스 값에 담긴 데이터를 출력해보자.
// 3의 크기를 가진 배열 선언 및 초기화 (값 직접 입력한 케이스)
int[] b = {10, 20, 30};
// 해당 인덱스 값의 데이터 출력
System.out.println(b[0]);
System.out.println(b[0] + " " + b[1] + " " + b[2]);
// 반복문을 활용한 인덱스 값의 데이터 출력
for (int i=0; i<b.length; i++) {
System.out.print(b[i] + " ");
}
큰 따옴표와 공백은(" ") 콘솔창의 가독성을 위해 작성하였으니,
중요하게 보지 않아도 된다.
반복문 (for 문)의 조건식을 보면, length 라는 코드가 있는데,
해당 배열의 길이를 나타내준다.
(정말 유용한 친구이니, 기억해두자)
출력 결과는 다음과 같다.
인덱스가 아닌, 데이터만을 출력해주는 모습이다.
2차원 배열
도입부에서 2차원 배열의 인덱스를 표현했었다.
위 처럼, 2차원 배열은 테이블 또는 표처럼 표현 할 수 있다.
2차원 배열의 선언과 초기화는 1차원 배열과 크게 다르지 않다.
// 1번
int[][] a = new int[2][3];
// 2번
int[][] b = {{1,2,3}, {4,5,6}};
① 배열의 사이즈만 지정한 선언 및 초기화
첫 번째 대괄호는 '행' 을 나타내고,
두 번째 대괄호는 '열' 을 나타낸다고 생각하면 된다.
따라서 2행 3열을 가진 2차원 배열을 생성했다.
② 배열의 사이즈와 값까지 입력한 선언 및 초기화
1번과 다른 점은, 값이 입력되었다는 것뿐이다.
마찬가지로, 2행 3열을 가진 2차원 배열을 생성했다.
이제 배열을 통째로 출력해보자.
int[][] a = new int[2][3];
int[][] b = {{1,2,3}, {4,5,6}};
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
1차원 배열과 마찬가지로, Arrays.toString() 함수를 사용했다.
출력 결과는 다음과 같다.
엉뚱한? 문자열이 출력된 것을 확인할 수 있다.
위 데이터는 메모리에 올라가 있는 해당 배열의 주소값이다.
우리는 지금 메모리 주소값이 궁금하지 않다.
2차원 배열을 통째로 출력하고 싶을 때는
Arrays.deepToString() 함수를 사용하면 된다..!
int[][] a = new int[2][3];
int[][] b = {{1,2,3}, {4,5,6}};
System.out.println(Arrays.deepToString(a));
System.out.println(Arrays.deepToString(b));
Arrays.toString() >> Arrays.deepToString()
함수를 위처럼 수정해주자.
출력 결과는 다음과 같다.
의도한 대로, 인덱스가 잘 출력된 것을 확인하였다.
이제 1차원 배열과 마찬가지로, 인덱스 값으로 데이터를 출력해보자.
int[][] b = {{1,2,3}, {4,5,6}};
System.out.println(b[1][2]);
이해를 돕기 위해, 아래 인덱스를 참고하며 보자.
1열 | 2열 | 3열 | |
1행 | b[0][0] - 1 | b[0][1] - 2 | b[0][2] - 3 |
2행 | b[1][0] - 4 | b[1][1] - 5 | b[1][2] - 6 |
벌써 3번째 반복 언급하지만, 인덱스 값은 항상 0부터 시작하므로,
위 예제에서 b[1][2] 로 작성한 실제 위치는 2행 3열이다.
출력 결과는 다음과 같다.
예상대로, 2행 3열에 있는 6이 출력된 것을 확인할 수 있다.
이번 포스팅에서는 배열의 기초적인 부분에 대해 알아보았다.
수학적인 방향으로 머리를 써본 적이 없는 본인은,
배열을 처음 접할 때 상당한 거부감을 느꼈었다.
하지만 막상 부딪쳐보니, 크게 어려울 부분은 없었던 것 같기도 하다.
이어지는 다음 포스팅에서는 ArrayList 에 대해 알아보겠다.
'Java (자바)' 카테고리의 다른 글
[Java] 변수 타입 확인하기 / 자료형 구분하기 / String int (1) | 2022.10.05 |
---|---|
[Java] 배열 Array (2) - ArrayList / ArrayList 메서드 (0) | 2022.09.28 |
[Java] 조건문 - switch case 문 / if, switch 차이점 (0) | 2022.09.27 |
[Java] 접근 제한자 - public/protected/default/private (0) | 2022.07.09 |
[Java] Thread (3) - 스레드 정지, 멈춤, 제어 / stop(), interrupt() (1) | 2022.07.08 |