1. 배열(array)
1.1 배열(array)이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 ‘배열(array)’이라고 한다.
여기서 중요한 것은 ‘같은 타입’이어야 한다는 것
int score1, score2, score3, score4, score5;
↓변수 대신 배열을 이용하면 다음과 같인 간단하게 처리할 수 있다.
int[] score = new int[5]; // 5개의 int 값을 저장할 수 있는 배열을 생성한다.
변수 score는 배열을 다루는데 필요한 참조변수일 뿐 값을 저장하기 위한 공간은 아니다.
변수와 달리 배열은 각 저장공간이 연속적으로 배치되어 있다는 특징이 있다.
1.2 배열의 선언과 생성
- 배열의 선언 - 배열을 다루기 위한 참조변수의 선언
- 생성해야 실제로 저장공간이 만들어짐
배열을 선언하는 방법은 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호 [ ] 를 붙이면 된다.
대괄호 [ ] 는 타입 뒤에 붙여도 되고 변수이름 뒤에 붙여도 된다.
대괄호가 변수의 이름의 일부라기보다는 타입의 일부라고 보기 때문에 타입 앞에 붙이는 쪽을 선호
배열의 생성
배열을 선언한 다음에는 배열을 생성해야 한다.
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.
배열을 생성하기 위해서는 연산자 ‘new’와 함께 배열의 타입과 길이를 지정해 주어야 한다.
- 타입[ ] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언)
- 변수이름 = new 타입[길이]; // 배열을 생성(실제 저장공간을 생성)
//길이가 5인 int배열을 생성
①int[] score; //int타입의 배열을 다루기 위한 참조변수 score선언
②score = new int[5]; //int타입의 값 5개를 저장할 수 있는 배열
1. int[] score;
int형 배열 참조변수 score를 선언한다.
데이터를 저장할 수 있는 공간은 아직 마련되지 않았다.
2. score = new int[5];
연산자 'new'에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.
그리고 각 배열요소는 자동적으로 int의 기본값(default)인 0으로 초기화된다.
끝으로 대입 연산자 ‘=’에 의해 배열의 주소가 int형 배열 참조변수 score에 저장된다.
1.3 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 ‘배열의 요소(element)’라고 하며, ’배열이름[인덱스]’의 형식으로 배열의 요소에 접근한다.
인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.
“인덱스(index)의 범위는 0부터 ‘베열길이-1’까지.”
\배열의 또 다른 장점은 index로 상수 대신 변수나 수식도 사용할 수 있다는 것이다.
int tmp = score[i+1];
배열을 다룰 때 한 가지 주의 할 점은 index의 범위를 벗어난 값을 index로 사용하지 않아야 한다는 것이다.
*java.lang.ArrayIndexOutOfBoundsException 배열의 인덱스가 유효한 범위를 넘었다는 뜻
배열의 길이
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다.
타입[] 배열이름 = new 타입[길이];
int[] arr = new int[5]; // 길이가 5인 int배열
int[] arr = new int[0]; // 길이가 0인 배열도 생성이 가능하다!!!
배열이름.length
자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, ‘배열이름.length’를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.
int[] arr = new int[5]; // 길이가 5인 int배열
int tmp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다.
배열은 한번 생성하면 길이를 변경할 수 없다.(실행하기 전에 처음에 만들때는 변경 가능) 따라서 ‘배열이름.length’는 상수다. 즉, 값을 읽을 수만 있을 뿐 변경할 수 없다.
모든 경우에 배열의 길이를 직접 적어주는 것보다 ‘배열이름.length’를 사용하는 것이 코드의 관리가 쉽고 에러가 발생할 확률이 적어진다.
배열의 길이 변경하기
배열의 길이를 변경하는 방법
- 더 큰 배열을 새로 생성한다.
- 기존 배열의 내용을 새로운 배열에 복사한다.
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화된다.
배열의 길이가 큰 경우에는 요소 하나하나에 값을 지정하기 보다는 for문을 사용하는 것이 좋다.
배열의 길이가 크지 않을 때
저장할 값들을 괄호 {} 안에 쉽표로 구분해서 나열하면 되며, 괄호 {} 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호 [] 안의 배열의 길이는 안적어도 된다.
①int[] score = new int[]( 50, 60, 70, 80, 90 };
②int[] score = { 50, 60, 70, 80, 90 }; //new int[]를 생략할 수 있음(99%사용)
*배열의 선언과 생성을 따로 하는 경우에는 생략할 수 없다
또 다른 예로, 아래와 같이 매개변수로 int배열을 받는 add메서드가 정의되어 있고 이 메서드를 호출해야할 경우 역시 ‘new 타입[]’을 생략할 수 없으며, 이유는 같다
int add(int[] arr) {/*내용 생략*/} //add 메서드
int result = add(new int[]{100, 90, 80, 70, 60}); //OK
int result = add({100, 90, 80, 70, 60}); //에러. new int[]를 생략할 수 없음
배열의 출력
1. for문을 사용
int[] iArr = { 100, 95, 80, 70, 60 };
// 배열의 요소를 순서대로 하나씩 출력
for(int i=0; i<iArr.length; i++){
System.out.println(iArr[i]);
}
2. ‘Arrays.toString(배열이름)’메서드를 사용
이 메서드는 배열의 모든 요소를 ‘[첫번째 요소, 두번째 요소, …]’와 같은 형식의 문자열로 만들어서 반환한다.
iArr의 값을 바로 출력하면? [I@14318bb와 같은 형식의 문자열이 출력된다. ’[I’는 1차원 int배열이라는 의미이고, ‘@’뒤에 나오는 16진수는 배열의 주소인데 실제 주소가 아닌 내부 주소이다.
1.5 배열의 복사
1. 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이 새로운 배열을 가리키게 한다.
2. System.arraycopy()를 이용한 배열의 복사
arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다.
배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.
System.arraycopy(num, 0, newNum, 0, num.length);
//num[0]에서 newNum[0]으로 num.length개의 데이터를 복사
2. String배열
2.1 String배열의 선언과 생성
String[] name = new String[3]; // 3개의 문자열을 담을 수 있는 배열을 생성한다.
위 문장을 수행한 결과를 그림으로 표현하면 다음과 같다.
2.2 String배열의 초기화
배열의 각 요소에 문자열을 지정하면 된다.
String[] name = new String[3]; //길이가 3인 String배열을 생성
name[0] = "Kim";
name[1] = "Park";
name[2] = "Yi";
//간단히 초기화
String[] name = new String[]{"Kim", "Park", "Yi"}; //x
String[] name = {"Kim", "Park", "Yi"}; // new String[]을 생략할 수있음√
원래 Sting은 클래스이므로 new연산자를 통해 객체를 생성해야하지만 특별히 String클래스만 “Kim”과 같이 큰따움표만으로 간략히 표현하는 것이 혀용된다.
기본형 배열이 아닌 경우, 즉, 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이다.
참조형 배열을 객체 배열이라고도 한다.
❗참조형 변수를 간단히 참조변수라고도 하며, 모든 참조형 변수에는 객체가 메모리에 저장된 주소인 4byte의 정수값(0x0~0xffffffff) 또는 null이 저장된다.
2.3 char배열과 String클래스
String클래스는 char배열에 기능(메서드)을 추가한 것이다.
char배열과 String클래스의 한 가지 중요한 차이가 있는데,
String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.
문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성된다.
❗변경 가능한 문자열을 다루려면, StringBuffer클래스를 사용
String클래스의 주요 메서드
메서드 | 설명 |
char charAt(int index) | 문자열에서 해당 위치(index)에 있는 문자를 반환한다. |
int length() | 문자열의 길이를 반환한다. |
String substring(int from, int to) | 문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위에 포함되지 않음) |
boolean equals(Object obj) | 문자열의 내용이 obj와 같은지 확인한다. 같으면 true 다르면 false 반환 |
char[] toCharArray() | 문자열을 문자배열(char[])로 변환해서 반환한다. |
3. 다차원 배열
3.1 2차원 배열의 선언과 인덱스
❗3차원이상의 고차원 배열의 선언은 대괄호[]의 개수를 차원의 수만큼 추가해 주기만 하면 된다.
2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용된다.
int[][] score = new int[4][3]; // 4행 3열의 2차원 배열을 생성한다.
실제로는 배열요소의 타입인 int의 기본값인 0이 저장된다.(자동저장)
2차원 배열의 index
2차원 배열은 행(row)과 열(column)로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다.
2차원 배열의 각 요소에 접근하는 방법은 ‘배열이름[행index][열index]’이다.
score[0][0] = 100; // 배열 score의 1행 1열에 100을 저장
System.out.println(score[0][0]); // 배열 score의 1행 1열의 값을 출력
3.2 2차원 배열의 초기화
int[][] arr = new int[][]{{1,2,3}, {4,5,6}}; x
int[][] arr = {{1,2,3}, {4,5,6}}; // new int[][]가 생략됨√
//가능하면 행별로 줄 바꿈을 해주는 것이 보기도 좋고 이해하기 쉽다.
int[][] arr = {
{1,2,3},
{4,5,6}
};3
3.3 가변 배열
2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.
출처 : 남궁성. 「자바의 정석」. 도우출판. 2016
'프로그래밍언어 > Java' 카테고리의 다른 글
[자바의 정석] 06. 객체지향 프로그래밍Ⅰ(2) (0) | 2023.07.31 |
---|---|
[자바의 정석] 06. 객체지향 프로그래밍Ⅰ(1) (0) | 2023.07.29 |
[자바의 정석] 04. 조건문과 반복문 (0) | 2023.07.27 |
[자바의 정석] 03. 연산자(Operator) (0) | 2023.07.27 |
[자바의 정석] 02. 변수(Variable) (0) | 2023.07.26 |