본문 바로가기
c언어

c언어 구조체의 선언, 초기화, 멤버 참조, 이름 없는 구조체에 대하여 알아보기

by 개발자 L 2023. 1. 15.
반응형

c언어 구조체의 선언, 초기화, 멤버 참조, 이름 없는 구조체에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 구조체를 선언하고 초기화를 하고, 참조하는 방법,

그리고 이름이 없는 구조체에 대하여 알아보는 시간을 가져보도록 하겠습니다.

저번 시간에는 구조체가 어떻게 생긴 녀석인가 정도에 대하여 간략히 알아보는 시간을 가졌다면,

이제부터는 본격적으로 구조체를 사용을 해볼 것입니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 구조체의 선언

구조체는 이전 포스팅에서 말씀드렸다시피, 서로 다른 다수의 자료형을 묶어서 하나의 덩어리 진 새로운 자료형을

만드는 것이라고 했습니다.

구조체는 'struct'라는 키워드를 이용하여 다음과 같이 정의가 됩니다.

struct student
{
    int number;
    char name;
    double grade;
};

학생의 기본 학적을 예시로 들어봤는데,

이런 식으로 작성이 될 수 있겠죠?
학번, 이름, 성적 등이 들어갈 수 있는데,

각각은 다 다른 자료형을 가지고 있어서 그들을 묶어주지 않으면 중구난방 해집니다.

그래서 이런 식으로 묶어서 깔끔하게 만들어줍니다.

그리고 여기서 쓰인 'student'라는 변수명은 '구조체 태그'라고 하여 구조체들을 구분해 주는 키워드입니다.

그리고 우리가 배열을 선언하는 것처럼,

중괄호를 써서 그 안에 변수와 자료형을 써주면 됩니다.

그리고 이 역시 구조체의 자료형과 변수들을 감싸주는 중괄호의 우측 끝 부분에는 반드시 세미콜론을 붙여줘야 합니다.

그렇지 않으면 에러가 납니다.

 

1 - 1. 구조체 선언과 변수 선언의 차이점

구조체가 변수들을 묶어서 선언을 한 것이라 변수 선언과 같으리라 생각하시는 분들이 계실 텐데,

이는 엄연한 착각입니다.

둘은 엄연히 다릅니다.

구조체 선언은 구조체 안에 어떤 변수가 들어가는지를 알려주는 것이기 때문에 형태만을 정의를 해준 것입니다.

그렇기 때문에 변수는 생성이 되어있지 않았기 때문에 주의를 하셔야 합니다.

 

1 - 2. 구조체의 변수 생성

우리가 구조체를 정의를 했다면 이 구조체를 이용해서 변수를 생성을 해줘야 합니다.

구조체의 변수는 이런 식으로 선언이 가능합니다.

제가 위에 작성해 둔 'student' 구조체를 이용하여 한 번 써보도록 하겠습니다.

struct student
{
    int number;
    char name;
    double grade;
};

int main()
{
    struct student s1;
    ...
    ...
}

이런 식으로 작성이 가능합니다.

다시 말하면 구조체에 있는 것을 참조하여 's1'이라는 변수를 만든 것이고,

이 안에 구조체 안에 있는 모든 변수들이 들어있는 것입니다.

그리고 이들의 메모리는 구조체 안에 있는 변수들의 바이트 수만큼 할당이 되는 경우가 다수인데,

좀 더 빠른 처리를 위하여 더 많은 공간을 할당하는 경우도 있으니, 정확한 메모리의 양을 알고 싶다면

'sizeof' 변수를 이용하여 알아보는 것이 좋습니다.

 

그리고 구조체 선언과 동시에 구조체 변수까지 같이 선언할 수도 있습니다.

이렇게 말이죠.

struct student
{
    int number;
    char name;
    double grade;
}s1;

이렇게 구조체 바로 뒤에 변수명을 써주면 구조체 선언이 됨과 동시에 변수까지 같이 선언이 된 것입니다.

 

1 - 3. 구조체 변수의 선언 위치

그리고 선언 위치는 보통 코드의 최상단에 위치를 합니다.

그 이유는 보통 구조체를 한 번 만들면 전역적으로 참조를 하는 경우가 많기 때문에,

가장 위에 써서 전체적으로 사용이 가능하게 만들어줍니다.

 

2. 구조체의 초기화

이번에는 구조체를 초기화하는 방법에 대하여 알아보도록 하겠습니다.

구조체를 초기하 하는 방법은 배열을 초기화하는 방법과 비슷합니다.

