본문 바로가기

Java

[자바의정석/5]배열이란

728x90
반응형

배열(array)

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

타입[] 변수이름, 타입 변수이름[] 과 같이 배열을 선언할 수 있다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.

변수 이름 = new 타입[길이];
인덱스는 배열의 요소마다 붙여진 일련번호로 범위는 0~배열길이-1 까지이다
배열의 길이는 거의 제약이 없다고 할 수 있고, 0이 될수 있다
int[] score = new int[]{5,6,7,8,9};
int[] score = {5,6,7,8,9};	//new int[] 생략 가능

int[] score;
score = new int[]{5,6,7,8,9}; // OK
score = {5,6,7,8,9}; // error 생략 불가

int add(int[] arr) { 내용 생략 }; //add 메서드
int result = add(new int[]{5,6,7,8,9}); // OK
int result = add({5,6,7,8,9}); // error

int[] score = new int[0];
int[] score = new int[]{};
int[] score = {};	//길이가 0인 배열
배열의 출력은 Arrays.toString(arr)로 가능하다.
없이 출력하면 배열의 주소값이 출력된다.

배열의 복사

배열은 한번 생성하면 길이를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야 한다. 

//배열 arr의 길이인 arr.length 값이 5일때 길이 10인 int 배열 tmp가 생성되고,
//배열 tmp의 각 요소는 int의 default 0으로 초기화된다.
int[] tmp = new int[arr.length*2];

//for문으로 값을 복사
for(int i=0; i<arr.length; i++) tmp[i] = arr[i];

//참조변수 arr에 참조변수 tmp의 값을 저장한다. arr의 값은 0x100에서 0x200으로 바뀌고
//arr은 배열 tmp를 가리키게 된다.
arr = tmp;

//결국 참조변수 arr과 tmp는 같은 배열을 가리키게 된다.
//이름만 다를뿐 같은 배열이다.
배열은 참조변수를 통해서만 접근할 수 있기 때문에 자신을 가리키는 참조변수가 없는 배열은 사용할 수 없다.
이렇게 쓸모없게 된 배열은 JVM의 가비지 컬렉터에 의해서 자동적으로 메모리에서 제거된다.

System.arraycopy()

배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 더 효율적이다.

배열의 활용

import java.util.Arrays;

public class arraymethod {
    public static void main(String[] args) {
        
        String str = "hello";
        String[] sp = str.split("");
        String[] result = new String[sp.length];

        for (int i = 0; i < sp.length; i++) {
            String temp = "";

            if (i == sp.length - 1) {
                temp = sp[i];
                result[i] = sp[i-1];
                result[0] = temp;
            } else {
                result[i + 1] = sp[i];
            }
        }
        System.out.println(Arrays.toString(result));
    }
}
//[o, h, e, l, l]
//hello -> ohell 이렇게 출력하고 싶을 때 배열을 이용해 인덱스를 한칸씩 옮긴다.

String 배열

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

마찬가지로 배열을 생성하면 각 요소는 기본값 null로 초기화 된다.

기본형 배열이 아닌 경우, 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소다.

참조형 배열을 객체 배열이라고도 한다.

char 배열과 String 클래스

   지금까지 여러 문자, 즉 문자열을 저장할 때 String 타입의 변수를 사용했다. 자바에서 char배열이 아닌 String클래스를 이용해서 문자열을 처리하는 이유는 String클래스가 char배열에 여러가지 기능을 추가하여 확장한 것이기 때문이다.

String 클래스는 char 배열에 기능(메서드)을 추가한 것이다

   C언어는 문자열을 char배열로 다루지만, 객체지향언어인 자바에서는 char배열과 그에 관련된 기능들을 함께 묶어서 클래스에 정의한다. 객체지향개념이 나오기 이전의 언어들은 데이터와 기능을 따로 다루었지만, 객체지향언어에서는 데이터와 그에 관련된 기능을 하나의 클래스에 묶어서 다룰 수 있게 한다.

메서드 설명
char charAt(int index) 문자열에서 해당 위치(index)에 있는 문자를 반환한다.
int length() 문자열의 길이를 반환한다.
String substring(int from, int to) 문자열에서 해당 범위에 있는 문자열을 반환한다.(to - 1)
boolean equals(Object obj) 문자열의 내용이 obj와 같은지 확인한다. true, false
char[] toCharArray() 문자열을 문자배열(char[])로 변환해서 반환한다.

 

728x90
반응형