케네스로그

[자료구조] 배열, 다차원배열 본문

Dev/자료구조

[자료구조] 배열, 다차원배열

kenasdev 2021. 12. 26. 18:05
반응형

배열이란

자료구조는 데이터를 효율적을 관리하기 위해 고안된 저장 및 관리 방식입니다.
자료구조 중 하나인 배열동일한 타입의 데이터를 연속적으로 나열하고, 데이터의 순서에 따른 번호(인덱스)를 통해 데이터를 제어합니다. 배열의 특성은 다음과 같습니다.

  • 순서가 존재하며, 색인(index)를 통해 데이터에 접근할 수 있다.
  • 같은 자료형의 데이터가 연속적으로 저장된다.
  • 처음 배열이 선언될 때 정해진 크기를 변경할 수 없다.

 

예시

종이책(데이터)이라는 같은 물질적 형태의 물건들를 효율적으로 적재하기 위한 틀을 책장(배열)이라고 합니다. 처음 가구를 만들때 정해진 크기(배열의 크기)는 이후에 수정할 수 없죠.

 

학생들의 이름 순으로 정리된 출석부도 배열이라고 할 수 있습니다. 출석부엔 학생번호(index)가 순서대로 기입되어 있으며, 학생번호(인덱스)를 통해서 특정 학생의 정보를 조회할 수 있습니다.

 

 

배열의 선언

// primitive
int[] arr = new int[3];
int arr[] = {1,2,3};
int[] arr = {1,2,3};

// wrapper class 
Integer[] arr = new Integer[3];
arr[0] = 1;

Integer arr[] = {1,2,3};
Integer[] arr = {1,2,3};

기본적으로 배열은 데이터형 변수명 = new 자료형[배열의 크기]의 형식으로 new 키워드를 통해 선언합니다.

또는, 변수에 {...}형식의 배열을 직접 할당할 수 있습니다.

 

메모리 공간에서의 배열

변수에 배열 직접 할당

int[] nums = { 12, 37, 44 };

위와 같이 배열을 선언한다면 메모리 상에서는 아래와 같은 형식으로 저장됩니다.

스택영역에 변수 nums가 할당되며, 이 변수 nums는 정수형 배열타입 객체를 참조합니다. 즉, 배열 객체의 주소를 저장하게 되죠.


힙 영역에서는 {12, 37, 44}배열이 할당되며, 이 배열의 첫 요소의 주소가 배열 객체의 메모리 주소가 됩니다. 나머지 배열 요소들은 연속적으로 저장되게 되죠. 37은 #54214, 44는 #54215 등의 방식입니다.

실제로 위의 코드를 실행하여 변수를 출력하면 해당 변수가 참조하고 있는 배열 객체의 주소가 출력됩니다.

 

new 연산자를 통한 배열 생성

int[] nums = new int[3];
nums[0] = 12;
nums[1] = 37;
nums[2] = 44;

이처럼 new연산자를 통해 배열을 할당하게 되면, 메모리 상(힙영역)에 초기화된 배열이 생성되게 됩니다. 그 이후에, 인덱스를 통해 데이터를 삽입할 수 있게 되죠. 여기서 주목할 점은 배열이 초기값을 가지며 할당된다는 것입니다.

 

타입별 배열 초기값

정수형 기본 타입 byte[] 0
char[] '\u0000'
short[] 0
int[] 0
long[] 0L
실수형 기본 타입 float[] 0.0F
double[] 0.0
논리형 기본 타입 boolean[] false
참조형 기본 타입 클래스[] null
인터페이스[] null

 

 

다차원 배열

int mul_arr[][] = { {1,2,3} , {7,8,9} };

int arr3[][][] = {
  {
    {1,1,1},
    {2,2,2}
  },
  {
    {3,3,3}
    {4,4,4}
  }
};

위와 같이 []의 갯수를 통해서 배열의 차원을 정할 수 있습니다.

위의 코드에서는 mul_arr3개의 원소를 가진 배열을 2개 가진 배열이라고 할 수 있죠.

mul_arr[0] = {1,2,3}

mul_arr[1] = {7,8,9}

위의 예시코드에서, arr3의 차원을 색상별로 나누어보면 위와 같이 표현할 수 있습니다.

  • 빨강: 3차
  • 파랑: 2차
  • 초록: 1차

메모리 상의 다차원 배열

위의 다차원 배열을 메모리 상을 시각화 한다면 위와 같습니다. 스택영역에서 3차원 배열 변수가 생성되고, 이 변수는 힙 영역의 2차원 배열을 참조합니다. 힙 영역의 2차원 배열은 2개의 2차원 배열을 다시 참조합니다. 이 2개의 2차원배열의 각 원소는 길이가 3인 1차원 배열들을 각각 참조하는 형식이죠.

 

배열을 다루기 위한 클래스

Arrays 클래스를 활용한 전체 데이터 출력

import java.util.Arrays;

Arrays.toString(arr); // 배열의 전체 요소를 String형태로 반환

앞의 예시에서 배열 변수를 직접 출력하게 되면 해당 변수가 참조하고 있는 메모리의 주소가 출력되게 됩니다.

배열의 원소를 출력하고 싶다면 Arrays.toString()메소드를 통해 출력해야 합니다.

 

반응형