[Java] 배열 (String 배열, 2차원 배열, Array클래스)
배열
1. 배열의 선언과 생성 → int[] num = new int[ ]
- 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.
배열은 선언과 동시에 크기(공간)을 미리 지정해야 한다.
int[] score; // 1. 배열 score를 선언(참조변수 선언 )
score = new int[5]; // 2. 생성된 배열을 참조변수 score에 저장
int[] score = new int[5]; // *배열의 선언과 생성을 동시에*
score[3] = 100; // score[3]에 100 저장
int value=score[3];
System.out.println("value의 값 : " + value);
2. 배열의 길이 → 참조변수명.length
- 배열의 요소의 개수, 값을 저장할 수 있는 공간의 개수
- 인덱스의 범위 → 0부터 배열길이-1까지
int [] score = new int[5] // 길이가 5인 int 배열 -> 인덱스의 범위0부터 4까지 0,1,2,3,4
int tmp = score.length; // score.length의 값 : 5 이고 tmp에 5가 저장된다.
- 배열의 길이를 직접 적는 것보다 ‘참조변수명.length’을 사용하는 것이 좋다. → 코드 관리가 쉽고 에러 발생확률이 적기 때문
int arr [] = new int[4]; // 길이가 5인 int배열 arr 생성 -> 4로 줄임
System.out.println("arr.length = " + arr.length);
for(int i=0; i<5; i++) { // 배열의 길이를 4로 줄이고 for문 수정을 안 하면 에러 발생
-> for(int i=0; i<arr.length; i++) {
// 따라서 길이를 직접 적기보다 변수명.length으로 쓰기
⚠️ Error → 인덱스 범위를 벗어남
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4 at javajungsuk.ArrayExam.main(ArrayExam.java:11)
- 배열은 한 번 생성하면 그 길이를 바꿀 수 없다 (int형 상수)
- 공간이 부족한 경우 길이 변경하는 방법
→ 1. 더 큰 배열을 새로 생성한다.
2. 기존 배열의 내용을 새로운 배열에 복사한다.
- 공간이 부족한 경우 길이 변경하는 방법
3. 배열의 초기화
📌 배열을 생성하고 정수는 0 실수는 0.0 문자열은 null 등으로 초기화시킨다.
- 타입[] 참조변수명 = new 타입[배열의 길이];
→ int[ ] score = new int[5]; - 타입[] 참조변수명 ; 참조변수명 = new 타입[배열의 길이] ;
→ int[] score; score = new int[5]; - 타입[] 참조변수명 = {값1, 값2, …};
→ int[ ] score = { 50, 60, 70, 80, 90 } - 타입[] 참조변수명 = new 타입[] { 값, 값2, … }
→ [ ]안에 배열의 크기를 지정하지 않음. { }의 값을 통해 크기가 정해지기 때문.
int[ ] score = new int[ ] {10, 20, 30, 40, 50}
🔧 타입[ ] 참조변수명;
참조변수명 = { 값1, 값2, … } 이렇게 쓸 수 없다.
int[ ] score; score = {10, 20, 30, 40, 50}
public static void main(String[] args) {
int[] num = new int[3]; // []는 앞뒤 자리 상관없음. 배열선언
num[0] = 10;
num[1] = 20;
num[2] = 30; // 규칙적인 숫자, 정해진 방갯수 -> for문으로 한번에
// num[3 =40; // 에러 ArrayIndexOutOfBoundException 예외, 멈춤
System.out.println(num[0]);
System.out.println(num[1]);
System.out.println(num[2]);
for (int i = 0; i < 3; i++) { // i<3 아니면 num.length; 가능
System.out.println("num[" + i + "]=" + num[i]);
}
// 확인만 - 문자열형태로 확인 Arrays.toString()
System.out.println(Arrays.toString(num)); // [10, 20, 30]
}
4. 배열의 출력
배열 이름을 바로 prinln()에 넣으면 I@41a4555e와 같은 값이 나온다.
char[] 배열은 배열 이름을 출력해도 저장된 내용이 출력된다. char[] 배열인 경우만!
1) for문 이용
- for문을 이용해 배열의 모든 요소 출력
public static void main(String[] args) {
int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
System.out.println("arr [" + i + "] = " + arr[i]);
}
}
- 문자열 형채로 출력 → Arrays.toString()
public static void main(String[] args) {
int[] arr = { 60, 70, 80, 90, 100 };
for (int i = 0; i < arr.length; i++) {
}
System.out.println(Arrays.toString(arr));
}
toString → 배열의 내용을 문자열로 바꿔준다.
Arrays.toString()를 하면 import java.util.Arrays; 가 생기는데 만약에 Arrays에 에러가 있으면 import문이 없는 것.
(단축키)Ctrl + Shift + O 하면 자동으로 import문을 추가해준다.
2) for each문 이용
- 배열 또는 컬렉션과 같이 다수의 원소를 가지고 있는 객체에서 원소를 하나씩 차례로 꺼내는 기능을 반복적으로 수행
public static void main(String[] args) {
int[] arr = { 10, 20, 30, 40, 50 };
for (int tmp : arr) {
System.out.println(tmp);
}
}
String 배열
가위바위보 예제
public static void main(String[] args) {
String[] strArr = { "가위", "바위", "보" };
System.out.println(Arrays.toString(strArr));
for (int i = 0; i < 5; i++) { // 5번 반복
int tmp = (int) (Math.random() * 3);
// System.out.println(tmp); 그냥 출력하면 숫자로 나온다.
System.out.println(strArr[tmp]);
}
}
Strign 클래스
- char[ ]와 메서드()를 결합한 것
- String 클래스는 내용을 변경할 수 없다.
public static void main(String[] args) {
// #1. char charAt(int index) //문자열에서 해당 인덱스에 있는 문자를 반환
String str = "ABCDE";
char ch = str.charAt(3); // str의 4번째문자(3번째 인덱스) 'D'를 저장
System.out.println(ch); // 실행 결과 : D
// #2. String substring(int from, int to) : to는 포함 안됨.
String str1 = "012345";
String tmp = str1.substring(1, 4); // 인덱스 범위 1~4까지의 문자들 반환
System.out.println(tmp); // 실행 결과 : 123
}
2차원 배열
- 가로 및 세로 방향으로 정렬된 배열
- 메모리는 데이터를 1차원으로만 저장 가능
- 2차원 데이터를 저장하기 위해서는 1차원(행 단위) 로 나누어 저장 2차원 배열은 1차원 배열의 배열이다.
📌 형식1) 타입[][] 참조변수명 = new 타입[행의 크기][열의 크기];
int[ ] [ ] arr = new int [2][3];
형식2) 타입[][] 참조변수명 = new 타입[행의 크기][]; //열의 크기 생략 가능
행의 길이 : 참조변수명.length
열의 길이 : 참조변수명[인덱스번호].length
public static void main(String[] args) {
int[][] arr = new int[2][3];
// 이중for문 이용
// 입력
for (int i = 0; i < arr.length; i++) { // 행
for (int j = 0; j < arr[i].length; j++) { // 열
arr[i][j] = (i + 1) * (j + 1) * 10; // 10, 20, 30, ...
}
}
// 출력
for (int i = 0; i < arr.length; i++) { // 행
for (int j = 0; j < arr[i].length; j++) { // 열
System.out.println(arr[i][j]); // 10, 20, 30, ...
}
}
// 한번에 출력 - Arrays.deepToString()
System.out.println(Arrays.deepToString(arr));
}
홍길동반 학생들의 성적은 다음과 같다.
이것을 이용하여 총점과 평균을 구하시오.
{ 100, 85, 96, 75,63 }
public static void main(String[] args) {
int sum = 0; // 총점 변수
int[] arr = { 100, 85, 96, 75, 63 };
// 배열에 담긴 값들을 꺼내와 합계 구하기
for (int i = 0; i < arr.length; i++) {
sum += arr[i]; // sum = sum + score[i]; 누적해서 더함
}
// 평균
double avg = (double) sum / arr.length;
// 출력
System.out.println("점수 총점 : " + sum);
System.out.println("점수 평균 : " + avg);
}

