Jiyong's STUDY

구조체 struct와 typedef 선언 본문

프로그래밍/C

구조체 struct와 typedef 선언

Kingjiyong 2018. 5. 18. 02:59

구조체란?


 구조체는 C언어로 프로그램을 작성할 때 반드시 필요한 문법이다.

그 필요성을 구조체를 모른다면 잘 모르지만 프로그램이 조금 복잡해지기 시작할 때,

변수를 관리하면서 불편함을 느낄 것이다.


예를 들어 학생들의 성적을 입력받고, 그 결과를 출력받는 프로그램을 작성한다고 가정하면

관리해야 할 변수들이 늘어나게 된다.

학생의 이름, 번호, 성적 등등... 많아진다.

구조체를 사용하지 않고 프로그램을 작성한다면 분명히 불편함을 느끼게 된다.


이런 경우에 구조체를 사용하여 관련된 변수들을 한번에 묶어 관리한다면 편하게 관리가 가능하다.


그럼 구조체가 무엇인가?


구조체는 사용자가 정의할 수 있는 자료형이다. 설명으로 하긴 어려우니 예시를 보여주면


struct students

{

char name[20];

int number;

int score;

};


이런식으로 구조체를 선언할 수 있다.


이 구조체를 설명하자면 students 라는 이름의 자료형을 정의하는데, 

그 students 라는 자료형은 길이가 각각 20인 char형 일차원 배열과 int형 변수를 두 개를 지니는 자료형이다.


즉 students형 변수를 하나 선언하면 그 변수를 이용하여 구조체의 멤버인 3가지의 변수를 관리를 할 수 있다는 의미이다.


struct students

{

char name[20];

int number;

int score;

};


int main(){

struct students Students;

printf("학생의 이름: ");

scanf("%s", Students.name);

printf("학생의 번호: ");

scanf("%d", &Students.number);

printf("학생의 점수: ");

scanf("%d", &Students.score);


printf("3학년 1반 %d번 %s의 점수: %d", Students.number, Students.name, Students.score);

}


이런 식으로 구조체를 사용 할 수 있다.


구조체를 정의한 뒤, 구조체를 선언하는 방법은

struct struct_name var_name;

의 방법으로 구조체임을 알리는 struct를 적고, 구조체의 이름, 그리고 변수의 이름까지 적어줘야 한다.


그리고 선언한 Students를 이용하기 위하여 사용한 방식이 보이는데

Students.name과 같이 구조체의 멤버를 변수 이름 뒤에 .을 찍고 그 뒤에 적어줬다.


구조체를 정의함과 동시에 선언을 하는 방법들에 대하여 알아보면


struct students

{

char name[20];

int number;

int score;

}stu1, stu2, stu3;


students형 변수 stu1, stu2, stu3을 정의와 동시에 선언을 했다.

사실 이런 방식은 잘 사용하지 않는다. 하지만 간혹 사용하는 사람이 있기에 알고는 있어야 한다.


struct students

{

char name[20];

int number;

int score;

};

struct students stu;


이 예제는 보자마자 이해가 될 것이다. 단순하게 정의를 한 뒤 바로 선언을 했다.


다음으로 구조체의 선언과 동시에 초기화를 하는 방법에 대해서 설명하자면,


struct students

{

char name[20];

int number;

int score;

};


int main(){

students stu={"홍길동", 1, 100};

printf("%d번 %s의 점수는 %d점", stu.number, stu.name, stu.score);

}


결과 >> 1번 홍길동의 점수는 100점


구조체를 정의할 때 사용한 변수의 순서대로 중괄호 안에 넣어주면 선언과 동시에 초기화가 가능하다.


이렇게 구조체에 대하여 설명을 했으나 구조체는 일반적으로 typedef 선언을 통하여 정의한다.

그 이유는 구조체를 선언할 때, 구조체의 이름 앞에 struct를 명시해줘야 하는 점이 귀찮기 때문이다.


typedef는 무엇인가?


typedef 선언은 자료형의 이름을 사용자가 지정하여 사용할 수 있게 해주는 선언이다.


typedef int INT;

typedef unsigned int UINT;


int main(){

INT num1=10;

UINT num2=20;

printf("%d, %u, %d, %d", num1, num2, sizeof(num1), sizeof(num2));

}


결과 >> 10, 20, 4, 4


sizeof 연산을 통해 INT와 UINT의 크기를 확인한 결과 4가 나옴으로써 INT가 int, UINT가 unsigned int가 맞다는 것을 확인했다.

typedef 뒤에 자료형의 이름, 사용자가 정의한 이름을 명시함으로써 사용이 가능하다.

예를 들어서 typedef A B C D; 라는 선언을 했다면, 컴파일러는 이를 어떻게 받아들이나면

typedef (A B C) D 라고 받아들인다. 즉 사용자가 정의할 수 있는 자료형의 이름에는 공백이 들어갈 수 없다.


우리는 이러한 typedef를 구조체에도 사용할 수 있다.


struct students

{

char name[20];

int number;

int score;

};

typedef struct students Students;


이런 방식으로도 구조체에 typedef 선언을 할 수 있지만 다른 방법들도 있다.


typedef struct students

{

char name[20];

int number;

int score;

}Students;


이렇게 typedef 선언과 동시에 구조체를 정의할 수도 있다. 

더욱 편리한 방법이므로 이 방법이 선호되는데, 여기에서 더 편리함을 추구할 수도 있다.


typedef struct

{

char name[20];

int number;

int score;

}Students;


구조체의 이름을 적지 않고 typedef 선언을 통하여 사용자 정의 이름을 지을 수 있다.

하지만 이런 방식은 이 위의 방식과 다른점이 있다.


typedef 선언을 통한 사용자 정의 이름으로 구조체를 선언할 수 있지만,

원래의 이름이 없으므로 struct struct_name var_name; 식의 선언은 불가능하다.


그렇지만 아래의 방식이 선호되는데 그 이유는 어차피 typedef 선언을 통한 이름을 사용하기 위해 typedef를 사용한 것이기 때문이다.


typedef struct

{

int xpos;

int ypos;

}point;


int main(){


point p1;

p1={10, 20};

printf("xpos=%d, ypos=%d", p1.xpos, p2.xpos);

}


결과 >> xpos=10, ypos=20


더더욱 간단해진 코드를 볼 수 있다.


다시 말하지만 구조체를 사용하지 프로그램은 없을 정도로 중요하고, 그 중요성을 모르겠다면 생각해보고 기억해야 한다.


'프로그래밍 > C' 카테고리의 다른 글

공용체 union의 정의, 설명  (0) 2018.05.25
구조체의 배열과 포인터의 선언과 -> 접근  (0) 2018.05.18
void 포인터  (0) 2018.05.16
함수 포인터  (0) 2018.05.16
C언어의 main함수와 argc, argv  (0) 2018.05.16