프로그래밍 언어에서 배열은 연관성을 가지는 데이터의 묶음이다. 예를 들어 어느 학급 세 학생의 국어, 영어, 수학 성적을 저장하고 출력해야한다고 해보자. 배열이 존재하지 않는 상태라면 아래와 같이 변수 선언을 진행해야 할 것이다.
학생 수와 과목수가 늘어난다면, 출력은 고사하고 점수 입력만으로도 상당한 시간이 소요된다. 또한 각 점수를 저장하는 변수가 메모리의 여기저기에 흩어져 저장되기 때문에 각 학생의 시험 성적 총합과 평균을 구하는 연산에서도 시간이 소요될 수 밖에 없다.
배열을 사용하면, 연관이 있는 데이터들을 조금 더 효율적으로 다룰 수 있다. Python에서 사용하는 List, Tuple, Dictionary 들도 전부 배열로부터 파생된 배열 자료형이라 보면 된다. Python을 사용해보셨던 분들이라면 이들의 편리함에 대해서는 큰 반론이 없을 것이라 생각한다.
이번 포스팅에서는 Java의 배열에 대해 알아보려 한다.
1. Java의 배열 생성, 선언, 초기화와 메모리 저장
필자가 Java의 변수 선언과 관련된 포스팅을 진행하면서, Java의 자료형은 크게 기본형과 참조형으로 구분할 수 있다고 언급했다. 배열의 경우, 기본형 자료의 모임이기는 하지만 참조형 변수로 구분할 수 있다. 참조형 변수는 값이 저장되는 메모리의 주소가 저장되는 변수인데, 배열의 경우 연관있는 데이터가 직접 저장되는 것이 아니라, 해당 데이터들이 저장된 메모리 주소를 저장한다. 말로만 설명하면 무슨 말인지 이해가 굉장히 힘드니, 코드와 그림을 통해 알아보자.
(1) 배열의 생성
필자가 int 형 변수 3 개를 선언한다. 이 변수들은 메모리 내의 무작위 위치에 저장이 될 것이다.
이 세 변수를 근접한 메모리에 위치하기 위해서는 int 형 배열 내에 이 변수들을 저장하면 된다. 배열의 생성은 아래의 두 가지 방법 중 하나를 선택해서 진행하면 된다.
1. 저장할_자료형 배열명 [] = new 저장할_자료형 [배열크기(정수형)];
2. 저장할_자료형 [] 배열명 = new 저장할_자료형 [배열크기(정수형)];
위의 내용을 참고하여 정수값 10, 20, 30을 저장하기 위한 배열 생성은 다음과 같이 진행한다.
배열이 생성되면 메모리에서는 int형 4 Byte 공간 3개가 연달아 이 배열에 할당된 한다. 그리고, 배열에 할당된 메모리 중 가장 첫 번 째 int 자료형이 저장되는 메모리의 주소가 배열명 변수에 저장된다.
(2) 배열 Index를 사용한 값 조회 및 저장
현재 필자는 3개짜리 정수형 배열을 생성했다. 배열명이 데이터가 저장된 주소를 리터럴 값으로 가지기 때문에 배열 내의 값을 int_arr로 바로 출력할 수 없다.
따라서 각 값이 저장된 메모리를 명시해야 저장된 값을 출력할 수 있다. 배열에서 배열에 속한 메모리의 칸을 나타내는 용어를 index라고 하는데, 배열과 index를 사용하면 각 배열의 값을 화면에 출력할 수 있다.
배열명[index] -> index + 1 번째 배열 메모리에 저장된 값을 가리킴
주의해야 할 점은 index는 각 서수에서 1을 뺀 값으로 지정해야 한다는 것이다. 배열의 첫 번째 저장값은 index 0, 두 번째 저장값은 index 1로 호출한다.
index를 사용하면 배열 내에 저장된 값을 변경하는 것도 가능하다. 아래의 예시는 배열 생성 후 3의 배수를 선언한 배열에 다시 저장하는 코드다.
메모리 상에서는 for 문 수행 후 아래와 같이 변경된 값이 저장된다. 변수 값을 바꾸는 것과 동일한 과정을 거친다.
(3) 배열의 선언과 초기화
여기서 한 가지 의문점이 생긴다. 배열 생성 시, 배열 자료형의 기본값만 저장되는데, 이를 사용자가 원하는 값으로 미리 저장할 수는 없는 것일까? 물론 가능하다. 배열 선언과 동시에 값을 저장하는 것을 배열 초기화라고 한다.
* 사실 필자의 Java 변수 선언 포스팅에서 조금 잘못된 부분이 있는데, 변수 역시 선언과 초기화로 구분이 된다. 필자는 이를 뭉뚱그려서 선언이라고 언급했지만, 실제로는 int a; 코드가 변수를 선언하는 부분이고 대입연산자를 통해 값을 지정하는 것(= 3)이 변수 초기화다. 조금 더 제대로 언급하자면 "변수 생성 = 변수 선언 + 변수 초기화"다
배열을 초기화한 뒤 사용하기 위해서는 배열 생성과 조금 다른 포맷을 사용해야 한다.
[배열의 선언] 저장할_자료형 배열명 [];
[배열의 초기화] 배열명 = new 저장할_자료형 [] {저장할 값을 콤마로 구분하여 입력}
배열의 초기화 시, 배열의 크기를 지정하지 않는데, 초기화 시 배열 크기가 지정되면 에러가 난다. 또한 초기화 시 new 저장할_자료형이 누락되는 경우에도 에러가 발생한다.
배열의 선언과 초기화를 한 번에 진행함으로써 배열을 생성하는 것도 가능하다.
1. 저장할_자료형 배열명 [] = new 저장할_자료형 [] {저장할 값을 콤마로 구분하여 입력};
2. 저장할_자료형 [] 배열명 = new 저장할_자료형 [] {저장할 값을 콤마로 구분하여 입력};
3. 저장할_자료형 배열명 [] = {저장할 값을 콤마로 구분하여 입력};
4. 저장할_자료형 [] 배열명 = {저장할 값을 콤마로 구분하여 입력};
3. 배열에서의 for 문과 배열 길이 확인
배열의 값을 효율적으로 다루기 위해서는 for 문을 사용해야한다. 위의 예시에서도 확인했지만, 배열 내의 값을 조회하거나 변경하는 등의 작업은 압도적으로 for 문이 많이 사용된다.
for문의 통제 변수 조건식을 보면 배열의 크기인 5 이상인 값에서 동작하는 것을 방지한다. 만약 통제 변수가 배열의 크기를 넘어가면 배열에 존재하지 않는 값을 호출하는 것이므로 에러가 발생하게 된다.
따라서 for 문의 조건식에서 배열의 크기를 지정할 때 수동으로 값을 입력하기보다, 배열의 크기를 JVM에서 계산해서 넣어줄 수 있다면 추후 배열의 크기에 변동이 일어나더라도 별도의 수정을 거치지 않아도 되므로 조금 더 효율적인 코드 관리가 가능해진다. 배열의 크기를 확인하는 방법은 아래와 같다.
배열명.length
4. 향상된 for 문
배열을 다루기 위해 Java의 for 문을 사용하다보면, 별도의 통제변수를 만들고, 이들의 범위를 조건식으로 지정해야하는 등 번거로운 일이 꽤 많다. 이러한 번거로움으로 인해 Java는 배열에서 사용할 수 있는 별도의 for 문을 제공한다. 이를 향상된 for 문이라고 한다. 향상된 for 문은 아래와 같이 사용한다.
for ( 배열_내_저장된_자료형 각_배열값을_저장할_임시변수명: 배열명)
위의 예시를 향상된 for 문으로 수정하면 아래와 같다.
index를 사용하지 않고 배열을 조회해야 할 경우 많이 사용한다. 물론 향상된 for 문에서도 index 값을 다룰 수 있긴 하지만 이는 추후 포스팅에서 다시 언급하려 한다.
본 포스팅 서두로 돌아가, 학급 내 세 학생의 시험 성적을 배열로 저장하고 출력해보자. 아래와 같이 나타낼 수 있다.
지금까지는 int형에 대한 배열만 언급했는데, 문자형의 경우도 동일한 방식으로 배열 저장과 통제가 가능하다.
참고로, Java의 문자열은 기본 자료형인 char가 배열의 형태를 띈 것이다. 배열의 경우 참조형 변수라고 서두에서 언급했는데, String 역시 문자형 변수의 배열 형태를 띄기 때문에 참조형 변수가 된다. 조금 더 자세한 내용은 다음다음 포스팅에서 언급하려 한다.
다음 포스팅에서는 배열과 관련된 작업과 배열 매서드에 대해 알아보려 한다.
Fin
'Java > Java Basic' 카테고리의 다른 글
[Java Basic] 9. 배열 3 - 문자열 배열과 String 타입 (0) | 2022.07.01 |
---|---|
[Java Basic] 8. 배열 2 - 배열 관련 작업 (0) | 2022.06.30 |
[Java Basic] 6. 루프(Loop)문 - for, while 문 (0) | 2022.06.27 |
[Java Basic] 5. 조건식 - if, else, switch (0) | 2022.06.27 |
[Java Basic] 4. Java 연산자 (0) | 2022.06.25 |
댓글