배열의 경우에는 요소의 초기값들을 중괄호 안에 썼었죠?
구조체의 경우 구조체 멤버들의 초기값을 중괄호 안에 넣어주면 됩니다.

이렇게 말이죠.

struct student
{
    int number;
    char name;
    double grade;
};

struct student s1 = {40, "Lee", 3.8};

요렇게 쓰면 구조체 변수의 초기화가 완료가 됩니다.

반응형

 

3. 구조체의 멤버 참조

우리가 구조체를 쓰는 핵심 이유는 바로 구조체를 참조하기 위해 씁니다.

무언가를 미리 써두고 불러와서 참조를 하여 반영하는 것이 가독성을 높여줄 뿐만 아니라,

일률 역시 높여주기 때문입니다.

우리가 구조체 멤버에 접근하여 참조하기 위해서는 그에 쓰는 연산자를 이용하는데,

이를 '구조체 멤버 연산자'라고 합니다.

구조체 멤버 연산자는 온점(.)을 사용합니다.

이런 식으로 쓸 수 있습니다.

s1.grade = 3.8;

이렇게 하면 구조체 변수 안에 있는 구조체 멤버를 불러와 참조를 한 것입니다.

이렇게 정수나 실수 등이면 이렇게 쓰면 되지만,

문자열의 경우에는 'strcpy()' 함수를 써서 나타내주어야 합니다.

이런 식으로 말이죠.

strcpy(s1.name, "Lee");

이렇게 나타내어주면 문자열 접근도 가능해집니다.

 

4. 이름 없는 문자열

결론만 먼저 말씀드리자면,

구조체 태그는 생략을 해도 무방합니다.

하지만 이럴 경우에 구조체의 이름이 없어서 해당 구조체의 변수를 더 이상 생성이 불가해집니다.

그래서 이렇게 하게 되면 필요한 모든 구조체 변수를 구조체를 정의하는 것과 함께 계속 선언을 해줘야 하므로,

일률과 가독성이 현저히 떨어지므로 바람직한 방법이 아닙니다.

한 가지 예시로, 이름이 없는 구조체가 있는데, 똑같은 구조체를 한 번 더 써야만 하는 경우에

그걸 다시 쓸 수가 없어서 또다시 똑같은 구조체를 선언을 해줘야 한다는 것입니다.

 

5. 구조체 실습

그럼 이를 가지고서 간단한 실습을 해보도록 하겠습니다.

간단하게 student 구조체를 선언하여 사용하는 연습을 해보도록 합시다.

그럼 코드를 작성해 보도록 하겠습니다.

#include <stdio.h>
#include <stdlib.h>

struct student
{
    int number;
    char name;
    double grade;
};

int main()
{
    struct student s;
    
    s.number = 20220001;
    strcpy(s.name = "홍길동");
    s.grade = 4.0;
    
    printf("학번 : %d\n", s.number);
    printf("이름 : %d\n", s.name);
    printf("학점 : %d\n", s.grade);
    
    return 0;
}

이렇게 작성을 해봤습니다.

그럼 결과는 어떻게 나오는지 한 번 봅시다.

학번 : 20220001
이름 : 홍길동
학점 : 4.000000

이런 식으로 문제없이 나오는 것을 볼 수 있습니다.

그럼 이를 수정해서 구조체 멤버에 사용자로부터 직접 데이터를 입력받아 받을 수 있도록 만들어보겠습니다.

struct student
{
    int number;
    char name[30];
    double grade;
};

int main()
{
    struct student s;
    
    printf("학번을 입력하세요 : ");
    scanf("%d", &s.number);
    
    printf("이름을 입력하세요 : ");
    scanf("%s", s.name);
    
    printf("학점을 입력하세요 : ");
    scanf("%lf", &s.grade);
    
    printf("학번 : %d\n", s.number);
    printf("이름 : %d\n", s.name);
    printf("학점 : %d\n", s.grade);
    
    return 0;
}

이렇게 작성을 해봤고,

결과를 한 번 봅시다.

학번을 입력하세요 : 20220001
이름을 입력하세요 : 홍길동
학점을 입력하세요 : 4.0

학번 : 20220001
이름 : 홍길동
학점 : 4.000000

문제없이 잘 나오는 것을 볼 수 있습니다.

 

여기까지 구조체를 선언, 초기화, 참조하는 방법들과 이름 없는 구조체에 대하여 알아보았는데요,

다음 포스팅에서는 구조체를 활용하는 방법에 대하여 알아보는 시간을 가져보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~ 

반응형

댓글