C언어 typedef - ceon-eo typedef

전 강의에서 구조체를 선언할 때는 struct 구조체 이름 { 구조체 멤버들 }; 형태로 선언하고, main 함수에서 struct [구조체 이름] [변수 이름] 과 같이 선언한 후 사용한다고 배웠습니다.

하지만 구조체 선언을 할 때도 좀 더 편리한 방법이 있습니다. typedef 키워드를 사용하는 것입니다. typedef를 사용할 때는 구조체 이름을 생략할 수 있는데, 먼저 구조체 이름을 생략하지 않고 사용하는 방법에 대해 알아보겠습니다.

typedef


typedef키워드는 C언어에서 자료형을 새롭게 이름을 붙일 때 쓰는 키워드입니다. typedef를 이용하면 main 함수에서 구조체를 선언할 때 매번 struct를 써줄 필요가 없습니다. 이 typedef를 사용할 때에는 구조체 별칭이 필요한데, 구조체 별칭은 구조체를 정의할 때 중괄호 뒤에 써주면 됩니다. 코드를 보며 사용하는 방법을 알아보겠습니다.

위와 같이 typedef와 별칭을 써주면 main 함수에서 struct [구조체이름]을 써줄 필요 없이 별칭만 써도 구조체 선언이 가능합니다. 구조체 별칭은 구조체 이름과 동일하게 써주어도 무관하지만, 일반적으로 구조체 이름과 별칭을 둘 다 쓸 때는 구조체 이름 앞에 _를 붙여줍니다. 

익명 구조체


구조체 이름도 생략가능하다고 했던 것, 기억나시나요? 사실 사용하는건 별칭뿐인데 매번 구조체 이름까지 적는 것이 귀찮을 수 있습니다. typedef를 쓰면 구조체 이름을 쓰지 않고 별칭만 사용하는 것도 가능합니다. 코드로 바로 살펴보겠습니다.

이렇게 구조체 이름을 굳이 적지 않아도 구조체를 선언하고 사용하는 것이 가능합니다. 이렇게 구조체 이름을 따로 지정하지 않고 별칭만 사용하는 것을 익명 구조체라고 합니다. typedef를 이용해 구조체 별칭을 사용할 때에도 문법은 똑같으므로 멤버에 접근할 때는 똑같이 .을 이용하면 됩니다.

구조체 변수를 선언할 때마다 struct 키워드를 붙여주었습니다. 하지만 이 키워드를 생략하는 방법또한 존재합니다. 이때는 typedef 키워드를 사용하여 구조체를 정의하면 됩니다. 그리고 typedef 키워드는 구조체 뿐만아니라 자료형의 별칭을 만드는 기능으로 모든 자료형의 별칭을 지정할 수 있습니다. 먼저 구조체에서의 사용을 학습하고 자료형을 별칭으로 지정하는 방법도 보도록 하겠습니다.

선언하는 형식을 보도록 하겠습니다.

typedef struct 구조체이름 {
자료형 멤버이름;
} 구조체별칭;

정의를 내리는 부분에서 구조체이름과 구조체별칭은 중복되도 문제가 없습니다. 그리고 관례상 구조체이름은 앞에 _(언더슬래시)를 붙여줍니다.

typedef를 이용하여 구조체의 별칭을 만들었다면 변수를 선언할때는 더이상 struct 키워드를 사용하지않습니다. 직접 코드를 보고 typedef를 사용하였을 경우의 차이를 확인하도록 하겠습니다.
처음 공부하시는 분들은 주석을 읽어보시면서 코드를 보시면 빠른 이해가 될 것입니다.

#include <stdio.h> #include <string.h> typedef struct _Person { // 구조체 이름은 _Person char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의 int main(void) { Person p1; // 구조체 별칭 Person으로 변수 선언 strcpy(p1.name, "박소영"); p1.age = 22; strcpy(p1.address, "드림타워"); // 점으로 구조체 멤버에 접근하여 값 출력 printf("이름: %s\n", p1.name); // 이름: 박소영 printf("나이: %d\n", p1.age); // 나이: 22 printf("주소: %s\n", p1.address); // 주소: 드림타워 return 0; }

구조체를 정의할 때 typedef 키워드를 사용하였고 정의를 마치는 중괄호와 세미콜론 사이에 구조체의 별칭을 지정하였습니다. Person이라는 이름으로! 밑으로 내려와 main함수를 확인하면 이전과는 다르게 struct 키워드를 명시하지 않고 Person p1;을 선언하였습니다.

Person p1; // 구조체 별칭 Person으로 변수 선언

그런데 구조체 별칭을 사용하지 않고 구조체 이름을 사용하여 변수를 선언하고 싶을때는 처음에 선언하던 방법처럼 struct 키워드를 사용해서 선언을 할 수 있습니다.

Person p1; // 구조체 이름 _Person으로 변수 선언

여기까지 typedef를 이용하여 구조체를 조금더 편리하게 사용할 수 있는 방법을 알아보았습니다. 이번에는 자료형의 별칭을 만드는 기능을 알아보도록 하겠습니다.

typedef 자료형 별칭 typedef 자료형* 별칭

위와 같은 방법으로 자료형의 별칭을 지정이 가능합니다. C 코드로 적용해보자면 아래처럼

typedef int element; // int를 별칭 element로 정의 typedef int* Pnum; // int 포인터를 별칭 Pnum으로 정의 element node; // element로 변수 선언 Pnum NPtr; // Pnum으로 포인터 변수 선언 NPtr = &node; // 포인터에 변수의 주소를 저장


