기본
// 선언
struct date {
	int year;
    int month;
    int day;
};


// 사용
struct date date;

date.year = 2020;
date.month = 1;
date.day = 1;

// typedef 선언
typedef struct {
	int year;
	int month;
	int day;
} date_t;

// 사용
date_t date;

날짜는 년,월,일을 모두 표현해야 의미가 있다. 날짜의 year, month, day처럼 의미있는 단위들을 모아서 선언 및 나열 하는 것이 바로 구조체다. (다른언어의 Class와 비슷하다. 하지만 구조체는 함수 즉 메소드를 가지지 않는다.)

 

사용은 struct date 변수명과 같이 사용 하며 구조체의 접근은 . 으로 접근한다. struct date 변수명이 너무 지저분하게 느껴질때는 typedef와 함께 선언해서 사용하면 date_t date와 같이 깔끔하게 사용할 수 있다.

 

 

기계의 입장에서

C언어 포큐아카데미

왼쪽은 단순히 나열, 오른쪽은 구조체를 사용해서 하나로 묶었다. 이때 기계는 구조체를 어떻게 인식할까?

C언어 포큐아카데미

결론은 똑같다. 컴퓨터 입장에서 구조체가 뭔지 모른다 그냥 사람이 편하게 코딩 할 수 있게 묶는 용도일 뿐이다. 이래서 C언어와 같은 언어를 사람이 이해하기 쉬운 하이레벨랭귀지라고 부른단다.

 

 

구조체 매개변수

C언어 포큐아카데미

date라는 구조체를 매개변수로 삼는 do_something_useless라는 함수가  있다. 구조체 매개변수는 값복사 임으로 원본의 구조체를 변경하지 못한다. 매개변수로 구조체를 던질때 그냥 일반 자료형이랑 똑같이 작동한다는 말이다.

 

그렇다면 원본을 변경하기 위해서는 어떻게 해야할까?? 구조체 포인터를 사용 하면된다.

 

구조체 포인터
typedef struct {
	int year;
	int month;
	int day;
} date_t;

void increate_year(date_t* date) 
{
	(*date).year = (*date).year + 1;
}

void main()
{

	date_t date;

	date.year = 2020;
	printf("%d\n", date.year);
	increate_year(&date);
	printf("%d\n", date.year);

}

C언어 포큐아카데미

위와 같이 구조체 주소를 던지고 함수 내부에서는 포인터로 원본에 값을 접근해서 +1 을한다.

 

C언어 포큐아카데미

(*date).이 조금 지저분할때는 date->를 사용하면 좀 더 편하게 구조체를 접근할 수 있다.

 

 

값복사 vs 주소만 넘기기

 

C언어 포큐아카데미

위와 같이 int형 5만개의 구조체를 매개변수로 넘긴다면 값복사가 5만개나 되서 50,000 X 4 = 200KB의 스택 메모리를 사용하는 엄청난 일이 벌어진다. 이럴땐 구조체의 주소를 넘겨서 포인터로 간단하게 마무리하자.

'C' 카테고리의 다른 글

C 언어 변수에 함수 할당  (0) 2019.12.20
C언어 얕은복사 vs 깊은복사  (0) 2019.12.18
C언어 포인터 배열  (0) 2019.12.13
C 포인터 const  (0) 2019.12.12
C언어 배열과 포인터 차이점  (0) 2019.12.12

+ Recent posts