Arrays & Structures
자료구조의 기본은 데이터를 효율적으로 저장하고 관리하는 방법을 배우는 것부터 시작함.
가장 기초적인 구조 : 배열(Array) & 구조체(Structure)
C의 경우 array를 기본으로 지원함.
- Arrays and Array ADT
배열(Array) 은 같은 자료형의 데이터를 연속된 메모리 공간에 저장하는 구조
Array ADT (Abstract Data Type) 로서 배열은 다음과 같은 연산을 지원함:
- insert(A, i, x) : i번째 위치에 x 삽입
- delete(A, i) : i번째 요소 삭제
- retrieve(A, i) : i번째 요소 반환
- update(A, i, x) : i번째 요소를 x로 변경
- length(A) : 배열의 크기 반환
배열의 장점은 인덱스를 이용한 빠른 접근 (O(1))
단점은 크기가 고정되어 있고 삽입/삭제가 비효율적 (O(n)) 이라는 점이다.
- Array in C
C 언어에서 배열은 다음과 같이 선언하고 사용함
int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr[2]); // 출력: 3
- arr[0]은 첫 번째 원소
- 배열의 인덱스는 0부터 시작
- 배열 이름(arr)은 배열의 첫 번째 주소를 가리킴
메모리 구조상 arr[i]는 *(arr + i) 와 동일함
즉, 배열은 포인터(pointer) 와 매우 밀접한 구조다.
- Multi-dimensional Array (다차원 배열)
2차원 이상으로 확장된 배열 구조
예를 들어 2차원 배열은 행(row)과 열(column)로 구성됨.
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
printf("%d\n", matrix[1][2]); // 출력: 6
메모리상에서는 행이 먼저, 열이 나중에 저장되는 row-major order 방식으로 저장됨.
즉, matrix[1][2]는 내부적으로 *(matrix[0] + 1 * 열개수 + 2)로 계산된다.
- Dynamically Allocated Array
C에서 배열 크기를 런타임에 결정하고 싶을 때는 동적 메모리 할당을 사용한다.
- malloc()
int *arr = (int *)malloc(5 * sizeof(int));
- 초기화되지 않음 (쓰레기 값 존재)
- malloc은 지정한 크기만큼 메모리를 할당하고, 시작 주소를 반환함
- calloc()
int *arr = (int *)calloc(5, sizeof(int));
- 0으로 초기화됨
- 요소 개수와 크기를 따로 지정 가능
- realloc()
arr = (int *)realloc(arr, 10 * sizeof(int));
- 기존 메모리를 확장하거나 축소
- 기존 데이터는 유지됨
- free()
free(arr);
- 동적 할당된 메모리를 해제해야 메모리 누수를 방지할 수 있음
- Structures in C
구조체(Structure) 는 서로 다른 자료형을 하나로 묶을 수 있는 사용자 정의 데이터형
struct Person {
char name[20];
int age;
float height;
};
구조체 변수 선언:
struct Person p1 = {"Alice", 25, 162.5};
printf("%s %d\n", p1.name, p1.age);
또는 typedef로 이름을 단축할 수 있음:
typedef struct {
char name[20];
int age;
} Person;
Person p2 = {"Bob", 30};
구조체는 논리적으로 관련 있는 데이터를 하나로 묶을 때 유용하다.
예: 학생 정보, 좌표, 복소수 등.
- Self-referenced Structures (자기참조 구조체)
구조체 안에서 자기 자신을 가리키는 포인터를 멤버로 포함할 수 있다.
이 개념은 연결 리스트(linked list) 의 핵심이 된다.
struct Node {
int data;
struct Node *next;
};
- next는 같은 구조체 타입(struct Node)을 가리킴
- 이런 구조를 사용하면 연속되지 않은 메모리에서도 데이터들을 연결할 수 있음
- List
리스트(List) 는 배열과 달리 동적으로 크기가 변하는 선형 자료구조다.
대표적으로 연결 리스트(Linked List) 가 있음.
struct Node {
int data;
struct Node *next;
};
단일 연결 리스트 예시
struct Node *head = NULL;
head = (struct Node *)malloc(sizeof(struct Node));
head->data = 10;
head->next = NULL;
| 연결리스트의 장점 | 연결리스트의 단점 |
| 삽입/삭제가 빠름 (포인터만 변경) 크기 제한이 없음 |
인덱스 접근이 불가능 (O(n)) 추가적인 포인터 메모리가 필요함 |
| 개념 | 설명 | 시간복잡도 (접근 / 삽입) |
| 배열(Array) | 고정 크기, 인덱스로 빠른 접근 | O(1) / O(n) |
| 다차원 배열 | 행렬 등 표현에 사용 | O(1) / O(n²) |
| 동적 배열 | 실행 중 크기 변경 가능 | O(1) / O(n) |
| 구조체 | 여러 자료형 묶음 | - |
| 자기참조 구조체 | 연결 리스트 구현의 기반 | - |
| 연결 리스트 | 노드 기반 동적 자료구조 | O(n) / O(1) |
'이론공부 > 자료구조, 알고리즘' 카테고리의 다른 글
| 4. Linked List (1) (0) | 2025.11.07 |
|---|---|
| 3. Stack & Queue (2) - 활용 (0) | 2025.11.07 |
| 3. Stack & Queue (1) (1) | 2025.11.07 |
| 2. Arrays & Structures (2) - 활용 (0) | 2025.11.06 |
| 1. 기본개념 - 시간복잡도 & 공간복잡도 (0) | 2025.11.06 |