본문 바로가기
개발언어/Java : 자바

자바 쉽게 배우기 5 - 배열

by 개발자D 2023. 1. 4.

배열

배열 Array

배열

배열은 같은 타입의 여러 데이터를 하나로 묶어 보관하는 구조입니다. 데이터들은 Index라는 번호를 통해 구분됩니다.

배열은 자바 쉽게 배우기 2 - 변수에서 설명한 참조 타입에 속합니다. 따라서 배열 변수에는 메모리 주소가 저장됩니다.

배열 선언

변수 선언과 생성, 초기화를 기억하시나요? 배열 선언과 생성은 변수와 비슷하지만 대괄호([])가 사용된다는 차이점이 있습니다.
배열의 타입을 지정하여 타입에 맞는 크기의 저장 공간이 확보되게 하고, 배열에 이름을 붙여줍니다.

타입[] 변수이름;
타입 변수이름[];

두 방법 모두 가능합니다.
int[] arrName;
int arrName[];

배열 생성

값을 저장할 수 있는 공간을 만들어 줍니다.

한 번 생성된 배열을 그 길이를 수정할 수 없습니다.

참조타입은 new 키워드를 사용해 생성합니다.

변수이름 = new 타입[길이];
arrName = new int[5];

배열 초기화

배열에 데이터 값을 저장합니다.

배열의 index는 0부터 시작한다는 사실을 기억하세요. 길이가 5인 배열에서는 0부터 4까지의 인덱스가 생성되고, 5개의 데이터를 입력할 수 있습니다. 배열의 인덱스를 사용하여 배열의 각 저장공간에 접근할 수 있습니다.

arrName[0] 은 arrName 배열의 첫 번째 요소입니다.
arrName[1] 은 arrName 배열의 두 번째 요소입니다.
arrName[2] 은 arrName 배열의 세 번째 요소입니다.
arrName[3] 은 arrName 배열의 네 번째 요소입니다.
arrName[4] 은 arrName 배열의 다섯 번째 요소입니다.

 

인덱스마다 값 초기화하기

int[] arrName = new int[5];
arrName[0] = 10;
arrName[1] = 20;
arrName[2] = 30;
arrName[3] = 40;
arrName[4] = 50;

 

인덱스로 접근한 각 요소에 직접 데이터를 저장해 주는 방법입니다.

 

반복문을 사용해서 배열 초기화하기

for(int i = 0; i < arrName.length; i++){
	arrName[i] = i * 10;
}

arrName.length 는 배열의 길이를 나타냅니다. 위에서 배열의 길이를 5로 설정했으니 arrName.length 도 5가 됩니다. i가 0부터 4까지 커지면서 각 인덱스마다 0, 100, 200, 300, 400의 값이 저장됩니다.
일정한 규칙이 있을 때 사용하면 좋습니다.

 

배열 집합을 사용하여 초기화하기

int[] arrName = {10, 20, 30, 50, 80};
// int[] arrName = new int[] {10, 20, 30, 50, 80}; 에서 new int[]가 생략된 형태

중괄호로 묶인 데이터집합을 사용해 초기화할 수 있습니다. 선언과 생성, 초기화를 동시에 할 경우에만 new int[]를 생략할 수 있습니다.

배열을 초기화하지 않으면 자신의 타입에 해당하는 기본값으로 초기화됩니다.

 

자료형 기본값

자료형 기본값
boolean false
char ‘\u0000’
byte, short, int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수 null

 


배열 길이

배열 길이는 배열이름.length로 확인할 수 있습니다. 위의 예시처럼 반복문의 조건식에서 사용되는 경우가 많습니다.

배열 길이의 최소 크기는 0이며, 최대 크기는 int형의 최댓값(약 21억)과 같습니다.

배열의 출력

Arrays.toString(배열이름) 메서드를 사용하여 출력합니다.

[첫 번째 요소, 두 번째 요소, …, 마지막요소]
import java.util.*;

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

