자바의 정석 | Ch 05 - 배열 Array
by 무작정 개발1. 배열(array)
1.1 배열(array)이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열(array)'이라고 한다.
"배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것"
1.2 배열의 선언과 생성
배열의 선언하는 방법은 간단하다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[ ]를 붙이면 된다.
선언방법선언 예
타입[ ] 변수이름; | int [ ] score; String [ ] name; |
타입 변수이름[]; | int score[]; String name[]; |
배열의 생성
배열을 선언한 다음에는 배열을 생성해야 한다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 'new'와 함께 배열의
타입과 길이를 지정해 주어야 한다.
타입 [ ] 변수 이름; // 배열을 선언(배열을 다루기 위한 참조 변수 선언)
변수 이름 = new 타입[길이]; //배열을 생성(실제 저장공간을 생성)
1.3 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 '배열의 요소'라고 하며, '배열 이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 변수의 이름을 지을 때 score1, score 2와 같이 번호를 붙이는 것과 비슷하다고 할 수 있다. 다만 인덱스는 1이 아닌 0부터 시작한다. 이제 하단 예제를 풀어보면서 이해를 해보자!
//예제5-1/ch5/ArrayEx1.java
package Chapter05;
public class ArrayEx1 {
public static void main(String[] args) {
int [] score = new int[5];
int k = 1;
score[0] = 50;
score[1] = 60;
score[k+1] = 70; // score[2] = 70
score[3] = 80;
score[4] = 90;
int tmp = score[k+2] + score[4]; //int tmp = score[3] +score[4]
//for문으로 배열의 모든 요소를 출력한다.
for(int i=0; i<5; i++) {
System.out.printf("score[%d]:%d%n", i, score[i]);
}
System.out.printf("tmp:%d%n", tmp);
System.out.printf("score[%d]:%d%n", 7, score[7]); // index 범위를 벗어난 값 오류뜸
}
}
위의 예제의 배열 score는 길이가 5이므로 indexdml qjadnlrk 0~4이지만, 일부러 이 범위에 속하지 않는 7을 배열의 index값을 출력해보았다. 컴파일 시에는 문제가 없지만, 실행 시에는 에러가 발생한다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7 at Chapter 05.ArrayEx1.main(ArrayEx1.java:22)
위의 메시지는 배열의 인덱스가 유효한 범위를 넘었다는 뜻이다.
배열의 길이
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수이다. 배열의 길이는 양의 정수이어야 하며 최댓값은 int타입의
최댓값, 약 20억이다.
배열 이름. length
java에서는 JVM이 모든 배열의 길이를 별도로 관리하며, "배열 이름. length"를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.
하단 코드에서 배열 arr의 길이가 5이므로 arr.length의 값 역시 5가 된다.
int [] arr = new int [5]; // 길이가 5인 int 배열
int tmp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다.
배열은 한번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다. 배열의 길이를 변경하기 위해서는
더 큰 새로운 배열을 생선 한 다음, 기존의 배열에 저장된 값들을 새로운 배열에 복사하면 된다.
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}; // 배열의 생성과 초기화를 동시에
저장할 값들을 괄호 { } 안에 쉼표로 구분해서 나열하면 되며, 괄호 { } 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에
괄호{ } 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호[ ] 안에 배열의 길이는 안 적어도 된다.
int [ ] score = new int [ ] {50, 60, 70, 80, 90};
int [ ] score = {50, 60, 70, 80, 90}; // new int [ ]를 생략할 수 있음
심지어 위와 같이 'new 타입[]'을 생략하여 코드를 더 간단히 할 수 있다. 아무래도 생략된 형태의 코드가 더 간단하므로 자주 사용된다.
다만 다음과 같이 배열의 선언과 생성을 따로 하는 경우에는 생략할 수 없다는 점만 주의하면 된다.
int [ ] score;
score = new int [ ] {50, 60, 70, 80, 90}; // ok
score = {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]);
}
println메서드는 출력 후에 줄 바꿈을 하므로, 여러 줄에 출력되어 보기 불편할 때가 있다. 그럴 때는 출력 후에 줄 바꿈을 하지 않는
print메서드를 사용하자.(하단)
int [ ] iArr = { 100, 95, 80, 70, 60};
for(int i=0; i <iArr.length; i++) {
System.out.print(iArr [i]+", "); // 각 요소 간의 구별을 위해 쉼표를 넣는다.
}
System.out.println(); // 다음 출력이 바로 이어지지 않도록 줄 바꿈을 한다.
더 간단한 방법은 'Arrays.toString(배열 이름)'메서드를 사용하는 것이다. 이 메서드는 배열의 모든 요소를 '[첫 번째 요소, 두 번째 요소,...]'와 같은 형식의 문자열로 만들어서 반환한다. (Array.toString()을 사용하려면, 'import java util.*'를 추가해야 한다.
int [ ] iArr = { 100, 95, 80, 70, 60};
// 배열 iArr의 모든 요소를 출력한다. [ 100, 95, 80, 70, 60]이 출력된다.System.out.println(Arrays.toString(iArr));
이제 하단 예제를 풀어보자!
package Chapter05;
import java.util.*;
public class ArrayEx2 {
public static void main(String[] args) {
int [] iArr1 = new int[10];
int [] iArr2 = new int[10];
// int [] iArr3 = new int [] {100, 96, 80, 70, 60};
int [] iArr3 = {100, 95, 80, 70, 60};
char [] chArr = {'a', 'b', 'c', 'd'};
for(int i=0; i<iArr1.length; i++) {
iArr1[i] = i + 1; // 1~10의 숫자를 순서대로 배열에 넣는다.
}
for(int i=0; i<iArr2.length; i++) {
iArr2[i] = (int)(Math.random()*10) + 1; // 1~10의 값을 배열에 저장
}
//배열에 저장된 값들을 출력한다.
for(int i=0; i<iArr1.length; i++) {
System.out.print(iArr1[i] + ",");
}
System.out.println();
System.out.println(Arrays.toString(iArr2));
System.out.println(Arrays.toString(iArr3));
System.out.println(Arrays.toString(chArr));
System.out.println(iArr3);
System.out.println(chArr);
}
}
1.5 배열의 복사
배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야 한다고 했다. 배열을 복사하는 방법은 두 가지가 있는데, 먼저 for문을 이용해서 배열을 복사하는 방법은 다음과 같다.
int [] arr = new int [5];
....
int [] tmp = new int [arr.length; i++]; // 기존 배열보다 길이가 2배인 배열 생성for(int i=0; i <arr.length; i++)
tmp [i] = arr [i]; // arr [i]의 값을 tmp [i]에 저장arr = tmp; // 참조 변수 arr이 새로운 배열을 가리키게 한다.
이제 하단 예제를 풀어보자!
//예제5-3/ch5/ArrayEx3.java
package Chapter05;
public class ArrayEx3 {
public static void main(String[] args) {
int [] arr = new int[5];
//배열 arr에 1~5를 저장한다.
for(int i=0; i<arr.length; i++)
arr[i] = i + 1;
System.out.println("[변경전]");
System.out.println("arr.length:" + arr.length);
for(int i=0; i < arr.length;i++)
System.out.println("arr["+i+"]:"+arr[i]);
int[] tmp = new int[arr.length*2];
//배열 arr에 저장된 값들을 배열 tmp에 복사한다.
for(int i=0; i<arr.length; i++)
tmp[i] = arr[i];
arr = tmp; // tmp에 저장된 값을 arr에 저장한다.
System.out.println("[변경후]");
System.out.println("arr.length:" + arr.length);
for(int i=0; i<arr.length; i++)
System.out.println("arr["+i+"]:" + arr[i]);
}
}
System.arraycopy()를 이용한 배열의 복사
for문 대신 system클래스의 arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사할 수 있다. for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장되어 있다는 배열의 특성
때문에 이렇게 처리하는 것이 가능한 것이다.
배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.
배열의 복사에 사용된 for문을 arraycopy()로 바꾸면 다음과 같다.
for(int i=0; i <num.length; i++) { new Num [i] = num [i]; }
에서
System.arraycopy(num, 0, newNum, 0, num.length);
로 바꿈
*위를 쉽게 말하자면 num [0]에서 newNum [0]으로 num.length개의 데이터를 복사
*
배열 num의 내용을 배열 newNum으로, 배열 num의 첫 번째 요소(num [0])부터 시작해서 num.length개의 데이터를 newNum의
첫 번째 요소(newNum [0])에 복사한다. 이제 하단 예제를 풀어보자!
//예제5-4/ch5/ArrayEx4.java
package Chapter05;
public class ArrayEx4 {
public static void main(String[] args) {
char [] abc = {'A', 'B', 'C', 'D'};
char [] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
System.out.println(abc);
System.out.println(num);
//배열 abc와 num을 붙여서 하나의 배열(result)를 만든다.
char[] result = new char[abc.length + num.length];
System.arraycopy(abc, 0, result, 0, abc.length);
System.arraycopy(num, 0, result, abc.length, num.length);
System.out.println(result);
// 배열 abc을 배열 num의 첫 번째 위치부터 배열 abc의 길이만큼 복사
System.arraycopy(abc, 0, num, 0, abc.length);
System.out.println(num);
// number의 인덱스6 위치에 3개를 복사
System.arraycopy(abc, 0, num, 6, 3);
System.out.println(num);
}
}
위의 예제는 다른 배열과 달리 char배열은 for문을 사용하지 않고도 print()나 println()으로 배열에 저장된 모든 문자를 출력할 수 있다.
1.6 배열의 활용
(1) 총합과 평균 - 배열의 모든 요소를 더해서 총합과 평균을 구한다
//예제5-5/ch5/ArrayEx5.java
package Chapter05;
public class ArrayEx5 {
public static void main(String[] args) {
int sum = 0; //총점을 저장하기 위한 변수
float average = 0f; //평균을 저장하기 위한 변수
int [] score = {100, 88, 100, 100, 90};
for(int i=0; i<score.length; i++) {
sum += score[i];
}
average = sum / (float)score.length; // 계산결과를 float로 얻기 위해서 형변환
System.out.println("총점 : " + sum);
System.out.println("평균 : " + average);
}
}
위의 예제는 for문을 이용해서 배열에 저장된 값을 모두 더한 결과를 배열의 개수로 나누어서 평균을 구하는 예제이다. 평균을 구하기 위해 전체 합을 배열의 길이인 score.length로 나누었다. int와 int 간의 연산은 int를 결과로 얻기 때문에 정확한 평균값을 얻지 못하므로
score.length를 float로 변환하여 나눗셈을 하였다.
(2) 최댓값과 최솟값 - 배열의 요소 중에서 제일 큰 값과 제일 작은 값을 찾는다.
//예제5-6/ch5/ArrayEx6.java
package Chapter05;
public class ArrayEx6 {
public static void main(String[] args) {
int [] score = {79, 88, 91, 33, 100, 55, 95};
int max = score[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다.
int min = score[0]; // 배열의 첫 번째 값으로 최소값을 초기화 한다.
for(int i=1; i<score.length; i++) {
if(score[i] > max) {
max = score[i];
} else if(score[i]<min) {
min = score[i];
}
} // end of for
System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
}
}
위의 예제는 배열에 저장된 값 중에서 최댓값과 최솟값을 구하는 예제이다. 배열의 첫 번째 요소 'score [0]'의 값으로 최댓값을 의미하는
변수 max와 최솟값을 의미하는 변수 min을 초기화하였다. 그다음 반복문을 통해서 배열의 두 번째 요소 'score [1]'부터 max와
비교하기 시작하는데 배열에 담긴 값이 max에 저장된 값보다 크면 이 값을 max에 저장하는데 이런 식으로 배열의 마지막 요소까지
비교하고 나면 max에는 배열에 담긴 값 중에서 최댓값이 저장된다. 최솟값 min도 같은 방식이다.
(3) 섞기(shuffle) - 배열의 요소의 순서를 반복해서 바꾼다.(카드 섞기, 로또번호 생성)
//예제5-7/ch5/ArrayEx7.java
package Chapter05;
public class ArrayEx7 {
public static void main(String[] args) {
int[] numArr = new int[10];
for(int i=0; i<numArr.length; i++) {
numArr[i] = i; //배열을 0~9의 숫자로 초기화한다.
System.out.print(numArr[i]);
}
System.out.println();
for(int i=0; i<100; i++) {
int n = (int)(Math.random() * 10); //0~9중의 한 값을 임의로 얻는다.
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
for(int i=0; i<numArr.length; i++)
System.out.print(numArr[i]);
}
}
길이가 10인 배열 numArr을 생성하고 0~9의 숫자로 차례대로 초기화하여 출력한다. 그다음 random()을 이용해서 배열의 임의의
위치에 있는 값과 배열의 첫 번째 요소인 'numArr [0]'의 값을 교환하는 일을 100번 반복한다.
//예제5-8/ch5/ArrayEx8.java
package Chapter05;
public class ArrayEx8 {
public static void main(String[] args) {
int[] ball = new int[45]; //45개의 정수값을 저장하기 위한 배열 생성
//배열의 각 요소에 1~45의 값을 저장
for (int i = 0; i < ball.length; i++)
ball[i] = i + 1;
int temp = 0; //두 값을 바꾸는데 사용할 임시변수
int j = 0; // 임의의 값을 얻어서 저장할 변수
//배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 섞는다.
//0번째 부터 5번째 요소까지 모두 6개만 바꾼다.
for(int i=0; i<6; i++) {
j = (int)(Math.random() * 45); //0~44범위의 임의의 값을 얻는다.
temp = ball[i];
ball[i] = ball[j];
ball[j] = temp;
}
// 배열 ball의 앞에서부터 6개의 요소를 출력
for(int i=0; i<6; i++)
System.out.printf("ball[%d]=%d%n", i, ball[i]);
}
}
위의 예제는 로또번호를 생성하는 예제이다. 길이가 45인 배열에 1부터 45까지의 값을 담은 다음 반복문을 이용해서 배열의 인덱스가
i인 값(ball [i])과 random()에 의해서 결정된 임의의 위치에 있는 값과 자리를 바꾸는 것을 6번 반복한다.
(4) 임의의 값으로 배열 채우기 - 연속 또는 불연속적인 값들로 배열을 초기화한다.
배열을 연속적인 범위의 임의의 값으로 채우는 것은 다음과 같이 random()만 사용하면 쉽게 할 수 있다.
for(i=0; i <arr.length; i++) {
arr [i] = (int)(Math.random() * 5 ); // 0~4 범위의 임의의 값을 저장
}
불연속적인 범위의 값들로 배열을 채우는 것은 배열을 하나 더 사용하면 된다. 먼저 배열 code에 불연속적인 값들을 담고, 임의로 선택된
index에 저장된 값으로 배열 arr의 요소들을 하나씩 채우면 되는 것이다. 저장된 값에 상관없이 배열의 index는 항상 연속적이기 때문이다.
하단 예제를 보자!
//예제5-9/ch5/ArrayEx9.java
package Chapter05;
import java.util.Arrays;
public class ArrayEx9 {
public static void main(String[] args) {
int [] code = {-4, -1, 3, 6, }; //불연속적인 값들로 구성된 배열
int [] arr = new int[10];
for(int i=0; i<arr.length; i++) {
int tmp = (int)(Math.random() * code.length);
arr[i] = code[tmp];
}
System.out.println(Arrays.toString(arr));
}
}
배열 code의 길이가 5이므로 code.length의 값은 5가 된다. 따라서 변수 tmp에는 0~4 범위에 속한 임의의 정수가 저장되는데, 이 범위는 배열 code의 index의 범위와 일치한다.
(5) 정렬하기(sort) - 오름차순, 내림차순으로 배열을 정렬
//예제5-10/ch5/ArrayEx10.java
package Chapter05;
public class ArrayEx10 {
public static void main(String[] args) {
int[] numArr = new int[10];
for (int i=0; i < numArr.length ; i++ ) {
System.out.print(numArr[i] = (int)(Math.random() * 10));
}
System.out.println();
for (int i=0; i < numArr.length-1 ; i++ ) {
boolean changed = false; // 자리바꿈이 발생했는지를 체크한다.
for (int j=0; j < numArr.length-1-i ;j++) {
if(numArr[j] > numArr[j+1]) { // 옆의 값이 작으면 서로 바꾼다.
int temp = numArr[j];
numArr[j] = numArr[j+1];
numArr[j+1] = temp;
changed = true; // 자리바꿈이 발생했으니 changed를 true로.
}
} // end for j
if (!changed) break; // 자리바꿈이 없으면 반복문을 벗어난다.
for(int k=0; k<numArr.length;k++)
System.out.print(numArr[k]); // 정렬된 결과를 출력한다.
System.out.println();
} // end for i
} // main의 끝
}
위의 예제는 길이가 10인 배열에 0과 9 사이의 임의의 값으로 채운 다음, 버블 정렬 알고리즘을 통해서 크기순으로 정렬하는 예제이다.
이 알고리즘 정렬방법은 아주 간단하다. 배열의 길이가 n일 때, 배열의 첫 번째부터 n-1까지의 요소에 대해, 근접한 값과 크기를 비교하여
자리바꿈을 반복하는 것이다.
(6) 빈도수 구하기 - 배열에 어떤 값이 몇 개 저장되어 있는지 세어서 보여준다.
//예제5-11/ch5/ArrayEx11.java
package Chapter05;
public class ArrayEx11 {
public static void main(String[] args) {
int [] numArr = new int[10];
int [] counter = new int[10];
for(int i=0; i<numArr.length; i++) {
numArr[i] = (int)(Math.random() * 10); // 0~9의 임의의 수를 배열에 저장
System.out.print(numArr[i]);
}
System.out.println();
for(int i=0; i<numArr.length; i++) {
counter[numArr[i]]++;
}
for(int i=0; i<numArr.length; i++) {
System.out.println(i + "의 개수 : " + counter[i]);
}
}
}
위의 예제는 길이가 10인 배열을 만들고 0과 9 사이의 임의의 값으로 초기화한다. 그리고 이 배열에 저장된 각 숫자가 몇 번 반복해서
나타나는지를 세어서 배열 counter에 담은 다음 화면에 출력한다.
2. String 배열
2.1 String배열의 선언과 생성
배열의 타입이 String인 경우에도 int배열의 선언과 생성 방법은 다르지 않다. 예를 들어 3개의 문자열(String)을 담을 수 있는 배열을
생성하는 문장은 다음과 같다.
String [] name = new String [3]; //3개의 문자열을 담을 수 있는 배열을 생성
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 []을 생략할 수 있음.
//예제5-12/ch5/ArrayEx12.java
package Chapter05;
public class ArrayEx12 {
public static void main(String[] args) {
String [] names = {"Kim", "Park", "Yi"};
for(int i=0; i<names.length; i++)
System.out.println("names["+i+"]:" + names[i]);
String tmp = names[2]; // 배열 names의 세 번째 요소를 tmp에 저장
System.out.println("tmp:" + tmp);
names[0] = "Yu"; // 배열 names의 첫 번째 요소를 "Yu"로 변경
for(String str : names) //향상된 for문
System.out.println(str);
}
}
//예제5-13/ch5/ArrayEx13.java
package Chapter05;
public class ArrayEx13 {
public static void main(String[] args) {
char[] hex = {'C', 'A', 'F', 'E'};
String[] binary = {"0000", "0001", "0010", "0011",
"0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111"};
String result = "";
for (int i = 0; i < hex.length; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += binary[hex[i] - '0']; //'8' - '0'의 결과는 8이다.
} else { //A~F이면
result += binary[hex[i] - 'A' + 10]; //'C' - 'A'의 결과는 2
}
}
System.out.println("hex:" + new String(hex));
System.out.println("binary:" + result);
}
}
위의 예제는 16진수를 2진수로 변환하는 예제이다. 먼저 변환하고자 하는 16진수를 배열 hex에 나열한다. 16진수에는 A~F까지 6개의
문자가 포함되므로 char배열로 처리하였다. 그리고 문자열 배열 binary에는 이진수 '0000'부터 '1111'(16진수로 0~F)까지 모두 16개의
값을 문자열로 저장하였다. for문을 이용해서 배열 hex에 저장된 문자를 하나씩 읽어서 그에 해당하는 이진수 표현을 배열 binary에서 얻어
result에 덧붙이고 그 결과를 화면에 출력한다.
2.3 char배열과 String클래스
지금까지 여러 문자, 즉 문자열을 저장할 때 String타입의 변수를 사용했다. 사실 문자열이라는 용어는 '문자를 연이어 늘어놓은 것'을 의미하므로 문자 배열인 char배열과 같은 뜻이다. 그런데 Java에서 char배열이 아닌 String클래스를 이용해서 문자열을 처리하는 이유는
String 클래스가 char배열에 여러 가지 기능을 추가하여 확장한 것이기 때문이다. 그래서 char배열을 사용하는 것보다 String클래스를
사용하는 것이 문자열을 다루기 더 쉽다.
String클래스는 char배열에 기능(메서드)을 추가한 것이다.
char배열과 String클래스의 변환
가끔 char배열을 String클래스로 변환하거나, 또는 그 반대로 변환해야 하는 경우가 있다. 그럴 때 다음의 코드를 사용하자.
char [] chArr = { 'A', 'B', 'C'};
String str = new String(chArr); // char배열 -> String
char [] tmp = str.toCharArray(); // String -> char배열
//예제 5-14/ch5/ArrayEx14.java
package Chapter05;
public class ArrayEx14 {
public static void main(String[] args) {
String src = "ABCDE";
for(int i=0; i < src.length(); i++) {
char ch = src.charAt(i); // src의 i번째 문자를 ch에 저장
System.out.println("src.charAt("+i+"):"+ ch);
}
char[] chArr = src.toCharArray(); // String을 char[]로 변환
System.out.println(chArr); // char배열(char[])을 출력
}
}
String클래스의 charAt(int idx)을 사용하는 방법을 보여주는 예제이다. charAt(int idx)은 문자열 중에서 idx번째 위치에 있는 문자를
반환한다. idx의 값은 배열처럼 0부터 시작한다는 것을 확인하자. 그리고 println()로 문자 배열을 출력하면 문자열 출력하듯이 문자 배열의
모든 요소를 이어서 한 줄로 출력한다.
'Language > Java' 카테고리의 다른 글
자바의 정석 | Ch 06 - 객체지향 프로그래밍1-2 (0) | 2021.12.17 |
---|---|
자바의 정석 | Ch 06 - 객체지향프로그래밍1-1 (0) | 2021.12.16 |
자바의 정석 | Ch 04 - 조건문과 반복문 (0) | 2021.12.15 |
자바의 정석 | Ch 03 - 연산자(Operator) (0) | 2021.12.15 |
자바의 정석 | Ch 2 - 변수(Variable) (0) | 2021.12.15 |
블로그의 정보
무작정 개발
무작정 개발