Skip to content

Latest commit

 

History

History
184 lines (113 loc) · 6.51 KB

배열_자료구조와_자바에서의_배열을_표현하는_방법.md

File metadata and controls

184 lines (113 loc) · 6.51 KB

배열의 정의

  • 물리적인 기억 공간을 연속적으로 할당 받는 것, 배열은 메모리 공간을 연속적으로 할당 받습니다.

    → '물리적인 순서'를 자료구조로 표현한 것

  • 인덱스와 원소값 < i∈Index, e∈Element > 의 쌍으로 구성된 집합

    • Index : 물리적인 순서를 나타내는 원소의 유한집합
    • Element : 자료형이 일치하는 원소의 집합

배열의 인덱스

배열은 '배열의 이름[인덱스 번호]' 로 접근이 가능합니다.

인덱스의 번호는 배열의 원소에 접근하기 위한 추상화된 값이며, 추상화된 값을 물리적인 메모리 공간에 매칭해주는 역할은 OS 가 하게 됩니다.

위 내용을 그림으로 표현해보았습니다.

인덱스는 추상화 된 값이며, 컴퓨터의 내부 구조나 메모리 주소와 무관하게 개발자에게 개념적으로 정의가 됩니다.

image

이처럼 프로그램을 작성할 때 인덱스의 추상화된 값으로 접근하고 컴퓨터에서는 인덱스의 추상화된 값이 아닌 실제 주소로 접근을 하게 됩니다.


배열의 연산

  1. 배열의 생성 - 물리적인 기억 공간에 연속적인 빈 공간을 할당 받는다.
  2. 배열의 원소 반환 - 물리적인 기억 공간에 할당한 배열 공간의 i 번째 인덱스에 접근하여 원소를 반환한다.
  3. 배열의 원소 저장 - 물리적인 기억 공간에 할당한 배열 공간의 i 번째 인덱스에 값을 할당한다.

배열을 생성하고 반환하고 값을 변경하는 방법

  1. 초기값 리스트를 배열 선언과 함께 쉼표로 구분
int[] array = new int[] {1, 2, 3, 4, 5};

  1. 배열의 각 요소마다 값을 저장
int[] array = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

  • 다섯개의 원소를 저장할 수 있는 배열 생성을 한 결과

image

"연속적인 기억 공간에 할당되어 순차적으로 저장"


다음 그림을 코드로 표현하면 하기와 같습니다.

public class Array {
    static int[] create(int a) {
        int[] array = new int[a];

        for (int i = 0; i < array.length; i++)
            array[i] = i + 1;
        return array;
    }
}

해당 코드를 반환하는 방법은 다음과 같습니다.

public static void main(String[] args) {
        int number = 5;
        int[] result = create(number);

        // 첫번째 방법, 배열 길이만큼 전체 인덱스의 원소를 반환
        for (int i = 0; i < result.length; i++)
            System.out.println(result[i]);

        // 두번째 방법, 배열에 특화된 반복문을 이용하여 전체 인덱스 원소를 반환
        for (int array : result)
            System.out.println(array);
    }

물리적인 기억 공간의 특정 인덱스에 접근하여 원소의 값을 반환하는 방법은 다음과 같습니다.

result[0]; // 원소의 값 : 1
result[1]; // 원소의 값 : 2
result[2]; // 원소의 값 : 3
result[3]; // 원소의 값 : 4
result[4]; // 원소의 값 : 5

이번에는 물리적인 기억 공간의 특정 인덱스에 접근하여 값을 변경해보겠습니다.

result[0] = 0;
result[1] = 1;
result[2] = 2;
result[3] = 3;
result[4] = 4;

메모리를 할당 받은 배열 공간에서의 주소 계산

위에서 작성한 코드에서 메모리를 할당 받은 배열 공간에서 주소 계산 방법은 다음과 같습니다.

image


1차원 배열의 확장, 2차원 배열 공간

컴퓨터 분야에서 행렬은 객체 간의 관계, 네트워크 시뮬레이션, 최단거리 계산에서 사용됩니다. 배열을 이용한 행렬의 구현은 다음과 같은 모양새를 갖추고 있으며, 하기의 왼쪽 그림과 같은 행렬을 컴퓨터에서 표현하려면 오른쪽 그림과 같이 2차원 배열로 표현하는 것이 적합합니다.

image


행렬의 배열 표현은 다음과 같습니다.

2차원 배열에서 하나의 원소는 두 개의 첨자쌍으로 구분할 수 있으며, 두 개 이상의 첨자가 필요한 배열은 다차원 배열이라고 칭합니다.

2차원 배열을 그림으로 표현하면 하기와 같습니다.

프로그램에서의 추상 자료형이 실제 수학에서 제공이 되는 개념적 구조와 일치합니다.

image

그럼, 이러한 다차원 배열은 메모리 공간을 어떻게 할당을 받을까요?

→ 1차원의 선형처럼 주소값이 결정됩니다. 다만, 구조는 다릅니다. 이는 행렬의 열 우선 할당 방식과 행 우선 할당 방식으로 나뉩니다.

  • 열 우선 할당방식
    • 동일한 열에 있는 원소를 먼저 차례대로 메모리에 저장하고 다음 열로 이동하여 첫번째 원소부터 메모리 공간에 차례대로 저장하는 방식입니다.
  • 행 우선 할당방식
    • 동일한 행에 있는 원소를 먼저 차례대로 메모리 공간에 저장하고 다음 행에 있는 첫번째 원소를 차례대로 저장하는 방식입니다.

위와 같이 메모리에 할당 받는 방법은 프로그래밍 언어에 따라서 달라집니다.


희소 행렬

2차원 배열은 논리적으로 바둑판 형태를 띄우기 때문에 행렬을 표현하기에는 아주 적합합니다. 다만, 희소행렬은 원소의 값이 0 인 원소가 그렇지 않은 원소보다 상대적으로 많아, 0 이라는 데이터를 저장하기 위해 불필요하게 많은 메모리 공간을 요구합니다. 때문에 희소행렬을 배열로 표현할 경우에는 메모리의 낭비가 심합니다.

image


희소 행렬의 전치

희소 행렬의 연산의 표현 방법을 고안하기 위해서는 희소 행렬에 적용할 수 있는 연산을 고려해보아야 합니다.


자바에서의 배열 참조 자료형