Java: Array, 배열이란 무엇인가(feat. String vs. Char)
Array
배열은 하나의 변수에 여러 값을 저장하는 데 쓰이는 정적 리스트static list이다. 배열의 크기는 long 혹은 short가 아닌 int 값으로 특정되어야 한다. 배열에는 각 저장공간이 연속적으로 배치되어 있으며, 0부터 n-1까지 n개의 값을 특정 위치에 저장한다. 배열의 요소마다 붙여진 일련번호를 인덱스index라고 한다.
요컨대 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이다.
배열은 다음과 같이 선언할 수 있다.
다만 배열을 선언하는 것은 단지 배열을 다루기 위한 참조변수를 위해 공간을 만드는 것일 뿐이므로, 메모리에 실제 값을 저장할 수 있는 공간을 만들기 위해서는 new 연산자와 함께 배열을 생성해야 한다.
배열을 생성할 때엔 괄호[] 안에 배열의 길이, 즉 해당 배열에 값을 얼마만큼저장할 수 있는지를 적어준다. 배열의 길이는 0이 될 수도 있다. 자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, 배열명.length를 통해서 배열의 길이를 알아낼 수 있다.
앞서 배열은 정적 리스트static list라고 하였다. 한번 생성된 배열의 길이는 변경할 수 없기 때문이다. 배열에 저장할 공간이 부족할 경우 더 큰 길이의 배열을 생성한 후 기존 배열의 값을 복사할 수 있다. 이때 System클래스의 arraycopy() 메소드를 사용할 수 있다. System.arraycopy()는 지정된 범위의 값들을 한번에 통째로 복사하는 기능을 제공한다.
String 배열
String 배열은 다음과 같이 생성할 수 있다.
단, String은 클래스이므로 String 배열과 같은 참조형 배열, 즉 객체배열의 경우 배열에 저장되는 것은 실제 객체가 아닌 객체의 주소이다.
참고로 모든 참조변수에는 메모리에 저장된 객체의 주소(4byte의 정수값)혹은 null이 저장된다.
Char 배열
문자열String은 문자배열인 Char배열과 같은 뜻으로 볼 수 있다. 그런데 자바에서 Char 배열이 아닌 String 클래스를 사용해서 문자열을 다루는 이유는 String 클래스 자체가 Char 배열에 여러 가지 기능(함수, 메서드)을 추가하여 확장한 것이기 때문이다.
단, Char 배열과 달리 String 객체는 읽을 수만 있을 뿐 내용을 변경할 수는 없다.
이는 Java docs에서도 확인할 수 있다. String 클래스 앞에 final 제어자가 붙어있다.
사례를 통해 확인하자.
위 사례에서 str 변수에 담겨있던 “Java is Fun!”이라는 값이 “I hate Java!”로 바뀌었을까?
답은 ‘그렇지 않다’ 이다. String 객체에 값을 저장할 때마다 새로운 String 객체가 생성될 뿐이다.
이런 식으로 계속 String 객체를 생성하는 것은 메모리 차원에서도 비효율적이고, 사용하지 않는 String 객체를 계속 제거해야 하는 JVM에도 부하가 될 수 있다.
이러한 점을 보완하기 위해 StringBuffer 혹은 StringBuilder클래스를 사용할 수 있다. 이와 관련한 내용은 따로 다룰 것이다.
출처 및 참조
- Java의 정석(남궁 성, 도우출판)