다음 자료의 최댓값과 최소값을 구하는 프로그램을 만들어라.
max -> 가장 작은 값을 담거나, 배열일 경우 0번째 인덱스 값을 담기
min -> 구하려는 범위의 값보다 월등히 큰 값을 담거나, 배열일 경우 0번째 인덱스 값 담기
점수(score) {73, 83, 96, 20, 15, 64, 72}
public static void main(String[] args) {
int[] score = { 73, 83, 96, 20, 15, 64, 72 };
int max = score[0]; // 73
int min = score[0];
for (int i = 1; i < score.length; i++) {
if (max < score[i]) { // 최대값
max = score[i];
} else if (min > score[i]) { // 최소값
min = score[i];
}
}
System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
}
💬
for문과 if문을 이용.
max와 min에 0번째 값이 담겨있으므로 1번째 값부터 비교했다.
score[i]가 max값보다 더 큰 경우 max에 저장하고 다음 인덱스와 비교 반복
socre[i]가 min값보다 더 작은 경우 min에 담고 비교 반복
학생 점수 분석 프로그램 만들기
import java.util.Scanner;
public class StudScoreProgram {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int studCount = 0; // 학생수
int[] score = null; // 점수입력 받아 저장할 공간
boolean run = true; // while문 실행여부(true-실행, false-종료)
// 입력 & 출력
while (run) {
System.out.println("======================================================");
System.out.println("1. 학생수ㅣ2. 점수입력ㅣ3. 점수리스트ㅣ4. 분석ㅣ5. 종료");
System.out.println("======================================================");
System.out.println("메뉴 선택 >>");
int selectNo = Integer.parseInt(scan.nextLine()); // 입력한 번호 문자열을 정수로 저장
if (selectNo == 1) { // 학생수
System.out.println("학생 수 입력 >>");
studCount = Integer.parseInt(scan.nextLine());
} else if (selectNo == 2) { // 점수입력
score = new int[studCount]; // 입력한 학생 수만큼의 배열을 생성해 score에 저장
for (int i = 0; i < score.length; i++) {
System.out.println((i + 1) + "번째 학생 점수 입력>>");
score[i] = Integer.parseInt(scan.nextLine()); // 점수를 정수로 변경해서 저장
}
} else if (selectNo == 3) { // 점수리스트
for (int i = 0; i < score.length; i++) {
System.out.println((i + 1) + "번째 학생 점수 = " + score[i]);
}
} else if (selectNo == 4) { // 분석 최고점수, 최저점수, 평균
int max = score[0];
int min = score[0]; // 인덱스 0번째로 초기화
int sum = 0; // 합계
for (int i = 0; i < score.length; i++) {
if (max < score[i]) {
max = score[i];
}
if (min > score[i]) {
min = score[i];
}
sum += score[i]; // 점수 누적해서 합계 구하기
} // end of for
double avg = (double) sum / studCount; // 평균
System.out.println("최고점수: " + max);
System.out.println("최저점수: " + min);
System.out.printf("평균: %.2f\n", avg);
} else if (selectNo == 5) { // 종료
System.out.println("종료합니다.");
run = false; // while문 종료하게.
} else {// 잘못 입력
System.out.println("잘못 입력하셨습니다. 다시 선택하세요>>");
}
} // end of while
}}

