Java: Array, 배열이란 무엇인가(feat. String vs. Char)

LUNA Y0UNG
6 min readApr 28, 2020

--

Array

배열은 하나의 변수에 여러 값을 저장하는 데 쓰이는 정적 리스트static list이다. 배열의 크기는 long 혹은 short가 아닌 int 값으로 특정되어야 한다. 배열에는 각 저장공간이 연속적으로 배치되어 있으며, 0부터 n-1까지 n개의 값을 특정 위치에 저장한다. 배열의 요소마다 붙여진 일련번호를 인덱스index라고 한다.

https://www.geeksforgeeks.org/arrays-in-java/

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

배열은 다음과 같이 선언할 수 있다.

https://www.slideshare.net/RzOmar/arrays-in-java-58285914

다만 배열을 선언하는 것은 단지 배열을 다루기 위한 참조변수를 위해 공간을 만드는 것일 뿐이므로, 메모리에 실제 값을 저장할 수 있는 공간을 만들기 위해서는 new 연산자와 함께 배열을 생성해야 한다.

https://mathbits.com/MathBits/Java/arrays/Declare.htm

배열을 생성할 때엔 괄호[] 안에 배열의 길이, 즉 해당 배열에 값을 얼마만큼저장할 수 있는지를 적어준다. 배열의 길이는 0이 될 수도 있다. 자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, 배열명.length를 통해서 배열의 길이를 알아낼 수 있다.

앞서 배열은 정적 리스트static list라고 하였다. 한번 생성된 배열의 길이는 변경할 수 없기 때문이다. 배열에 저장할 공간이 부족할 경우 더 큰 길이의 배열을 생성한 후 기존 배열의 값을 복사할 수 있다. 이때 System클래스의 arraycopy() 메소드를 사용할 수 있다. System.arraycopy()는 지정된 범위의 값들을 한번에 통째로 복사하는 기능을 제공한다.

String 배열

String 배열은 다음과 같이 생성할 수 있다.

https://www.journaldev.com/17809/java-string-array

단, String은 클래스이므로 String 배열과 같은 참조형 배열, 즉 객체배열의 경우 배열에 저장되는 것은 실제 객체가 아닌 객체의 주소이다.

https://theopentutorials.com/tutorials/java/strings/string-arrays/
https://theopentutorials.com/tutorials/java/strings/string-arrays/

참고로 모든 참조변수에는 메모리에 저장된 객체의 주소(4byte의 정수값)혹은 null이 저장된다.

Char 배열

문자열String은 문자배열인 Char배열과 같은 뜻으로 볼 수 있다. 그런데 자바에서 Char 배열이 아닌 String 클래스를 사용해서 문자열을 다루는 이유는 String 클래스 자체가 Char 배열에 여러 가지 기능(함수, 메서드)을 추가하여 확장한 것이기 때문이다.

https://www.slideshare.net/KavitaGanesan/is-66154415-kavitaganesanv2

단, Char 배열과 달리 String 객체는 읽을 수만 있을 뿐 내용을 변경할 수는 없다.

이는 Java docs에서도 확인할 수 있다. String 클래스 앞에 final 제어자가 붙어있다.

사례를 통해 확인하자.

https://www.slideshare.net/KavitaGanesan/is-66154415-kavitaganesanv2

위 사례에서 str 변수에 담겨있던 “Java is Fun!”이라는 값이 “I hate Java!”로 바뀌었을까?

https://www.slideshare.net/KavitaGanesan/is-66154415-kavitaganesanv2

답은 ‘그렇지 않다’ 이다. String 객체에 값을 저장할 때마다 새로운 String 객체가 생성될 뿐이다.

https://www.slideshare.net/KavitaGanesan/is-66154415-kavitaganesanv2

이런 식으로 계속 String 객체를 생성하는 것은 메모리 차원에서도 비효율적이고, 사용하지 않는 String 객체를 계속 제거해야 하는 JVM에도 부하가 될 수 있다.

https://www.javatpoint.com/difference-between-string-and-stringbuffer

이러한 점을 보완하기 위해 StringBuffer 혹은 StringBuilder클래스를 사용할 수 있다. 이와 관련한 내용은 따로 다룰 것이다.

--

--