Programming Languages/C,C++

[C언어/자료구조] 배열 - 2차원 배열, 3차원 배열, 구조체, 순차 리스트

Hannana. 2023. 5. 21. 21:12
반응형

 

오늘은 C언어의 자료 표현 방식 중 반드시 기본으로 알아야 할
'배열' 에 대해 알아보고자 한다.

 

 

1. 배열의 개념

  • 배열은 종류가 같은 여러개의 데이터를 순차적으로 나열한 것이다.
  • 정수(int), 문자(char), 부동소수(double) 뿐 아니라 구조화 타입의 배열도 허용한다.

 

 

 

2. 배열의 특성

  • 인덱스 범위(index range)가 존재하며 이 범위를 넘게 되면 에러가 발생한다.
  • 배열의 크기는 선언 시 명세하며, 이 크기는 불변하다. (크기 = 길이)
  • 배열의 lower bound는 항상 0이다. upper bound는 최소 lower bound의 +1 이다.
  • 배열의 선언과 초기화가 동시에 가능하다.
    예) int a[100]={0} //배열 a를 선언과 동시에 0으로 초기화

 

 

 

3. 배열의 선언

  • 대괄호([ ])와 함께 표기
  • 일반 변수와 같은 형식으로 선언한다.
    예) 정수 배열 선언 – int A[100];
          A [0] [1] …  [100]

 

 

 

 

4-1. 배열의 표현 - 2차원 배열

  • 행(row)과 열(column)을 표현하는 2개의 인덱스로 명세
    예) int a[2][3];
  열1 열2 열3
행1 a[0][0] a[0][1] a[0][2]
행2 a[1][0] a[1][1] a[1][2]
  • 배열의 선언과 초기화가 동시에 가능하다.
    예) int a[2][3]={{1, 2, 3}, {4, 5, 6}}

 

 

 

 

 

4-2. 배열의 표현 - 3차원 배열

 

  • 면(plane), 행(row), 열(column)을 표현하는 3개의 인덱스로 명세
    예) int a[2][2][3]; => "행(2)과 열(3)로 표현되는 2개의 면(0~1)이 존재"
  열1 열2 열3
행1 a[0][0][0] a[0][0][1] a[0][0][2]
행2 a[0][1][0] a[0][1][1] a[0][1][2]

면[0]

  열1 열2 열3
행1 a[1][0][0] a[1][0][1] a[1][0][2]
행2 a[1][1][0] a[1][1][1] a[1][1][2]

면[1]

 

 

 

 

 

4-3. 배열의 표현 - 구조(struct)

  • 배열의 구조체는 Struct Data Type이라고도 한다.
  • 종류가 다른 데이터들끼리 그룹 지어 처리가 가능하다. (일반 배열과 차이점)
  • 사용자가 직접 데이터 타입을 정의할 수 있다.
예) 
      struct example {  //구조체 정의
            int age; 
            double time; 
            char name[10]; 
      }; 
     struct example s1; //정의된 구조체 데이터 타입으로 변수 선언
  • 구조체끼리는 단순 비교가 불가능하다. 어떤 데이터를 비교하는 것인지 알 수 없기 때문! 
    예) a>b (X)

 

 

 

 

4-3. 배열의 표현 - 순차 리스트

 

  • 물리적 메모리 공간에 연속적으로 저장된다.
  • 물리적 순서 = 논리적 순서
  • 배열을 이용한 순차리스트 장단점

[장점] -표현이 간단함
          -접근이 빠르다. 인덱스는 직접 메모리 주소로 변환할 수 있기 때문

[단점] -임의의 위치에 대한 삽입, 삭제 비용이 크다.
            삽입, 삭제시에 후속 원소들을 한 자리씩 밀거나 당겨야 함 -> 오버헤드 발생
          -순차적으로만 표현할 수 있다.
          -자료의 크기가 미리 정의되어야 한다.

          -메모리 내 저장 공간 전체가 한 번에 할당되고, 한 번에 회수된다.

 

 

 


 

지금까지 C언어에서의 배열의 개념과 특성을 알아보았다.

배열 구조는 가장 기본적인 자료 구조이니 표현 방식을 알아두는 것이 좋다.

 

한 가지 걸리는 것이 있다면, C언어의 배열 구조의 약점과 한계를 극복하기 위해 어떻게 해야할까.

이럴 때 연결 리스트(포인터)의 개념이 필요하다.

다음에는 연결 리스트 구조와 동적 할당에 대해 알아보도록 하자.

 

 

 

 

이 글은 C언어를 활용한 자료 구조의 복습을 위해 개인적으로 작성한 글입니다.

 

 

반응형