본문 바로가기

Java/자바 기초

5. 배열

배열이란?

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이다.

변수와 달리 배열은 각 저장공간이 연속적으로 배치되어 있다.

배열의 선언와 생성

원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다.

대괄호[]는 타입 뒤에 붙여도 되고 변수이름 뒤에 붙여도 되는데, 타입에 붙이는 쪽을 선호한다.

  • 타입[] 변수이름, ex) int[] scores;
  • 타입 변수이름[], ex) int scores[];

배열을 선언한 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 ‘new’와 함께 배열의 타입과 길이를 지정해주어야 한다.

  • new 타입[길이]
int[] scores; //배열 선언
scores = new int[5] // 배열 생성. int 타입의 크기 5인 배열 생성

//아래와 같이 배열 선언 및 생성을 한 줄로 할 수 있고 대부분의 경우 이렇게 한다.
int[] scores = new int[5];

배열의 인덱스

- 생성된 배열의 각 저장공간을 ‘배열의 요소(element)’라고 하며, 배열이름[인덱스]의 형식으로 각 요소에 접근한다.

- 인덱스(index)는 배열의 요소마다 붙여진 일변번호로 각 요소를 구별하는데 사용된다.

- 인덱스의 범위는 0부터 ‘배열길이-1’까지이다.

- 번호는 1이아닌 0부터 시작한다.

배열의 길이(배열이름.length)

자바는 자바 가상 머신(JVM)이 모든 배열의 길이를 별도로 관리하며, ‘배열이름.length’를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.

int[] arr = new int[5]; //길이가 5인 int배열
int size = arr.length; //arr.length의 값은 5이고 size에 5가 저장된다.

배열은 한 번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다. 따라서 ‘배열이름.length’는 상수다. 즉, 값을 읽을 수만 있을 뿐 변경할 수 없다.

배열의 초기화

배열은 생성과 동시에 자동적으로 기본값으로 초기화되므로, 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만, 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해줘야 한다.

int[] scores = new int[3];
scores[0] = 50;
scores[1] = 60;
scores[2] = 70;

 

자바에서는 다음과 같이 배열을 간단히 초기화 할 수 있는 방법을 제공한다.

- 괄호{} 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호[] 안에 배열의 길이는 안적어도 된다.

  int[] scores = new int[]{50, 60, 70};

- ‘new 타입[]’을 생략하여 코드를 더 간단히 할 수도 있다.

int[] scores = {50, 60, 70}; //new int[] 생략.

- 다만 배열의 선언과 생성을 따로 하는 경우에는 생략할 수 없다.

int[] scores;
scores = {50, 60, 70}; //에러. new int[]를 생략할 수 없음.
scores = new int[]{50, 60, 70}; //OK.

배열의 출력

배열의 이름 자체를 출력하게 되면 ‘타입@주소’의 형식으로 출력된다.

int[] iArr = {50, 60, 70};
System.out.println(iArr); //[I@14318bb와 같은 형식의 문자열이 출력.

예외적으로 char배열은 println메서드로 출력하면 각 요소가 구분자 없이 그대로 출력되는데, 이것은 println메서드가 char배열일 때만 이렇게 동작하도록 작성되었기 때문이다.

char[] chArr = {'a', 'b', 'c'};
System.out.println(chArr); // abc가 출력된다.

‘Arrays.toString(배열이름)’메서드를 사용하면 배열의 모든 요소를 ‘[첫번째 요소, 두번째 요소, ...]’와 같은 형식의 문자열로 만들어서 반환한다.

int[] iArr = {50, 60, 70};
System.out.println(Arrays.toString(iArr)); //[50, 60, 70]이 출력된다.

String배열의 선언과 생성

- 배열의 타입이 String인 경우에도 int배열의 선언과 생성 방법은 다르지 않다.

  ex) String[] name = new String[3];

 

- 참조형 변수의 기본값은 null이므로 각 요소의 값은 null로 초기화된다.

  null은 어떠한 객체도 가리키고 있지 않다는 뜻이다.

String배열의 초기화

아래와 같이 각 요소에 문자열을 지정하면 된다.

String[] names = new String[3]; //길이가 3인 String 배열
names[0] = "Kim";
names[1] = "Park";
names[2] = "Yi";

괄호를 사용해서 다음과 같이 간단히 초기화 할 수도 있다.

String[] names = new String[]{"Kim", "Park", "Yi"};
//new String[]을 생략할 수 있다.
String[] names = {"Kim", "Park", "Yi"};

String 클래스

- 문자열이라는 용어는 ‘문자를 연이어 늘어놓은 것’을 의미하므로 문자배열인 char배열과 같은 뜻이다.

- char배열이 아닌 String클래스를 이용해서 문자열을 처리하는 이유는 String 클래스가 char배열에 여러 가지 기능을 추가하여 확장한 것이기 때문이다. String 클래스는 char배열에 기능(메서드)을 추가한 것이다.

