카테고리 없음2017. 12. 22. 18:57

구조체태그                                                              

태그정의란? 타입을 만들어주는 것 (사용자 정의 타입)

> 사용자 정의란 또 뭔가? int double long 과 같이 C 자체에서 주어지는 타입이 아닌 사용자가 만든 타입


■ 태그 정의하는 방법 ①


struct tag_People {

     char Name[10];

     int Age;

     double Height;

};                               // 끝에 세미콜론이 있어야 함 ,, 세미콜론을 빼먹는 실수 주의하기


태그정의(타입 생성)의 목적(왜 굳이 변수를 바로 선언안하고 타입을 생성해주는가?)

=> 이 타입으로 같은 형의 변수를 여러 번 선언할 수 있기 때문에

즉, 변수를 만들 때마다 멤버 목록을 작성해야하는 번거로움을 줄여준다.

※ struct tag_People People;           --> C형

tag_People People;                      -->C++형 

구형 C 컴파일러는 구조체 태그라는 것을 명시해주기 위해서 태그명 앞에 struct를 붙여준다.

그러나 C++ 에서는 태그 자체가 하나의 타입으로 인정되기 때문에 굳이 struct를 안붙여줘도 된다.

최근 컴파일러들은 모두 C++ 이다.


 태그 정의하는 방법 ②

typedef문을 이용하기.


typedef struct {

     char Name[10];

     int Age;

     double Height;

} PeopleType;

PeopleType People;



정리해서 한눈에보기                                                              

struct {

     char Name[10];

     int Age;

     double Height;

} People;

// 태그 정의안하고 바로 위 구조체타입의 People 변수 생성


struct tag_People {

     char Name[10];

     int Age;

     double Height;

};

tag_People People;

// 태그를 정의한것


typedef struct {

     char Name[10];

     int Age;

     double Height;

} PeopleType;

PeopleType People;

// 태그를 정의한것 (typedef이용)


1.

만약 태그정의 기능이 없었다면 구조체변수를 선언할 때마다 구조체멤버 목록을 작성해야하는 귀찮음이 따랐을 것. 

2.

태그를 정의 해놓으면, 이 타입으로부터 파생되는 유도형 변수 선언이 가능해진다.

tag_People 형의 구조체를 가리키는 포인터 변수를 선언하고 싶다거나, 이 타입의 구조체 여러 개를 모아서 배열을 구성하고 싶다면, 일단 그 구조체의 타입이 존재해야된다.

tag_People *pPeople;

tag_People arPeople[100];

포인터나 배열은 타입으로부터 유도되는 것이지 변수로부터 유도되는 게 아니기 때문에 포인터나 배열 변수를 선언하려면 먼저 구조체 타입이 태그 정의를 통해 생성되어 있어야 한다. 다른 구조체를 포함할 때도 마찬가지다.

3.

태그를 정의하지 않으면 "요렇게 요렇게 생긴 구조체를 전달하라"는 선언 자체가 불가능하다

구조체를 함수의 인수나 리턴값으로도 사용할 수 있으려면 태그정의를 해야한다.



부연설명)

사용자정의타입(태그정의)은 main함수 이전에 해야 모든 함수에서 이 타입을 사용할 수 있다.(마치 int나 double처럼)

실제로 사용자정의타입 정의는 변수선언이 아니라서, 굳이 main 함수 내에 작성하여 범위를 제한시킬 이유가 없다.

가급적 앞쪽에 선언하여, 컴파일러가 바로 인식할 수 있게끔 하기.



Posted by 넓스