System.out.println(Arrays.toString(arr));
// [1, 2, 3, 4, 5]

 

Arrays.toString() 메서드를 사용하지 않을 경우 배열의 참조변숫값이 출력됩니다.

예외적으로 char배열은 Arrays.toString() 메서드 없이도 출력이 가능한데, 출력하면 각 요소가 구분자 없이 그대로 출력됩니다.

int[] arrNum = {1, 2, 3, 4};
System.out.println(arrNum);
// [I@1b6d3586

char[] arrChar = {'a', 'b', 'c', 'd'};
System.out.println(arrChar);
// abcd

배열의 복사

System.arraycopy() 메서드를 사용하여 복사합니다.

System.arraycopy(복사할 배열, 복사할 시작 인덱스, 붙여 넣을 배열, 붙여 넣을 시작 인덱스, 복사할 배열의 길이);
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

// arr1[1]에서 arr2[0]으로 arr1.length개의 데이터를 복사

이때, 복사할 배열의 길이가 붙여 넣어질 배열의 공간보다 크면 예외가 발생합니다.

 


String 클래스

String 클래스는 char배열에서 기능을 추가한 것과 같습니다. 가장 빈번하게 사용되는 참조형 클래스이기 때문에 주요 메서드를 기억해 두는 것이 좋습니다.

반환타입 메소드명(매개변수) 설명
char charAt(int index) 문자열에서 지정한 인덱스에 해당하는 문자를 추출하여 반환합니다.
int compareTo(String anotherString) 문자열과 지정한 다른 문자열이 같은지 여부를 반환합니다.
(대소문자 구분하여 같으면 0, 다르면 1 리턴)
int compareToIgnoreCase(String anotherString) 문자열과 지정한 다른 문자열이 같은지 여부를 반환합니다.
(대소문자 구분없이 같으면 0, 다르면 1 리턴)
String concat(String str) 문자열의 뒤에 지정한 문자열 str을 붙여 새로운 문자열로 반환합니다.
boolean endsWith(String suffix) 문자열의 끝부분이 지정한 suffix와 같은지 여부를 반환합니다.
boolean equals(Object anObject) 문자열과 지정한 문자열이 같은지 여부를 반환합니다.
(대소문자 구분하여 같으면 true)
boolean equalsIgnoreCase(String anotherString) 문자열과 지정한 문자열이 같은지 여부를 반환합니다.
(대소문자 구분없이 같으면 true)
int indexOf(int ch) 문자열에서 지정한 문자(ch)의 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int indexOf(int ch, int fromIndex) 지정한 문자(ch)를 fromIndex부터 찾아 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int indexOf(String str) 문자열에서 지정한 문자열(str)의 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int indexOf(String str, int fromIndex) 지정한 문자열(str)을 fromIndex부터 찾아 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int lastIndexOf(int ch) 문자열의 끝에서부터 찾아 지정한 문자(ch)의 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int lastIndexOf(int ch, int fromIndex) fromIndex부터 반대로 찾아 지정한 문자(ch)의 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int lastIndexOf(String str) 문자열의 끝에서부터 찾아 지정한 문자열(str)의 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
int lastIndexOf(String str, int fromIndex) fromIndex부터 반대로 찾아 지정한 문자열(str)의 위치 인덱스를 반환합니다.
(찾지 못할 경우 -1 반환)
boolean isEmpty() 문자열이 비어 있는지 여부를 반환합니다.
int length() 문자열의 길이를 반환합니다.
String replace(char oldChar, char newChar) 문자열에서 oldChar를 찾아 newChar로 변경 후 새 문자열로 반환합니다.
String replaceAll(String regex, String replacement) regex를 찾아 replacement로 변경 후 새 문자열로 반환합니다.
String[] split(String regex) 문자열을 regex를 구분자로 하여 자른 후 문자열 배열로 반환합니다.
boolean startsWith(String prefix) 문자열의 시작부분이 지정한 prefix와 같은지 여부를 반환합니다.
String substring(int beginIndex) 문자열의 beginIndex 부터 끝까지 잘라내어 새 문자열로 반환합니다.
String substring(int beginIndex, int endIndex) beginIndex 부터 endIndex - 1 까지 잘라내어 새 문자열로 반환합니다.
String toLowerCase() 문자열의 모든 영문 대문자를 소문자로 변환하여 새 문자열로 반환합니다.
String toUpperCase() 문자열의 모든 영문 소문자를 대문자로 변환하여 새 문자열로 반환합니다.
String trim() 문자열의 양끝에 있는 공백을 제거한 후 새 문자열로 반환합니다.
String static valueOf(모든 종류의 데이터) 지정한 데이터를 문자열로 형변환하여 반환합니다.

 


