Chapter 5 배열

Jun-hee Cho·2023년 3월 24일
0

Java

목록 보기
6/13

1. 배열(Array)

1.1 배열(array)이란?

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

여기서 중요한 것은 '같은 타입'이어야 한다는 것이며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.

1.2 배열의 선언과 생성


배열의 생성

타입[] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성(실제 저장공간을 생성)

1.3 배열의 길이와 인덱스

생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 우리가 변수의 이름을 지을 때 score1, score2, score3과 같이 번호를 붙이는 것과 비슷하다고 할 수 있다. 다만 인덱스는 1이 아닌 0부터 시작한다.

인덱스의 범위는 0부터 '배열길이 - 1'까지.

예를 들어 길이가 5인 배열은 모두 5개의 요소(저장공간)을 가지며 인덱스의 범위는 1부터 5까지가 아닌 0부터 4까지, 즉 0, 1, 2, 3, 4가 된다.

int[] score = new int[5];

score[3] = 100; // 배열 score의 4번째 요소에 100을 저장한다.
int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장.

배열의 길이

타입[] 배열이름 = new 타입[길이];
int [] arr = new int[5]; // 길이가 5인 int배열

배열의 길이가 0일 수도 있다.

배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다.

배열이름.length
위의 코드에서 배열 arr의 길이가 5이므로 arr.length의 값 역시 5가 된다. 배열은 한 번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다.

배열의 길이 변경하기

배열의 길이를 변경하는 방법:
1. 더 큰 배열을 새로 생성한다.
2. 기존 배열의 내용을 새로운 배열에 복사한다.

1.4 배열의 초기화

배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만, 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해 줘야한다.

int[] score = new int[5]; // 길이가 5인 int형 배열을 생성한다.
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;

배열의 길이가 큰 경우에는 이렇게 요소 하나하나에 값을 지정하기 보다는 for문을 사용하는 것이 좋다. 위의 코드를 for문을 이용해서 바꾸면 다음과 같다.

int[] score = new int[5]; // 길이가 5인 int형 배열을 생성한다.

for(int i = 0; i < score.length; i++) {
	score[i] = i * 10 + 50;
}

그러나 for문으로 배열을 초기화하려면, 저장하려는 값에 일정한 규칙이 있어야만 가능하기 때문에 자바에서는 다음과 같이 배열을 간단히 초기화 할 수 있는 방법을 제공한다.

int[] score = new int[] {50, 60, 70, 80, 90}; // 배열의 생성과 초기화를 동시에


new int []를 생략할 수 있음
다음과 같이 배열의 선언과 생성을 따로 하는 경우에는 생략할 수 없다.

배열의 출력
배열을 초기화할 때 for문을 사용하듯이, 배열에 저장된 값을 확인할 때도 다음과 같이 for문을 사용하면 된다.

int [] iArr = {100, 95, 80, 70, 60};

// 배열의 요소를 순서대로 하나씩 출력
for (int i = 0; i < iArr.length; i++) {
	System.out.println(iArr[i]);
}

1.5 배열의 복사

배열을 복사하는 방법은 두 가지가 있는데, 먼저 for문을 이용해서 배열을 복사하는 방법은 다음과 같다.

System.arraycopy()를 이용한 배열의 복사
for문 대신 System클래스의 arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사할 수 있다. for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장되어 있다는 배열의 특성때문에 이렇게 처리하는 것이 가능한 것이다.

배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.

1.6 배열의 활용(생략)

2. String배열

2.1 String배열의 선언과 생성

String[] name = new String[3]; // 3개의 문자열을 담을 수 있는 배열을 생성한다.

3개의 String타입의 참조변수를 저장하기 위한 공간이 마련되고 참조형 변수의 기본값은 null이므로 각 요소의 값은 null로 초기화 된다.

변수의 타입에 따른 기본값

2.2 String배열의 초기화

초기화 역시 int배열과 동일한 방법으로 한다. 아래와 같이 배열의 각 요소에 문자열을 지정하면 된다.

String[] name = new String[3]; // 길이가 3인 String배열을 생성
name[0] = "Kim";
name[1] = "Park";
name[2] = "Yi";

또는 괄호{}를 사용해서 다음과 같이 간단히 초기화 할 수도 있다.

String[] name = new String[] {"Kim", "Park", "Yi"};
String[] name = {"Kim", "Park", "Yi"}; // new String[]을 생략할 수 있음

2.3 char배열과 String클래스

String클래스는 char배열에 기능을 추가한 것이다.

