반응형

자료구조 기초: 배열부터 동적 메모리까지 완전 정복! 💻
프로그래밍을 하다 보면 데이터를 효율적으로 관리하는 것이 정말 중요해요. 오늘은 자료구조의 기초 개념들을 쉽게 풀어서 설명해드릴게요!
1. 배열 (Array): 데이터를 줄 세우기 📊
배열이 뭐예요?
배열은 같은 종류의 데이터를 메모리에 연속으로 저장하는 자료구조예요. 쉽게 말해서 사물함처럼 번호가 매겨진 칸에 데이터를 차례대로 넣어두는 거죠!
왜 배열을 쓸까요?
학생 60명의 점수를 저장한다고 생각해봐요. 이렇게 하면 어떨까요?
c
int score1, score2, score3, ..., score60; // 😱 미친 짓
대신 이렇게 하면 훨씬 간단하죠!
c
int score[60]; // 😎 깔끔
배열의 핵심 개념
c
int grade[10];
- 자료형 (int): 어떤 종류의 데이터를 넣을지
- 배열 이름 (grade): 배열의 이름
- 크기 (10): 몇 개를 저장할지
- 인덱스: 각 칸의 번호 (주의: 0부터 시작!)
배열로 다항식 표현하기
수학 시간에 배운 다항식 10x5+6x+310x^5 + 6x + 3 을 컴퓨터로 어떻게 표현할까요?
방법 1: 모든 항 저장하기
c
coef[6] = {10, 0, 0, 0, 6, 3}; // 차수 5부터 0까지
간단하지만 0이 많으면 메모리 낭비가 심해요!
방법 2: 0이 아닌 항만 저장하기 (더 효율적!)
c
terms[] = {{8, 3}, {7, 1}, {1, 0}}; // {계수, 차수} 형태
2. 구조체 (Structure): 서로 다른 것들 한 묶음으로! 📦
구조체는 왜 필요할까?
배열은 같은 타입만 저장할 수 있어요. 하지만 학생 정보를 저장하려면?
- 학번: 정수
- 이름: 문자열
- 학점: 실수
이렇게 다양한 타입이 필요하죠! 이때 구조체를 사용해요.
구조체 사용법
c
// 구조체 정의 (설계도 그리기)
struct studentTag {
char name[10];
int age;
double gpa;
};
// 구조체 변수 선언 (실제로 만들기)
struct studentTag student1;
student1.age = 20;
```
### 배열 vs 구조체 비교표
| 구분 | 배열 | 구조체 |
|------|------|--------|
| **목적** | 같은 타입 데이터 묶음 | 다른 타입 데이터 묶음 |
| **메모리** | 연속적 공간 | 필드별로 저장 |
| **예시** | `int scores[10]` | `struct student {...}` |
---
## 3. 희소 행렬 (Sparse Matrix): 0이 많을 때 메모리 아끼기 🤏
### 희소 행렬이란?
행렬의 대부분이 0인 경우를 말해요. 예를 들어:
```
0 0 3 0 0
0 0 0 5 0
0 2 0 0 0
이걸 전부 저장하면 메모리 낭비가 심하겠죠?
효율적인 저장 방법
0이 아닌 값만 (행, 열, 값) 형태로 저장해요!
c
{0, 2, 3} // 0행 2열에 3
{1, 3, 5} // 1행 3열에 5
{2, 1, 2} // 2행 1열에 2
장점: 메모리 절약!
단점: 연산이 좀 복잡해져요.
4. 포인터 (Pointer): 주소를 가리키는 손가락 📌
포인터가 뭐예요?
포인터는 다른 변수가 메모리 어디에 있는지 주소를 저장하는 변수예요.
핵심 연산자
연산자이름역할
| & | 주소 연산자 | 변수의 주소 가져오기 |
| * | 간접 참조 연산자 | 주소에 있는 값 가져오기/변경하기 |
예시로 이해하기
c
char a = 'A'; // 변수 a에 'A' 저장
char *p; // 포인터 p 선언
p = &a; // p에 a의 주소 저장
*p = 'B'; // p가 가리키는 곳(a)의 값을 'B'로 변경
// 결과: a의 값이 'B'가 됨!
포인터는 왜 중요할까?
- 함수에서 값 변경하기: 함수 안에서 외부 변수를 직접 수정 가능 (참조 호출)
- 배열과의 관계: 배열 이름 자체가 첫 번째 요소의 주소를 가리키는 포인터예요!
5. 동적 메모리 할당: 필요할 때 필요한 만큼! 💾
동적 메모리 할당이란?
프로그램이 실행되는 중에 필요한 만큼 메모리를 빌려 쓰는 거예요!
왜 사용할까?
- 메모리 효율: 필요한 만큼만 쓰고 반납!
- 유연성: 실행 중에 크기를 결정할 수 있어요
주요 함수
c
// 메모리 할당하기
int *arr = (int*)malloc(sizeof(int) * 10); // int 10개 크기 할당
// 메모리 사용하기
arr[0] = 100;
// 다 쓰면 반드시 반납하기!
free(arr);
기억해야 할 3단계
- malloc()으로 할당 📥
- 할당된 메모리 사용 🔨
- free()로 반납 📤
⚠️ 주의: malloc()으로 할당한 메모리는 반드시 free()로 해제해야 메모리 누수가 없어요!
반응형