본문 바로가기
Study/JAVA

[Java] 5. 배열(Array)

by jeongwle 2022. 9. 1.
728x90
반응형

 

배열

1. 배열(array)이란?

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 배열을 사용하면 많은 양의 데이터를 손쉽게 다룰 수 있다. 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다. 저장하려는 데이터의 개수 만큼 배열의 길이만 바꾸면 된다.

 

 

2. 배열의 선언과 생성

배열을 선언하는 방법은 간단하다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열을 의미하는 대괄호[]를 붙이면 된다. 대괄호의 위치는 타입 뒤 또는 변수이름 뒤 모두 가능하다.

선언방법 선언 예시
타입[] 변수이름; int[] score;
String[] name;
타입 변수이름[]; int score[];
String name[];

배열의 생성
배열을 선언한 다음 생성해야한다. 선언하는 것은 참조변수를 위한 공간이 만들어진 것 뿐이고 생성을 해야 저장할 수 있는 공간이 만들어진다. 배열은 new 연산자를 사용해 타입과 길이를 지정하여 생성할 수 있다.
타입[] 변수이름; // 배열을 선언
변수이름 = new 타입[길이]; // 배열을 생성​

 

3. 배열의 길이와 인덱스

생성된 배열의 각 저장공간을 배열의 요소(element)라고 부르고 배열이름[인덱스]의 형태로 접근 가능하다. 인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 인덱스는 0부터 시작하기 때문에 '0 ~ 배열길이-1 '까지이다. 인덱스로는 변수나 수식도 사용할 수 있다. 다만 주의할 점은 인덱스의 범위를 벗어난 값을 인덱스로 사용하지 않아야 한다는 것이다.

배열의 길이
배열의 길이는 배열의 요소의 개수, 값을 저장할 수 있는 공간의 개수이다. 배열의 길이는 int범위의 양의 정수이다. 길이가 0인 배열도 생성이 가능하다. 지금은 길이가 0인 배열도 생성이 가능하다는 점만 알아두고 나중에 더 알아보자.

배열이름.length
배열의 길이를 얻을 수 있다. 이미 생성된 배열의 길이는 변하지 않기 때문에 배열이름.length는 상수다. 값을 읽을 수 있지만 변경할 수 없다. 그래서 for문을 사용해서 배열의 각 요소를 접근하고자 할 때 조건식 부분을 배열이름.length를 사용하면 코드의 관리가 쉽고 에러가 발생할 확률이 적어진다.

배열의 길이 변경하기
한 번 생성된 배열의 길이를 변경할 수 없다 하였다. 배열에 저장할 공간이 부족할 경우에는 더 큰 배열을 새로 생성하고 기존 배열의 내용을 새로운 배열에 복사하면 된다. 보다 자세한 내용은 5번에서 설명하겠다.

 

4. 배열의 초기화

배열은 생성과 동시에 자신의 타입에 해당하는 기본 값으로 초기화된다. 하지만 원하는 값을 저장하려면 각 요소마다 값을 지정해 주어야 한다. 조건문에서 배운 for문을 사용해서 초기화 하는 방법이 쉬운데 for문을 이용해서 배열을 초기화하려면 저장하려는 값에 일정한 규칙이 있어야 가능하다. 그래서 자바에서는 다른 초기화 방법도 제공한다.

int[] score = new int[]{50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90};

int[] score;
score = new int[]{50, 60, 70, 80, 90};
score = {50, 60, 70, 80, 90}; // error new int[] 생략 불가

// 길이가 0인 배열
int[] score = new int[0];
int[] score = new int[]{};
int[] score = {};​

배열의 출력
for문을 이용해서 출력하는 방법도 있지만, 더 간단한 방법은 Arryas.toString(배열이름) 메서드를 사용하는 것이다. 이 메서드는 배열의 모든 요소를 [1번요소, 2번요소, ... ] 와 같은 형식의 문자열로 만들어서 반환한다.

 

5. 배열의 복사

새로운 배열을 선언 및 생성하고 이전 배열의 요소들을 새로운 배열에 복사 한 후 새로운 배열에 저장된 값을 이전 배열에 저장하면 된다.
import java.util.Arrays;

public class ArrayEx3 {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50};
        int[] tmp = new int[10];

        System.out.println("변경전 arr의 길이 = " + arr.length);
        for (int i = 0; i < arr.length; i++) {
            tmp[i] = arr[i];
        }
        arr = tmp;
        System.out.println("변경후 arr의 요소 = " + Arrays.toString(arr));
        System.out.println("변경후 arr의 길이 = " + arr.length);

    }
}​

