Really Powerful Programming Language C
C언어에서는 자바나 C++와 같이 클래스는 없지만, 데이터의 집합체라고 불릴 수 있는 구조체가 존재하죠, 다른 객체 지향 언어부터 학습을 하신 분이라거나, 공부해오신 분은 생각보다 이 C언어의 문법에 쉽사리 익숙해지지 않습니다. 그중에서 구조체에 대해서 학습을 해보고자 합니다. 구조체는 말 그대로 건물의 형태와 같습니다.
그 구조체 내부에 위와 같이 정수형 변수 a와 문자열 변수 name이 있다고만 가정하면, 메모리는 당연히 우선 정수형 바이트 4바이트를 선점합니다. 그리고, 문자열의 사이즈를 확인할 수 없기 때문에 값이 복사되거나, 대입될 때 까지는 메모리를 문자열 포인터 변수만큼 차지하게 됩니다. 이외에도 다른 변수들 또한 메모리를 아래 칸과 같이 점유하게 되겠죠?
Struct
구조체의 기본 문법은 아래와 같습니다.
struct Foo {
...
};
간단해 보이지만, 간단하게 학습한 코드일수록 시간이 지나면 쉽게 잊혀지는 법입니다. 그렇기 때문에 예제 코드를 준비해보았습니다. 우선 제가 작성한 코드를 작성하기 전에 아래 코드 영역에서 헤더 파일을 추가해주시면 됩니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
아래 작성된 구조체는 위에서 간단하게 구현된 구조체와 다르게 조금 복잡하지만 전혀 어려울 게 없습니다.
typedef struct Foo
{
int val;
char *name;
union info
{
int id;
}info;
struct Foo *next;
}Foo;
1. typedef : Foo구조체를 선언할 때 typedef을 사용하지 않으면 당연히 struct Foo라고 컴파일러에게 알려주어야 합니다. 하지만 typedef를 통해 구조체 선언이 끝나는 부분에 작성된 이름을 통해서 호출, 생성이 모두 가능합니다.
2. union : 공용체라고 불리는 이 구조체와 같은 자료형은 조금 독특한 방식으로 동작합니다. 구조체의 경우는 내부에 선언된 변수 각각에 메모리가 할당되지만 공용체는 내부에 선언된 변수 중 가장 큰 변수의 메모리를 할당받습니다. 그래서 공용체라고 불리는 거죠!
3. struct Foo *next??? : 위에서 typedef을 사용하면 Foo라고만 선언할 수 있다고 말씀하시지 않았나요? 네 맞긴한데요, 아직 컴파일러는 Foo를 만나지 않았고 구조체에 관한 코드 파싱이 끝나지 않은 상태입니다. 그렇기 때문에 별칭을 만나기 전까지는 struct키워드를 사용해야 하는 거죠!!!
Foo *makeFoo(int val, char *name)
{
Foo *foo = (Foo*)malloc(sizeof(Foo));
foo->val = val;
foo->name = name;
return foo;
}
union info *detailFoo(int id)
{
union info *in = malloc(sizeof(union info));
in->id = id;
return in;
}
void showFoo(Foo *foo, union info *in)
{
printf("Age : %d\tName : %s\nId : %d\n",
foo->val, foo->name, in->id);
}
4. *makeFoo(int val, char *name) : 말 그대로, 반환자 그대로 Foo구조체를 만드는 함수입니다. 맨 첫줄에 보면 동적으로 메모리를 할당하기 때문에 stdlib.h내부에 있는 malloc함수를 사용해서 Foo의 사이즈만큼 메모리를 할당한 다음 구조체 내부 변수에 대응되는 값을 대입하고 그렇게 만들어진 foo를 반환합니다.
5. *detailFoo(int id) : Foo내부에 선언된 info 공용체에 대한 메모리를 할당하고 변수에 대응되는 값을 대입하고 공용체 변수를 반환하는 함수입니다. 별 특별한 기능은 없죠
6. showFoo(Foo *foo , union info *in) : foo 와 in에 변수의 내용을 출력하는 함수입니다!!
int main()
{
Foo *foo, *foo2;
foo = makeFoo(20, "GilDong");
foo2 = makeFoo(21, "Hana");
foo->next = foo2;
union info *in = detailFoo(21);
showFoo(foo, in);
free(foo);
free(in);
return 0;
}
1. 구조체 및 공용체 생성 : 제가 위에서 작성한 코드를 통해서 메모리가 할당된 각 자료형을 변수에 대입합니다.
2. next : 굳이 next라고 할 필요는 전혀 없습니다. 코드 상에서 의미를 주고자 다음 학생을 가리키는 포인터 변수로 foo의 다음으로 오는 변수 foo2를 가리키는 변수입니다.
3. free() : stdlib.h에 선언되어 있는 함수로 동적으로 할당된 메모리를 다시 해제하고 반환하는 함수입니다. 자바, 파이썬과 같은 동적 언어 같은 경우에는 garbage collector가 알아서 메모리를 할당 및 해제해주지만 C , C++에서는 어림없죠, 개발자 본인이 해제를 해주어야 합니다.
코드를 천천히 작성하시면서 한줄 한 줄 이해해가시는 게 중요합니다. 시간이 얼마 걸리든, 그렇게 해서 하나라도 이해를 하는 것이 훨씬 중요합니다!!
봐주셔서 감사합니다~😜😜😜😜😜😜😜
'C' 카테고리의 다른 글
[C] 단일 연결리스트 누구나 쉽게 이해하기!(LinkedList) (0) | 2020.12.26 |
---|---|
[C] 포인터 변수 자유자재로 사용하기! (0) | 2020.12.07 |
트리자료구조_on c[2] (0) | 2020.03.09 |
트리자료구조_on c[1] (0) | 2020.03.04 |
큐에 대한 가벼운 생각 (0) | 2020.03.02 |
댓글