C언어 사용자정의 자료형 구조체1

    2018-02-08 02:57:43 작성

    구조체란 하나이상의 자료형을 묶어서 새로운 자료형으로 정의하여 사용하는 자료형입니다.

    구조체가 필요한 이유와 정의

    프로그램상에서 마우스의 좌표정보를 관리해야 한다고 한다면 다음과 같이 두개의 변수가 필요합니다.

    int xPos; // 마우스의 x좌표
    int yPos; // 마우스의 y좌표

    xPos와 yPos는 서로 독립된 정보를 표현하는게 아닌 마우스의 좌표정보라는 하나의 정보를 표현하고 있습니다.
    이렇게 관련있는 항목을 묶어 새로운 하나의 자료형으로 관리하는 것이 구조체입니다.
    구조체는 struct 키워드를 사용하고 다음과 같이 정의할 수 있습니다.

    struct point { // point라는 이름의 구조체 정의
    	int xPos; // int형 xPos 구조체의 멤버 변수
    	int yPos; // int형 yPos 구조체의 멤버 변수
    };

    이렇게 정의된 struct point는 int 또는 double 처럼 하나의 자료형이 됩니다.
    사용자가 직접 자료형을 정의하기 때문에 구조체를 사용자정의 자료형이라고 합니다.
    int xPos와 int yPos는 point 구조체의 멤버 변수입니다.


    구조체정의와 변수 선언

    구조체의 변수도 일반적인 변수 선언과 다를게 없습니다.
    단지 사용자 정의 자료형이기 때문에 struct 키워드가 필요합니다.

    struct point {
    	int xPos;
    	int yPos;
    };
    struct point pos1, pos2; // point형 변수 pos1과 pos2 선언

    다음과 같이 구조체 정의와 변수 선언을 한번에 할 수 있습니다.

    struct point {
    	int xPos;
    	int yPos;
    } pos1, pos2; // point형 변수 pos1과 pos2 선언

    다음과 같이 구조체 정의와 변수 선언을 동시에 할때 구조체의 이름을 익명으로 할 수 있습니다.

    struct {
    	int xPos;
    	int yPos;
    } pos1; // 익명으로 선언된 구조체 변수 pos1

    typedef와 구조체 정의

    구조체를 사용할때 struct 키워드를 매번 사용한다면 약간의 불편함이 있을 수 있습니다.
    typedef로 구조체이름을 새롭게 정의해서 사용하면 편리합니다.

    struct point {
    	int xPos;
    	int yPos;
    };
    typedef struct point Point; // struct point에 Point 이름 부여
    Point pos1; // Point형 변수 pos1선언

    다음과 같이 typedef선언과 구조체 정의를 한번에 할 수 있습니다.

    typedef struct point {
    	int xPos;
    	int yPos;
    } Point; // 변수 선언이 아닌 struct point에 typedef로 Point 이름 부여
    Point pos1; // Point형 변수 pos1선언

    다음과 같이 typedef선언과 구조체 정의를 한번에 할 때 익명으로 할 수 있습니다.

    typedef struct {
    	int xPos;
    	int yPos;
    } Point; // 익명으로 선언된 구조체에 typedef로 Point 이름을 부여
    Point pos1; // Point형 변수 pos1선언

    구조체 초기화 및 멤버변수 접근

    구조체를 생성과 함께 초기화 하려면 {}를 이용해 멤버의 순서대로 값을 대입하면 됩니다.
    멤버 변수에 접근 하려면 .(멤버연산자)를 사용하여 참조할 수 있습니다.

    #include <stdio.h>
    
    typedef struct _point {
    	int xPos;
    	int yPos;
    } Point;
    
    int main(void) {
    	Point pos1 = { 11, 110 }; // xPos, yPos 각각 초기화
    	Point pos2 = { 22 }; // 일부 초기화시 다른값은 0으로 초기화
    	Point pos3;
    	pos3.xPos = 33;
    	pos3.yPos = 330;
    
    	printf("pos1 : [%d, %d]\n", pos1.xPos, pos1.yPos);
    	printf("pos2 : [%d, %d]\n", pos2.xPos, pos2.yPos);
    	printf("pos3 : [%d, %d]\n", pos3.xPos, pos3.yPos);
    	return 0;
    }



    연습문제

    1. 이름, 나이, 성별을 나타내는 구조체 person을 정의하세요.
    2. 2개의 person 변수를 선언하고 결과와 같이 출력되도록하세요.