💬
메뉴 반복을 위해 while문을 사용. 실행 여부를 boolean타입으로 실행되거나 종료될 수 있게 함.
입력 받은 학생 수만큼 배열을 생성해 score 인덱스마다 점수를 입력받아 넣었음!
일부러 소수점일 때 어떻게 나올지 돌려봤더니 소수점이 끝도 없이 나와서 printf메소드로 출력함.
Arrays클래스
- 1차원 배열 비교 → equals()
- 2차원 배열 비교 → deepEquals(arr1,arr2)
- 배열에 저장된 값을 문자열로 출력 → toString(변수명)
- 2차원 배열 문자열로 출력 → deepToString(변수명)
배열 복사 → copyOf(), copyOfRange();
copyOf(arr, 복사할 요소의 갯수)
copyOfRange(arr, from, to) → to 숫자는 불포함
public static void main(String[] args) {
int[] arr = { 3, 2, 0, 1, 4 };
int[] arr1 = Arrays.copyOf(arr, arr.length);
System.out.println(Arrays.toString(arr1)); // [3, 2, 0, 1, 4]
int[] arr2 = Arrays.copyOfRange(arr, 1, 4);
System.out.println(Arrays.toString(arr2)); // [2, 0, 1] 4번째 포함X
}
배열 정렬 → sort()
public static void main(String[] args) {
int[] arr = { 3, 2, 0, 1, 4 };
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//결과 : [0, 1, 2, 3, 4]
}