다차원 배열

배열 안의 배열을 뜻합니다. 2차원 이상의 배열도 가능하지만 배열이 복잡해지기 때문에 잘 사용하지 않습니다.

다차원 배열 선언

타입[][] 변수이름;	int[][] arrName;
타입 변수이름[][];	int arrName[][];
타입[] 변수이름[];	int[] arrName[];

다차원 배열 생성

변수이름 = new 타입[행의 길이][열의 길이];
score = new int[2][3];

행이 가로줄 열이 세로줄입니다.

다차원 배열 초기화

인덱스마다 값 초기화하기

int[][] arr2D = new int[2][3];
arr2D[0][0] = 1;
arr2D[0][1] = 2;
arr2D[0][2] = 3;
arr2D[1][0] = 4;
arr2D[1][1] = 5;
arr2D[1][2] = 6;

 

중첩 반복문을 사용해서 배열 초기화하기

for(int i = 0; i < arr2D.length; i++){
    for ( int j = 0; j < score[i].length; j++) { 
                arr2D[i][j] = i + j;
            }
    }

 

배열 집합을 사용하여 초기화하기

int[][] arr2D = {{1,2,3},{4,5,6},{7,8,9}};

행과 열의 길이가 모두 3인 2차원 배열이 생성됩니다.

 

향상된 for문을 사용

for ( 타입[] 1차원배열변수 : 2차원 배열 ) {
        for( 타입 변수명 : 1차원배열변수 ) {
       		 //반복할 문장
        }
}

 

다차원 배열의 출력

1차원 배열과 달리 Arrays.deepToString(배열이름) 메서드를 사용하여 출력합니다.

[[첫 번째 요소], [두 번째 요소], …, [마지막요소]]
import java.util.*;

int[][] arr2D = {{1,2,3},{4,5,6},{7,8,9}};
System.out.println(Arrays.deepToString(arr2D));
// [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

int[][][] arr3D = {{{1},{2,3}},{{4,5},{6}},{{7,8},{9}}};
System.out.println(Arrays.deepToString(arr3D));
// [[[1], [2, 3]], [[4, 5], [6]], [[7, 8], [9]]]

 


가변 배열

2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성하여 가변 배열을 구성할 수 있습니다.

int[][] arr2D = new int[3][];

arr2D[0] = new int[1];
arr2D[1] = new int[3];
arr2D[2] = new int[2];

 

O X X
O O O
O O X

위 표와 같은 형태의 배열이 만들어집니다.


배열에 대해 배워보았습니다. String 클래스의 메서드는 외우기엔 너무 많으니 시간을 두고 하나씩 사용해 가며 익혀보시길 바랍니다. 다음 글에서는 클래스에 대해 알아보겠습니다.

 

자바 쉽게 배우기 6 - 클래스와 객체

이번글에서는 클래스와 객체에 대해 알아봅시다. 그전에 왜 자바에서는 클래스와 객체를 사용하는 지부터 살펴봅시다. 자바는 객체지향 프로그래밍 언어입니다. 객체가 무엇일까요? 객체는 이

devdharu.tistory.com