System.arraycopy()를 이용한 배열의 복사
for문 대신 System클래스의 arraycopy()를 사용하면 간단하고 빠르게 배열을 복사할 수 있다. arraycopy()는 for문과 달리 지정된 범위의 값을들 한 번에 통째로 복사한다. arraycopy()를 호출할 때는 어느 배열의 몇 번째 요소에서 어느 배열로 몇 번째 요소로 몇개의 값을 복사할 것인지 지정해 주어야 한다.
import java.util.Arrays;

public class ArrayEx4 {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50};
        int[] tmp = new int[10];

        System.out.println("변경전 arr의 길이 = " + arr.length);
        System.arraycopy(arr, 0, tmp, 0, arr.length);
        arr = tmp;
        System.out.println("변경후 arr의 요소 = " + Arrays.toString(arr));
        System.out.println("변경후 arr의 길이 = " + arr.length);

    }
}​

 

String 배열

1. String배열의 선언과 생성

배열의 타입이 String인 경우에도 배열의 선언과 생성방법은 똑같다. 참조형 변수의 기본 값은 null이므로 각 요소의 값은 null로 초기화 된다. 변수의 타입에 따른 기본값을 살펴보고 가자

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

 

2. String배열의 초기화

초기화 방법 역시 같다. 배열의 각 요소에 문자열을 지정하기만 하면 된다. 괄호를 사용해서 간단히 초기화 할 수도 있다. 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이다. 그래서 참조형 배열을 객체 배열이라고도 한다.

String[] name = new String[3];
name[0] = "Tomato";
name[1] = "Orange";
name[2] = "Apple";

// {}

String[] name = new String[]{"Tomato", "Orange", "Apple"};
String[] name = {"Tomato", "Orange", "Apple"};​

 

3. char배열과 String 클래스

자바에서 char배열이 아닌 String클래스로 문자열을 처리하는 이유는 String 클래스가 char배열에 여러가지 기능을 추가하여 확장한 것이기 때문이다. char배열과 String클래스의 한 가지 중요한 차이는 String객체는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.
String str = "Java";
str = str + "8";  // "Java8"이라는 새로운 문자열이 str에 저장된다.
System.out.println(str); // "Java8"​

위의 문장에서 str의 내용이 변경된 것 같지만, 새로운 문자열을 생성해서 저장하는 것이다.

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[])로 변환해서 반환한다.

 

다차원 배열

지금까지 배운 배열은 1차원 배열이다. 2차원 이상의 배열을 다차원 배열이라 하고 선언해서 사용할 수 있다.

 

1. 2차원 배열의 선언과 인덱스

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

int[][] score;
int score[][];
int[] score[];​


2차원 배열의 index
2차원 배열은 행(row)과 열(column)로 구성되어 있다. 행 index의 범위는 '0 ~ 행의 길이-1' 이고 열 index의 범위는 '0 ~ 열의 길이-1' 이다. 각 요소는 '배열이름[행index][열index]'로 접근할 수 있다.

 

2. 2차원 배열의 초기화

2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다. 1차원 배열보다 괄호{} 하나를 더 사용해 행별로 구분해주어야 한다.
int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, {4, 5, 6} };
int[][] arr = {
  {1, 2, 3},
  {4, 5, 6}
};​

2차원 배열 또한 중첩 for문을 이용하여 초기화 할 수 있다.
for (int i = 0; i < score.length; i++) {
  for (int j = 0; j < score[i].length; j++) {
    score[i][j] = 10;
  }
}​

 

 

3. 가변 배열

2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고 추후에 각기 다른 길이의 배열을 생성하여 유동적인 가변 배열을 구성할 수 있다.
int[][] score = new int[5][]; // 두 번째 차원의 길이는 지정하지 않는다.
score[0] = new int[4];
score[1] = new int[1];
score[2] = new int[2];
score[3] = new int[3];
score[4] = new int[3];​

가변배열 역시 중괄호{}를 이용해서 생성과 초기화를 동시에 하는 것이 가능하다.
int[][] score = {
  {100, 100, 100, 80},
  {30, 20, 30},
  {10},
  {50, 70},
  {40, 40, 40}
};​

 

 

728x90
반응형

댓글