본문 바로가기

BackEnd/C

구조체의 정의

반응형

1. 구조체의 정의



예를 들어 하나의 구조체를 정의 해보겠다.


그룹을 지어줘야 하는 데이터 x좌표 정보와 y좌표 정보가 있다면, 이들 각각을 저장 하기 위한 변


수의 이름을 xPos, yPos라 해보자. 그리고 이들은 모두 double형으로 선언한다고 가정해 보자.


그렇다면 위의 두 변수를 묶어서 관리할 수 있어야 하는데, 이 때 필요한 것이 구조체이며 구조체


를 기반으로 두 변수를 묶으면 위와 같은 형태가 된다. xPos, yPos를 묶어서 하나의 자료형을 구


성한 것이다. 그리고 키워드 struct는 이것이 구조체의 정의가 되도록 한다. 만약에 struct가 아닌 


다른 키워드가 온다면, 이는 구조체가 아닌 또 다른 형태의 정의가 된다. 그리고 point라는 이름


은 구조체의 이름이며, 변수의 선언에 사용되는 자료형의 이름으로 인식된다. point 구조체를 이


루는 구성원 정보는 중괄호 안에 선언되어 있다.



2. 구조체의 정의가 의미하는 것은?


point는 변수의 선언에 사용되는 자료형의 이름으로 인식이 된다. 즉 point라는 이름은 프로그래


머가 정의한 자료형이다.



위의 표에 기본 자료형 double과 구조체 자료형 point를 비교해 놓았다. 변수의 선언방식과 선언


된 변수의 접근방식에는 차이가 있지만, point도 double과 마찬가지로 변수의 선언에 사용이 되


는 자료형의 이름이다.



3. 구조체 활용의 예와 구조체 멤버의 접근


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
 
/*** point라는 이름의 자료형 정의 ***/
struct point
{
    double xPos;
    double yPos;
};
 
int main(void)
{
    /** 변수의 선언 **/
    double num;
    struct point pnt;
 
    /** 변수의 초기화 **/
    num=1.2;
    pnt.xPos=2.2;
    pnt.yPos=3.4;
 
    /** 초기화된 값의 출력 **/
    printf("num: %g \n", num);
    printf("pnt.xPos: %g \n", pnt.xPos);
    printf("pnt.yPos: %g \n\n", pnt.yPos);
 
    /** 변수의 크기 계산 **/
    printf("num의 크기: %d바이트 \n"sizeof(num));
    printf("pnt의 크기: %d바이트 \n"sizeof(pnt));
 
    return 0;
}
cs


1
2
3
4
5
6
num: 1.2
pnt.xPos: 2.2
pnt.yPos: 3.4
 
num의 크기: 8바이트
pnt의 크기: 16바이트
cs

• 13,14행 : 일반 변수와 구조체 변수의 선언방식을 보여준다. 선언방식에 있어서의 차이점은 구조


체 변수의 경우 구조체를 의미하는 키워드 struct를 붙여준다. 그리고 이렇게 선언이 되면 메모리 


공간에는 다음과 같이 할당이 이뤄진다.




• 18~19행 : 변수 pnt는 두 개의 변수 xPos와 yPos로 이뤄져 있기 때문에 접근하는데 있어서 xPos


에 접근할 것인지 yPos에 접근할 것인지를 명시해야 한다. 18행과 19행은 각각 xPos와 yPos의 접


근 방법을 보여준다. 


• 27, 28행 : 여기서의 출력결과는 13행과 14행의 메모리 구성을 대략의 형태로 증명한다. 변수 pnt


가 실제로 double형 변수 xPos와 yPos로 이뤄져 있다면, 28행의 출력결과는 16이 되어야 한다.


4. typedef를 이용한 구조체 변수의 선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
struct point
{
    double xPos;
    double yPos;
};
 
typedef struct point point;
typedef struct point POINT;
 
int main(void)
{
    point p1;
    POINT p2;
 
    p1.xPos=0.1, p1.yPos=0.2;
    p2.xPos=2.4, p2.yPos=2.5;
 
    printf("X축 거리: %g \n", p2.xPos-p1.xPos);
    printf("Y축 거리: %g \n", p2.yPos-p1.yPos);
 
    return 0;
}

cs


1
2
X축 거리: 2.3
Y축 거리: 2.3
cs


• 9,10행 : 두 가지 형태로 typedef 선언을 하고 있다. point와 POINT가 모두 struct point를 대신하도록 선언되었다. 


• 14,15행 : 9,10행의 덕분으로 구조체 변수의 선언이 한결 간단해졌다. struct 키워드를 붙이지 않아도 된다.

 

• 20, 21행 : 구조체 변수의 멤버를 이용해서 뺄셈연산을 하고 있다. 이처럼 구조체 멤버에 접근하여 다양한 연산이 가능하다.



반응형