이제 한가지만 더 학습하고 포스팅을 마치도록 하겠습니다. 사실 struct 뒤에 명시해주던 구조체 이름은 원래 구조체 태그(tag)라고 부릅니다. 그리고 typedef로 정의한 구조체 별칭은 사용자 정의 자료형 또는 타입의 이름 이라고 합니다.

C언어의 관습으로 구조체 태그(구조체이름)과 타입의 이름(사용자 정의 자료형)을 구분하기 위해서 관례상 태그 앞에 _ , tag_, tag를 붙여줍니다. 코드에 따라서는 태그 뒤에 _t를 붙이기도 합니다. 깃허브나 오픈소스, 라이브러리를 사용하다보면 이런 사용형식을 볼 수 있습니다.

그리고 구조체 태그와 타입은 결론적으로 같은 구조체를 지칭합니다. 즉 이름을 같게 만들어도 된다는 이야기 입니다. 밑의 예시코드처럼 말이죠. 이런 경우 구조체 변수를 선언할 때 struct Person p1;도 가능하고 Person p1;도 가능합니다.

typedef struct Person { // 구조체 이름 Person char name[20]; int age; char address[100]; } Person; // 타입 이름 Person

저는 처음 학습했을때 구조체 이름과 타입이름이 같은게 편하다고 생각하여 동일하게 이름을 지었는데요 요즘은 앞에 _(언더바)를 붙이네요! 이상으로 typedef에 대해서 알아보았습니다.

안녕하세요. 취업한 공대누나입니다.

오늘은 구조체에 대해 공부해보도록 하겠습니다.

1. 구조체란? (의미와 선언 방법)

구조체는 사용자가 정의해서 사용하는 사용자 정의 자료형입니다.

하나 이상의 변수들을 그룹화하여 새로운 자료형을 만드는 것입니다.

구조체를 정의한다는 것은 구조체를 만든다는 의미와 같습니다.

어떻게 구조체를 만드는지 보도록 하겠습니다.

C언어 typedef - ceon-eo typedef

struct라는 키워드가 바로 구조체의 시작을 알리는 부분입니다.

computer라는 이름의 구조체를 정의하고 있습니다.

그리고 중괄호 안에 변수를 선언해줍니다.

구조체에 의해 정리된 요소를 우리는 멤버라고 부릅니다.

다 선언을 한 뒤에 세미콜론을 꼭 해줘야 하는 것 잊지 마세요.

일반적으로는 위와 같이 main 함수 바깥에 선언하지만 이것은 어떻게 사용하느냐에 따라 달라집니다.

구조체를 위와 같이 만들었다고 해서 끝난 것이 아닙니다.

int형 변수를 사용할 때에도 우리가 int a와 같이 a라는 이름의 변수를 선언해줍니다.

구조체도 마찬가지입니다.

c1이라는 구조체 변수를 선언해 주어야 합니다.

선언해 줄 때에는 struct 키워드와 함께 우리가 만든 구조체 (템플릿)이름을 써주고 구조체 (변수명)을 입력합니다.

즉, struct computer c1이라고 해주면 됩니다.

2. 구조체의 초기화

이번엔 구조체의 초기화 방법에 대해 이야기 해보도록 하겠습니다.

C언어 typedef - ceon-eo typedef

위의 그림과 같이 구조체에 선언해 놓은 것에 맞춰서 데이터를 입력하면 됩니다.

monitor에는 30, keyboard에는 1, ram에는 16이라는 값이 들어간 것입니다.

3. 구조체 멤버에 접근

그렇다면 이번에는 값이 잘 저장되어 있는지 확인해보도록 하겠습니다.

구조체 변수의 멤버에 접근 할 때에는 '.'을 사용하여 접근을 하게 됩니다.

예시를 한 번 보도록 하겠습니다.

C언어 typedef - ceon-eo typedef

c1의 monitor라는 멤버에 접근을 하고 싶으면 c1.monitor와 같이 참조를 하면 됩니다.

변수에 값을 대입할 때에도 마찬가지인데요.

C언어 typedef - ceon-eo typedef

처음에 값을 대입할 때에도 그림과 같이 해줄 수 있습니다.

.을 이용해서 멤버에 접근한 뒤 값을 할당해줍니다.

4. typedef

우리는 위에서 computer라는 구조체 템플릿의 변수를 선언하기 위해서는

struct computer c1이라고 해야 한다고 알았습니다.

하지만 이렇게 매번 struct 키워드를 붙여야 하는 것은 아닙니다.

구조체의 별칭을 만들어서 키워드를 없앨 수 있는데요.

typedef라는 키워드를 이용하면 됩니다.

C언어 typedef - ceon-eo typedef

위와 같이 구조체 템플릿을 만들 때 typedef라는 키워드를 넣었습니다.

그리고 중괄호를 닫은후 ~ 세미콜론 사이에 구조체의 별명과 같은 것을 붙여줍니다.

위와 같이 하고 난 뒤에는  구조체를 선언할 때에 struct키워드를 빼도 됩니다.

나머지 멤버에 접근을 하고 값을 할당하는 것은 기존과 똑같습니다.

구조체는 여러 형의 데이터를 묶어야 할 때 사용해주면 좋습니다.

예를 들어서 함수에 데이터를 넘겨줄 때 구조체 자체를 넘겨주게 되면 

함수를 읽을 때에도 수정을 할 때에도 훨씬 쉬워집니다.

감사합니다.