-
Java의 정석 정리 (05장)LANGUAGE/Java, Spring 2024. 12. 2. 18:37
Ch 05. 배열1. 배열
1.1 배열(array)이란?
"배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것" 배열은 변수와 달리 각 저장공간이 연속적으로 배치되어 있다.
1.2 배열의 선언과 생성
선언 방법 선언 예시 타입[] 변수이름; int[] score;
String[] name;타입 변수이름[]; int score[];
String name[];선언은 단지 배열을 다루기 위한 참조변수를 위한 공간을 만드는 것. 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.
배열의 생성을 위해 연산자 'new'를 사용해 배열의 타입과 길이를 지정한다.
각 배열요소는 자동적으로 int의 default 값인 0으로 초기화 된다.
타입[] 변수이름; // 배열 선언 변수이름 = new 타입[길이]; // 배열 생성 // ex) int[] score = new int[5]; // 배열 선언과 동시에 생성
1.3 배열의 길이와 인덱스
배열의 각 저장공간을 '요소(element)'라고 하며, 배열이름[index] 형식으로 요소에 접근한다. 인덱스는 1이 아닌 0부터 시작한다.
int[] score = new int[5]; // 길이가 5인 int배열 score[3] = 100; // 배열 score의 4번째 요소에 100을 저장 int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장
* 인덱스의 범위가 넘어가는 값을 출력해도 컴파일 시에 문제가 발생하지 않는다. 실행 시에는 에러(ArrayIndexOutOfBoundsException)가 발생한다.
* 배열의 길이는 양의 정수이고, 최대값은 int의 최대값인 약 20억이다. 0도 가능하다.
* JVM이 모든 배열의 길이를 별도로 관리한다. '배열이름.length'를 통해 길이를 알 수 있다. 생성된 배열의 길이는 변하지 않기 때문에 '배열이름.length'도 상수다. 즉, 값을 읽을 수만 있고 변경하지 못한다. for문에서 배열의 길이를 하드코딩하는 것보다 length를 사용하는 것이 더 편리하다.
public class MyClass { public static void main(String args[]) { int[] score = new int[6]; for (int i=0; i<score.length; i++) { System.out.println(score[i]); } } }
* 배열의 공간이 부족할 경우
1. 더 큰 배열을 새로 생성
2. 기존 배열의 내용을 새로운 배열에 복사
1.4 배열 초기화
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}; score = {50, 60}; // error
* 매개변수로 int배열을 받는 메서드가 정의되어 있고, 이 메서드를 호출해야 할 경우도 생략 불가능
int add(int[] arr) {/* 내용 생략 */} // add메서드 int result = add(new int[] {100,90,80}; // ok int result = add({100,90,80}) // error
* 배열의 저장된 값을 확인할 때 for문으로 일일히 확인하지 않고, 'Arrays.toString(배열이름)'메서드 사용 가능.
int[] iArr = {100,90,80}; System.out.println(Arrays.toString(iArr)); // iArr은 참조변수라서, '배열의 주소'가 출력될 것으로 예상할 수 있지만 // '타입@주소' 형식으로 출력된다.
1.5 배열의 복사
* for문 사용
int[] arr = new int[5]; int[] tmp = new int[arr.length * 2]; // 기존 배열보다 2배인 배열 생성 for (int i=0; i<arr.length; i++) { tmp[i] = arr[i]; // arr[i]의 값을 tmp[i]에 저장 } arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다.
* for문 대신 System 클래스의 arraycopy() 메서드를 사용하면 간단하고 빠르게 배열 복사 가능. for문은 배열의 요소 모두에 접근하지만 arraycopy()는 지정된 범위의 값들을 통째로 복사.
System.arraycopy(num, 0, newNum, 0, num.length); // num[0]에서 newNum[0]으로 num.legnth개의 데이터 복사
ex)
더보기public class ArrayEx04 { 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); } }
2. String 배열
* 배열의 타입이 String인 경우에도 생성과 선언은 int배열과 다르지 않다.
String[] name = new String[] {"Kim", "Park", "Yi"}; String[] name = {"Kim", "Park", "Yi"};
ex)
더보기public class ArrayEx12 { public static void main(String[] args) { String[] names = {"kims", "Parks", "Yi"}; for (int i=0; i < names.length; i++) { System.out.println("names[" + i + "]: " + names[i]); } String tmp = names[2]; System.out.println("tmp : " + tmp); names[0] = "Yu"; for (String str : names) { System.out.println(str); } } }
* 배열을 생성할 경우 참조변수를 저장하기 위한 공간이 만들어지고, 기본값은 'null'로 초기화된다. (int배열은 '0'으로 초기화)
* 주요 메서드
메서드 설명 char charAt(int index) 문자열에서 해당 위치에 있는 문자를 반환 int length() 문자열의 길이 반환 String substring(int from, int to) 문자열에서 해당 범위(from~to)에 있는 문자열 반환 boolean equals(Object obj) 문자열의 내용의 obj와 같은지 확인 char[] toCharArray() 문자열을 문자배열(char[])로 변환해서 반환 ex)
더보기char[] chArr = {'A', 'B', 'C'}; String str = new String(chArr) // char배열 -> String char[] tmp = str.toCharArry(); // String -> char배열
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); System.out.println("src.charAt(" + i + ") : " + ch); } char[] chArr = src.toCharArray(); System.out.println(chArr); } }
* Scanner 클래스 말고도 커맨드 라인을 통해 사용자로부터 값을 입력받을 수 있다. 프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 문자열을 전달한다. 문자열은 String배열에 담겨서 main() 메서드의 매개변수(args)에 전달된다. 숫자를 입력해도 문자열로 처리된다.
3. 다차원 배열
선언 방법 선언 예 타입[][] 변수이름; int[][] score; 타입 변수이름[][]; int score[][]; 타입[] 변수이름[]; int[] score[]; * 2차원 배열은 주로 테이블 형태의 데이터를 담고, 행(row) 인덱스와 열(column) 인덱스로 나눈다.
* 2차원 배열 초기화
int[][] arr1 = new int[][] { {1, 2, 3}, {4, 5, 6}}; int[][] arr2 = { {1, 2, 3}, {4, 5, 6}};
* for문을 사용한 초기화
더보기public class ArrayEx18 { public static void main(String[] args) { int[][] score = { {100, 100, 100}, {20, 20, 20}, {30, 30, 30}, {40, 40, 40} }; int sum = 0; for (int i=0; i < score.length; i++) { for (int j=0; j < score[i].length; j++) { System.out.printf("score[%d][%d] = %d%n", i, j, score[i][j]); } } for (int[] tmp : score) { for (int i : tmp) { sum += i; } } System.out.println("sum = " + sum); } }
* 가변 배열
: 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];
'LANGUAGE > Java, Spring' 카테고리의 다른 글
Java Enum (0) 2024.12.03 mvc2( java, jsp, mybatis) (0) 2024.12.02 Java의 정석 정리 (06장) (0) 2024.12.02 Java의 정석 정리 (04장) (1) 2024.12.02 Java의 정석 정리 (01~03장) (1) 2024.12.02