[java] 6.String 배열 과 다차원 배열


String 배열의 선언과 생성



배열의 타입이 String인 경우에도 int 배열의 선언과 생성방법은 다르지 않습니다.

예를 들어 3개의 문자열을 담을 수 있는 배열을 생성하는 문장은 다음과 같습니다.


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



3개의 String 타입의 참조변수를 저장하기 위한 공간이 마련되고 참조형 변수의 기본값은 null이므로

각 요소의 값은 null로 초기화됩니다.



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"};



기본형 배열에 저장되는 것은 값들이지만,

참조형 배열은 기본형 배열과 다르게 저장되는 것은 객체의 주소입니다.

예를 들어 int형 배열 arr에 0,1,2,3,4가 저장되면,

실제로 arr[0],arr[1],…,arr[4]에 저장되는 것은 0,1,2,3,4 그 자체의 값이지만,

String 배열 name에 Kim, Park, Yi가 저장되면,

실제로 name[0],name[1],name[2]에 저장되는 것은 Kim, Park, Yi가 저장된 주소입니다.

다음은 String 배열 값을 출력하는 예제입니다.


image



char 배열과 String 클래스



지금까지 여러 문자, 즉 문자열을 저장할 때 String 타입의 변수를 사용했습니다.

사실 문자열이라는 용어는 문자를 연이어 늘어놓은 것을 의미하므로 char배열과 같은 뜻입니다.

그런데 자바에서는 char 배열이 아닌 String 클래스를 이용해서 문자열을 처리하는 이유는

String 클래스가 char 배열에 여러 가지 기능을 추가하여 확장한 것이기 때문입니다.

그래서 char 배열을 사용하는 것보다 String 클래스를 사용하는 것이 문자열을 다루기 편리합니다.


String 클래스는 char 배열에 기능(메서드)를 추가한 것이다.



char 배열과 String 클래스의 한 가지 중요한 차이가 있는데,

String 객체는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것입니다.


String str="java";

str=str+8; //"java8"이라는 새로운 문자열이 str에 저장된다.

System.out.println(str); //"java8"



위의 문장에서 문자열 str의 내용이 변경되는 것 같지만,

문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성됩니다.



String클래스의 주요 메서드



String 클래스는 상당히 많은 문자열 관련 메서드들을 제공하지만 지금은 가장 기본적인 몇 가지만

살펴보고 나머지는 다음에 자세히 다루겠습니다.


image



char배열과 String 클래스의 변환



가끔 char배열을 String 클래스로 변환하거나, 또는 그 반대로 변환해야하는 경우가 있습니다.

그럴 때 다음과 같이 하면 됩니다~


char[] chArr={'A','B','C'};

String str=new String(chArr); //char배열->String

char[] tmp=str.toCharArray(); //String->char배열



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



Scanner 클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있습니다.

바로 커맨드라인을 이용한 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에

공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있습니다.

다음 예제를 보시죠!


image




image



커맨드라인을 통해 입력된 두 문자열은 String배열에 담겨서 example 클래스의 main 메서드의 매개변수(args)에 전달됩니다.

그리고는 main 메서드 내에서 args[0], args[1] 과 같은 방식으로 커맨드라인으로부터

전달받은 문자열에 접근할 수 있습니다.

위에서 args[0]은 “abc” 이고, args[1]은 “123”입니다.

주의할 점은 커맨드라인에 입력된 매개변수는 공백문자로 구분하기 때문에 입력될 값에 공백이 있는 경우

큰 따옴표(“)로 감싸주어야 합니다.



다차원 배열



지금까지 우리가 배운 배열은 1차원 배열인데, 2차원 이상의 배열, 즉 다차원 배열도 선언해서 사용할 수 있습니다.

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


타입[][] 변수이름; //ex) int[][]score;

타입 변수이름[][]; //ex) int score[][];

타입[] 변수이름[]; //ex) int[] score[];



다음 코드는 4행 3열의 데이터를 담기 위한 배열을 선언하는 것입니다.


int[][] score=new int[4][3];



2차원 배열의 index



2차원 배열은 행과 열로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재합니다.

행 index의 범위는 0~행의 길이-1 이고, 열 index의 범위는 0~열의 길이-1이다.

그리고 2차원 배열의 각 요소에 접근하는 방법은 배열이름[행index][열index]입니다.

따라서 score 배열의 1행 1열에 100을 대입하고 싶다면 다음과 같이 작성합니다.


score[0][0]=100;

System.out.println(score[0][0]);



2차원 배열의 초기화



2차원 배열도 괄호 {}를 사용해서 생성과 초기화를 동시에 할 수 있습니다.

다만, 1차원 배열보다 괄호 {}를 한번 더 써서 행별로 구분해줍니다.


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

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



크기가 작은 배열은 위와 같이 간단히 한 줄로 써주는 것도 좋지만,

가능하면 다음과 같이 행별로 줄 바꿈을 해주는 것이 보기도 좋고 이해하기 쉽습니다.


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



2차원 배열은 배열의 배열로 구성되어 있습니다.

즉, 여러 개의 1차원 배열을 묶어서 또 하나의 배열로 만든 것입니다.

다음 코드를 보시죠~


image



위에서 보면 arr.length는 3이고 arr[i].length는 4입니다. (i=0,1,2)

즉 arr의 3개의 배열요소인 arr[0], arr[1], arr[2]이 각각 4개의 요소를 갖는 배열을 가리키고 있는 것입니다.

length를 이용해서 다음과 같이 이차원배열을 초기화 할 수 있습니다.


//2차원 배열의 모든 요소를 10으로 초기화
int[][] arr=new int[3][4];

for(int i=0;i<arr.length;i++){
	for(int j=0;j<arr[i].length;j++){
		arr[i][j]=10;
	}
}



그리고 향상된 for 문을 사용해서 다음과 같이 이차원 배열의 모든 요소의 합을 구할 수도 있습니다.


image



가변 배열



자바에서는 2차원 이상의 배열을 배열의 배열의 형태로 처리한다는 사실을 이용하면

보다 자유로운 형태의 배열을 구성할 수 있습니다.

2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고,

추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있습니다.

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


int[][] score=new int[5][3];



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


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차원 배열을 생성하면 다음과 같이 각 행마다 다른 길이의 배열을 생성하는 것이 가능합니다.


int[][] score=new int[5][];

score[0]=new int[4];
score[1]=new int[3];
score[2]=new int[2];
score[3]=new int[2];
score[4]=new int[3];



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


image



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


int[][] score={
                 {100,100,100,100}
               ,	{20,20,20}
               ,	{30,30}
               ,	{40,40}
               ,	{50,50,50}     
};



다차원 배열의 활용



다음은 다차원 배열을 이용해서 지뢰찾기 게임을 만든 것입니다.


image

image



실행결과입니다.


image



다음은 행렬의 곱을 다차원 배열을 통해 구현한 것입니다.


image