C언어에서는 문자열을 char배열로 다루지만, 객체지향언어인 자바에서는 char배열과 그에 관련된 기능들을 함께 묶어서 클래스에 정의한다. 객체지향개념이 나오기 이전의 언어들은 데이터와 기능을 따로 다루었지만, 객체지향언어에서는 데이터와 그에 관련된 기능을 하나의 클래스에 묶어서 따로 다루었지만, 객체지향언어에서는 데이터와 그에 관련된 기능을 하나의 클래스에 묶어서 다룰 수 있게 한다. 즉, 서로 관련된 것들끼리 데이터와 기능을 구분하지 않고 함께 묶는 것이다.

여기서 말하는 '기능'은 함수를 의미하며, 메서드는 객체지향 언어에서 '함수' 대신 사용하는 용어일 뿐 함수와 같은 뜻이다. 앞으로 '기능'이나 '함수' 대신 '메서드'라는 용어를 사용할 것이다.

char배열과 String클래스의 한 가지 중요한 차이가 있는데, String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.

String클래스의 주요 메서드

2.4 커맨드 라인을 통해 입력받기

Scanner클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있다. 바로 커맨드라인을 이용한 방법인데, 프로그램을 실행할 때 클래스이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있다.

만일 실행할 프로그램의 main메서드가 담긴 클래스의 이름이 MainTest라고 가정하면 다음과 같이 실행할 수 있을 것이다.

c:\jdk1.8\work\ch5>java MainTest abc 123

커맨드라인을 통해 입력된 두 문자열은 String배열에 담겨서 MainTest클래스의 main메서드의 매개변수(args)에 전달된다. 그리고는 main메서드 내에서 args[0], args[1]과 같은 방식으로 커맨드라인으로 부터 전달받은 문자열에 접근할 수 있다. 여기서 args[0]은 "abc"이고 args[1]은 "123"이 된다.

3. 다차원 배열

3.1 2차원 배열의 선언과 인덱스

2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 괄호[]가 하나 더 들어갈 뿐이다.

2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며, 만일 4행 3열의 데이터를 담기 위한 배열을 생성하려면 다음과 같이한다.

위 문장이 수행되면 5행 3열의 데이터, 모두 15개의 int값을 저장할 수 있는 공간이 마련된다.

2차원 배열의 index
2차원 배열은 행(row)과 열(column)로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다. '행index'의 범위는 '0~행의 길이-1'이고 '열index'의 범위는 '0~열의 길이-1'이다. 그리고 2차원 배열의 각 요소에 접근하는 방법은 '배열이름[행index][열index]'이다.

만일 다음과 같이 배열 score를 생성하면, score[0][0]부터 score[3][2]까지 모두 12개(4x3=12)의 int값을 저장할 수 있는 공간이 마련되고, 각 배열 요소에 접근할 수 있는 방법은 아래의 그림과 같다.

int[][] score = new int[4][3]; // 4행 3열의 2차원 배열 score를 생성

3.2 2차원 배열의 초기화

2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호{}를 한번 더 써서 행별로 구분해 준다.

int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, {4, 5, 6} }; // new int[][]가 생략됨

크기가 작은 배열은 위와 같이 간단히 한 줄로 써주는 것도 좋지만, 가능하면 다음과 같이 행별로 줄 바꿈을 해주는 것이 보기도 좋고 이해하기 쉽다.

int[][] arr = {
				{1, 2, 3},
                {4, 5, 6}
            };

만일 아래와 같은 테이블 형태의 데이터를 배열에 저장하려면,

국어영어수학
1100100100
2202020
3303030
4404040
5505050

다음과 같이 하면 된다.

위 문장이 수행된 후에, 2차원 배열 score가 메모리에 어떤 형태로 만들어지는지 그려보면 다음과 같다.

3.3 가변 배열

만일 다음과 같이 '5 X 3'길이의 2차원 배열 score를 생성하는 코드가 있을 때,

위 코드를 다음과 같이 표현 할 수 있다.

int[][] score = new int[5][]; // 두 번째 차원의 길이는 지정하지 않는다.
score[0] = new int[3];
score[1] = new int[3];
score[2] = new int[3];
score[3] = new int[3];
score[4] = new int[3];

첫 번째 코드와 같이 2차원 배열을 생성하면 직사각형 테이블 형태의 고정적인 배열만 생성할 수 있지만, 두 번째 코드와 같이 2차원 배열을 생성하면 다음과 같이 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.

위의 코드에 의해서 생성된 2차원 배열을 그림으로 표현하면 다음과 같다.

가변배열 역시 중괄호{}를 이용해서 다음과 같이 생성과 초기화를 동시에 하는 것이 가능하다.

3.4 다차원 배열의 활용(생략)

profile
최고가 되기 위해 최선을...

0개의 댓글