- char배열과 String클래스의 한 가지 중요한 차이가 있는데, String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.

String str = "Java";
str = str + "8"; //"Java8"이라는 새로운 문자열이 str에 저장된다.
//문자열 str의 내용이 변경되는 것 같지만,
//문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성된다.

- 변경 가능한 문자열을 다루려면, StringBuffer클래스를 사용하면 된다.

String 클래스의 주요 메서드

char charAt(int index): 문자열에서 해당 위치(index)에 있는 문자를 반환한다.

String str = "ABCDE"
char ch = str.charAt(3); //문자열 str의 4번째 문자'D'를 char에 저장

 

int length(): 문자열의 길이를 반환한다.

String str = "ABCDE";
int size = str.length(); //size에 5가 저장된다.

 

String substring(int from, int to): 문자열에서 해당 범위 (from~to)의 문자열을 반환한다. (to는 포함 안됨)

String str = "012345";
String temp = str.substring(1,4); //str에서 index범위 1~4의 문자들을 반환.
System.out.println(temp); //"123"이 출력된다.

 

boolean equals(Object obj): 문자열의 내용이 같은지 확인한다. 같으면 true, 다르면 false.

String str = "ABCDE";
if(str.equals("ABCDE")){ //str와 "ABCDE"의 내용이 같은지 확인한다.
        ...
}

 

char[] toCharArray(): 문자열을 문자배열(char[])로 변환해서 반환한다.

String str = "ABC";
char[] chArray = str.toCharArray(); //{'A', 'B', 'C'}를 chArray에 저장한다.

2차원 배열의 선언

- 2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 대괄호[]가 하나 더 들어갈 뿐이다.

- 타입[][] 변수이름; ex) int[][] scores;

- 3차원 이상의 고차원 배열의 선언은 대괄호[]의 개수를 차원의 수만큼 추가해 주기만 하면 된다.

- 2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며, 만일 4행 3열의 데이터를 담기 위한 배열을 생성하려면 다음과 같이 한다.

int[][] scores = new int[4][3]; //4행 3열의 2차원 배열을 생성한다.

2차원 배열의 인덱스

2차원 배열의 각 요소에 접근하는 방법은 ‘배열이름[행index][열index]’이다.

2차원 배열의 초기화

2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호{}를 한번 더 써서 행별로 구분해준다.

 

int[][] scores = new int[][]{{1,2,3},{4,5,6}};
int[][] scores = {         //new int[][]가 생략됨.
				  {1,2,3}, //행별로 줄 바꿈을 해주는 것이 보기도 좋고 이해하기 쉽다.
				  {4,5,6}
						  };

Arrays로 배열 다루기

배열의 출력 toString(), deepToString()

- toString() 일차원 배열의 모든 요소를 문자열로 편하게 출력할 수 있다.

- deepToString 다차원 배열은 deepToString을 사용해야 한다. 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성한다.

int[] arr1 = {1,2,3};
System.out.println(Arrays.toString(arr)); //[1,2,3] 출력

int[][] arr2 = {         
	{1,2,3}, 
	{4,5,6}
	};
System.out.println(Arrays.deepToString(arr2)); //[[1, 2, 3], [3, 4, 5]] 출력

배열의 비교 equals(), deepEquals()

- equals()는 두 배열에 저장된 모든 요소를 비교해서 같으면 ture, 다르면 false를 반환한다.

- equals()도 일차원 배열에만 사용 가능하다.

- deepEquals()는 다차원 배열의 비교에 사용된다.

int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(Arrays.equals(arr,arr2)); //true 출력


int[][] arr3 = {         
	{1,2,3}, 
	{4,5,6}
};

int[][] arr4 = {         
	{1,2,3}, 
	{4,5,6}
};
System.out.println(Arrays.deepEquals(arr3,arr4)); //true 출력

배열의 복사 copyOf(), copyOfRange()

- copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 만들어 반환한다.

- copyOfRange()에 지정된 범위의 끝은 포함되지 않는다.

int[] arr = {0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2=[0,1,2,3,4]
int[] arr3 = Arrays.copyOf(arr, 3);          //arr3=[0,1,2]
int[] arr4 = Arrays.copyOf(arr, 7);          //arr4=[0,1,2,3,4,0,0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);  //arr5=[2,3]  <- 4는 불포함
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);  //arr6=[0,1,2,3,4,0,0]

배열의 정렬 sort()

- 배열을 정렬할 때는 sort()를 사용한다.

int[] arr = {3,2,0,1,4};
Arrays.sort(arr); //배열 arr을 정렬한다.
System.out.println(Arrays.toString(arr)); //[0,1,2,3,4]

'Java > 자바 기초' 카테고리의 다른 글

7. 객체지향 프로그래밍 II  (0) 2022.03.11
6. 객체지향 프로그래밍 I  (0) 2022.03.11
4. 조건문과 반복문  (0) 2022.03.11
3. 연산자  (0) 2022.03.11
2. 변수  (0) 2022.03.11