앞서서 필자는 전공을 거지같이 공부를 안해서 다시 부족한 부분을 매꾸고자 공부한 내용을 문서화해서 이 블로그에 올리려고 한다. 앞으로 할 공부들이 산더미 같아서 하기가 싫지만 한걸음씩 나아가다보면 기본은 할 수 있을거라고 생각하고 싶다. 글솜씨가 없어서 보기 불편한 점은 참고했으면 한다. 일단 간단하게 정리하는 방향으로 쓸 것이다. 계속해서 데이터를 쌓으면 더 잘해지지 않을까? 라는 생각을 한다.
일단 자료구조를 공부하기 전에 먼저 C언어의 기본 문법부터 정리하고 가자.
먼저 메모리라는 개념을 확인해야한다.
* 참고로 지금 정리하는 내용은 유튜브에 권오흠 교수님이 올려주신 강의를 기반으로 정리하는 것이다.
(www.youtube.com/watch?v=-XbHQQ8pUQY&t=2510s)
링크로 들어가면 더 자세하게 배울 수 있다.
메모리
간단하게 메모리는 데이터를 보관하는 장소라고 보면 된다.
위의 사진처럼 메모리는 테이블 형식으로 되어 있다. 그리고 각각의 테이블은 주소를 가지고 있다.
바이트 단위로 주소가 지정되었다. 모든 변수는 주소를 가지고 있다.
변수는 단순히 메모리를 저장할 수 있는 공간이라고 보면 된다.
ex. int형 변수는 4바이트의 크기를 가진다.
포인터
C언어의 첫 번째 통곡의 벽 포인터이다.
먼저 포인터를 정의하면 메모리 주소를 값으로 가지는 변수를 의미한다.
연산자 & : 변수로부터 그 변수의 주소를 추출하는 연산자이다.
포인터와 배열
배열과 포인터는 아주 밀접한 관계를 가진다. 이 두가지를 자유롭게 변환하면서 쓸 수 있는게 중요하다.
배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수이다.
예를 들어 int sum[10]이라는 배열을 선언했다고 치자.
여기에서 sum은 sum 배열의 0번째 주소를 가리킨다. 그래서 sum+1 이렇게 하면 1번째 주소를 가리키게 된다.
#include <stdio.h>
int main(void) {
int sum, i, average;
int num[10];
for (i = 0; i < 10; i++) {
scanf("%d", &num[i]);
}
sum = calculate_sum(num);
average = sum / 10;
printf("%d\n", average);
return 0;
}
int calculate_sum(int* array) {
int sum, i;
sum = 0;
for (i = 0; i < 10; i++) {
sum = sum + array[i];
return sum;
}
}
위의 코드는 배열과 포인터의 관계를 보여주는 코드이다.
코드 자체는 아주 간단한다. 10개의 값을 입력받아서 calculate_sum이라는 함수로 보내서 합을 구한다음 평균을 구하는 프로그램이다.
여기에서 입력받은 값을 함수로 보내는 부분을 확인하자. 정확하게 말하면 값을 보낸 것이 아니라 값의 주소를 보낸 것이다. 그 과정에서 배열의 이름이 사용된 것이다.
동적 메모리 할당
먼저 동적 메모리 할당을 왜 사용할까?
현재로써 우리가 배우는 깨작깨작뽀작한 코드를 작성하면서 동적 메모리 할당을 쓸 생각을 하지 않을 것이다. 왜냐하면 어처피 메모리를 작게 사용해서 선언해놓고 그냥 두고 낭비해도 프로그램 성능에 큰 영향을 미치지 않기 때문이다. 하지만 프로그램의 규모가 커질 때는 이야기가 달라진다. 이런 메모리 누수가 없어야 프로그램 성능에 조금이라도 도움이 된다. 그렇기 때문에 이런 것을 미리미리 생각하면서 습관을 들이는 것이 중요하다.
변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이것을 동적 메모리 할당이라고 부른다.
malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다.
참고로 동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있다.
원리는 간단하다.
1. 더 크게 동적으로 할당된 배열을 만든다.
2. 기존에 배열을 복사한다.
3. 더 큰 배열에 기존 배열의 내용을 복사하는 것이다.
일단 간단하게 메모하는 형식으로 이렇게 글을 마친다.
글을 다 쓰고 나니깐 연습이 많이 필요할 것 같다. 이 짧고 간단한 내용을 전달하는 데에도 힘들다.