| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 코딩테스트사이트추천
- 데이터베이스
- 개발자루틴
- 갭체크
- Java
- 프로그래밍 언어
- 자료구조
- 플로이드-워셜
- 개발자취업
- 코드트리
- 코딩테스트
- 웹
- 자바
- C
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- til
- 1일1코테
- 자바스크립트
- 운영체제
- 알고리즘
- 프로그래머스
- 코딩테스트준비
- 항해99
- 99클럽
- 티스토리챌린지
- 코테공부
- 오블완
- 인접 행렬
- 파이썬
- 연결 리스트
- Today
- Total
와드의 블로그
Chapter 5. 배열 본문
1. 배열
1.1 배열이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 많은 양의 데이터를 저장하기 위해서, 그 데이터의 숫자만큼 변수를 선언해야 한다면 상당히 곤혹스러울 것이다. 이런 경우에 배열을 사용하면 많은 양의 데이터를 손쉽게 다룰 수 있다.
1.2 배열의 선언과 생성
※ 배열의 선언
배열을 선언하는 방법은 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호를 붙이면 된다. 대괄호는 타입 뒤에 붙여도 되고 변수 이름 뒤에 붙여도 된다.
int[] score;
int score[];
※ 배열의 생성
배열을 선언한 다음에는 배열을 생성해야 한다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다. 배열을 생성하기 위해서는 new 연산자와 함께 배열의 타입과 길이를 지정해 주어야 한다. 배열을 생성하면 배열의 요소는 자동적으로 기본값으로 초기화된다.
int[] score;
score = new int[5];
// int[] score = new int[5]; 배열의 선언과 생성을 동시에 할 수도 있다.
1.3 배열의 길이와 인덱스
※ 배열의 인덱스
생성된 배열의 각 저장 공간을 배열의 요소라고 하며, '배열 이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는 데 사용된다. 인덱스는 1이 아니라 0부터 시작한다.
배열을 다룰 때 한 가지 주의할 점은 배열의 범위를 벗어닌 값을 인덱스로 사용하지 않아야 한다는 것이다. 유효한 범위를 벗어난 값을 인덱스로 사용하면 런타임 에러가 발생한다.
public class Array {
public static void main(String[] args) {
int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
for(int i = 0; i < 5; i++)
System.out.printf("score[%d]: %d%n", i, score[i]);
}
}
※ 배열의 길이
배열을 생성할 때 대괄호 안에 배열의 길이를 적어줘야 한다. 배열의 길이는 배열의 요소의 개수이다. 당연하게도 배열의 길이는 양의 정수이어야 한다. 그런데 길이가 0인 배열도 생성이 가능하다.
자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다. 배열은 한 번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성한 배열의 길이는 변하지 않는다.
public class Array {
public static void main(String[] args) {
int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
for(int i = 0; i < score.length; i++)
System.out.printf("score[%d]: %d%n", i, score[i]);
}
}
배열은 한 번 생성하면 길이를 변경할 수 없기 때문에 배열에 저장할 공간이 부족한 경우에는 더 큰 길이의 새로운 배열을 생성한 다음, 기존 배열에 저장된 값들을 새로운 배열에 복사해야 한다. 이러한 작업은 꽤 비용이 많이 들기 때문에, 처음부터 배열의 길이를 넉넉하게 잡는 것이 좋다.
1.4 배열의 초기화
배여은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화된다. 그렇다면 원하는 값으로 배열을 초기화하려면 어떻게 해야 할까?
원하는 값을 저장하려면 인덱스를 통해 각 요소마다 값을 지정한다.
int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;
저장하려는 값에 일정한 규칙이 있다면 for문으로 배열을 초기화할 수 있다.
int[] score = new int[5];
for(int i = 0; i < score.length; i++)
score[i] = 50 + i * 10;
또한 중괄호를 통해 배열을 간단히 초기화할 수도 있다.
int[] score = new int[] { 50, 60, 70, 80, 90 }; // 이 경우 배열의 길이를 생략해도 자동으로 결정된다.
int[] score = { 50, 60, 70, 80, 90 }; // new int[]를 생략할 수도 있다.
// 단 배열의 선언과 생성을 따로 하는 경우에는 new int[]를 생략할 수 없다.
int[] score;
score = new int[] { 50, 60, 70, 80, 90 };
※ 배열의 출력
배열에 저장된 값을 확인할 때는 for문을 사용한다.
int[] arr = { 100, 95, 80, 70, 60 };
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
더 간단한 방법은 'Arrays.toString(배열이름)' 메서드를 사용하는 것이다. 이 메서드는 배열의 모든 요소를 '[첫 번째 요소, 두 번째 요소, ...]'와 같은 형식의 문자열로 만들어서 반환한다.
int[] arr = { 100, 95, 80, 70, 60};
System.out.println(Arrays.toString(arr));
만일 배열의 값을 바로 출력하면 '타입@주소'의 형식으로 참조 변수에 저장된 주소 값이 출력된다. 예외적으로 char형 배열은 println으로 출력하면 각 요소가 구분자 없이 그대로 출력된다.
1.5 배열의 복사
배열은 한 번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야 한다.
for문을 이용하면 배열을 복사할 수 있다.
public class Array {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println("변경 전");
System.out.println("arr.length: " + arr.length);
for(int i = 0; i < arr.length; i++)
System.out.printf("arr[%d]: %d%n", i, arr[i]);
int[] tmp = new int[arr.length * 2];
for(int i = 0; i < arr.length; i++)
tmp[i] = arr[i];
arr = tmp;
System.out.println("변경 후");
System.out.println("arr.length: " + arr.length);
for(int i = 0; i < arr.length; i++)
System.out.printf("arr[%d]: %d%n", i, arr[i]);
}
}
for문 대신 System.arraycopy를 사용하면 보다 간단하고 빠르게 배열을 복사할 수 있다. for문은 배열의 요소 각각에 접근하여 복사하지만, arraycopy는 지정된 범위의 값들을 한 번에 복사한다.
public class Array {
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);
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);
}
}
2. String 배열
2.1 String 배열의 선언과 생성
배열의 타입이 String인 경우에도 int형 배열과 선언과 생성 방법은 다르지 않다.
String[] name = new String[3];
String타입의 변수는 참조형 변수이므로 배열의 각 요소는 null로 초기화된다.
2.2 String 배열의 초기화
초기화 역시 int형 배열과 동일한 방법으로 한다. 배열의 각 요소에 문자열을 저장한다.
String[] name = new String[3];
name[0] = new String("Kim");
name[1] = new String("Park");
name[2] = new String("Lee");
String도 클래스이므로 new 연산자를 통해 객체를 생성해야 하지만 특별히 String 클래스만 큰따옴표만으로 간략히 표현하는 것을 허용한다.
String[] name = new String[3];
name[0] = "Kim";
name[1] = "Park";
name[2] = "Lee";
중괄호를 사용해서 간단히 초기화할 수도 있다.
String[] name = new String[] {"Kim", "Park", "Lee"}; // new String[] 생략 가능
2.3 char 배열과 String 클래스
지금까지 문자열을 저장할 때 String 타입의 변수를 사용했다. 사실 문자열은 문자 배열인 char 배열과 같은 뜻이다. String 클래스는 char 배열에 여러 기능(메서드)을 추가하여 확장한 것이기 때문에 String 클래스를 이용해서 문자열을 처리하는 것이 편리하다.
char 배열과 String 클래스의 한 가지 중요한 차이는 String 객체는 내용을 변경할 수 없지만 char 배열은 내용을 변경할 수 있다는 것이다.
※ String 클래스의 주요 메서드
String 클래스는 상당히 많은 문자열 관련 메서드를 제공한다. 다음은 기본적인 메서드들이다.
- char charAt(int index): 문자열에서 해당 위치에 있는 문자를 반환한다.
- int length(): 문자열의 길이를 반환한다.
- String substring(int from, int to): 문자열에서 해당 범위에 있는 문자열을 반환한다.([from, to))
- boolean equals(Object obj): 문자열의 내용이 obj와 같은지 확인한다. 같으면 true, 다르면 false를 반환한다.
- char[] toCharArray(): 문자열을 문자 배열로 변환해서 반환한다.
※ char 배열과 String 클래스의 변환
가끔 char 배열을 String 클래스로 변환하거나, 또는 그 반대를 해야 하는 경우가 있다. 그럴 때는 다음과 같이 하면 된다.
char[] chArr = {'A', 'B', 'C'};
String str = new String(chArr); // char 배열 -> String
char[] tmp = str.toCharArray(); // string -> char 배열
2.4 커맨드 라인을 통해 입력받기
Scanner 클래스의 nextLine 외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있다. 커맨드 라인을 이용한 방법이다. 프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다.
만일 실행할 프로그램의 main 메서드가 담긴 클래스 이름이 MainTest라고 가정하면 다음과 같이 cmd에서 커맨드 라인을 통해 입력받을 수 있다.
c:\... >java MainTest abc 123
커맨드라인을 통해 입력된 문자열은 String 배열에 담겨서 main 메서드의 args에 전달된다. 그리고 main 메서드 내에서 args[0], args[1]과 같은 방식으로 커맨드 라인으로부터 전달받은 문자열에 접근할 수 있다.
※ 이클립스에서 커맨드 라인을 통해 입력받기
https://skillazit.tistory.com/2
이클립스 명령행 인자(command-line arguments) 입력 방법
위 코드에서 args[0]을 명령행 인자(command-line arguments)라고 부릅니다. 명령행 인자는 클래스를 실행할 때, 커맨드 뒤에 함께 입력하는 값을 의미하죠. 이클립스에서 명령행 인자를 입력받기 위해서
skillazit.tistory.com
3. 다차원 배열
3.1 2차원 배열의 선언과 인덱스
2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 대괄호가 하나 더 들어갈 뿐이다.
int[][] score = new int[4][3];
2차원 배열은 행과 열로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다. 2차원 배열의 각 요소에 접근하는 방법은 '배열이름[행index][열index]'이다.
int[][] score = new int[4][3];
score[0][0] = 100;
System.out.println(score[0][0]; // 100
3.2 2차원 배열의 초기화
2차원 배열도 중괄호를 사용해서 생성과 초기화를 동시에 할 수 있다.
int[][] arr = new int[][] { // new int[][] 생략 가능
{1, 2, 3},
{4, 5, 6}
};
2차원 배열은 배열의 배열로 구성되어 있다. 즉, 여러 개의 1차원 배열을 묶어서 또 하나의 배열로 만든 것이다. 따라서 for문을 통해서 2차원 배열을 초기화하려면 다음과 같이 하면 된다.
int[][] score = new int[5][3];
for(int i = 0; i < score.length; i++) {
for(int j = 0; j < score[i].length; j++)
score[i][j] = 10;
}
3.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];
위 코드와 같이 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
| 자바 String 메서드 정리 (0) | 2024.10.31 |
|---|---|
| Chapter 6. 객체지향 프로그래밍 1 (0) | 2022.12.05 |
| Chapter 4. 조건문과 반복문 (0) | 2022.11.28 |
| Chapter 3. 연산자 (0) | 2022.11.24 |
| Chapter 2. 변수 (0) | 2022.11.23 |