함수 매개변수 구조체 – C++ 자습서 36

함수 매개변수 구조체

구조체는 한 종류의 타입을 요소로 하는 배열과는 다르게 여러 타입이 모여있는 데이터 타입입니다. C의 구조체 개념이 확장되서 C++의 클래스가 되었다는 것은 딱히 배우지 않아도 C언어를 다루다 보면 직감적으로도 이해할 수 있습니다.

C++에서는 보통 구조체보다 클래스를 사용하겠지만 함수와 구조체의 사용법 정도는 체크할 필요가 있습니다. 구조체도 C의 데이터 구조에 따라 동작하므로 배열, 문자열, 포인터의 원리를 이해한다면 어렵지 않습니다.

구조체를 매개변수에 전달

다음 예제는 구조체를 함수의 매개변수로 넘기는 방법을 제시합니다.

첫 번째 방법은 구조체를 선언하고 함수에 전달하면 그냥 값에 의한 전달 – pass by value 로 사용합니다. 이것은 변수와 사용법이 같아서 보면 알 수 있습니다.

두 번째 방법은 배열의 매개변수 전달에서 설명한 것 처럼 주소를 전달하는 방식인데요. double averageStudentHeight(const student * st, int n) 의 원형을 보면 매개변수를 포인터로 받습니다.

배열의 이름은 메모리 주소로 구조체 배열의 이름도 주소입니다. 함수 내에서 배열처럼 사용할 수 있습니다.

#include<iostream>

#define SIZE_ARR 5

struct student
{
    int age;
    double height;
};

void showStudent(student st);
double averageStudentHeight(const student * st, int n);

    using std::cout;
    using std::cin;
    using std::endl;

int main()
{

    // 구조체 매개변수
    student kim={13, 160};
    student lee={15, 170};

    showStudent(kim);
    showStudent(lee);

    // 구조체 배열 매개변수
    student myClass[SIZE_ARR]={
        {.age=14, .height=150.5},
        {.age=17, .height=161.3},
        {.age=15, .height=175.6},
        {.age=18, .height=185.2},
        {.age=12, .height=145.1},
    };

    double average=averageStudentHeight(myClass, SIZE_ARR);

    cout << "-> average height : " << average << " cm" << endl;

    return 0;
}

void showStudent(student st)
{
    cout << "age    : " << st.age << " years old" << endl;
    cout << "height : " << st.height << " cm" << endl;
}

double averageStudentHeight(const student * st, int n)
{
    double total=0;

    for (int i = 0; i < n; i++)
    {
        total += st[i].height;
    }
    return total/n;
}
[실행]
age    : 13 years old
height : 160 cm
age    : 15 years old
height : 170 cm
-> average height : 163.54 cm

함수에 구조체 포인터 사용

함수에 구조체 포인터를 전달하여 원본 데이터에 접근할 수 있습니다. 구조체도 그냥 똑같은 변수라고 생각하고 포인터를 만들어서 & 이 주소연산자로 함수에 전달하면 됩니다. C에서는 자료구조를 만들 때 구조체를 사용합니다. 현재도 알고리즘 교재들의 대부분은 구조체 예시를 많이 드는 것 같네요.

구조체 포인터는 아래 예제 처럼 사용할 수 있습니다. 동적 할당에 대해서는 따로 설명하지 않겠습니다. C++은 C보다 간단하게 new 와 delete 만으로도 메모리를 사용할 수 있습니다. 구조체에 대해서 상세히 알아야 하는 경우 C++ 보다 C교재에서 더 풍부한 설명이 나와 있습니다.

#include<iostream>

#define SIZE_ARR 5

struct myStruct
{
    int a;
    double b;
};

using std::cout;
using std::cin;
using std::endl;

void setMyStruct(myStruct * ptr);

int main()
{
    myStruct stPtr;
    stPtr.a=0;
    stPtr.b=0.0;

    setMyStruct(&stPtr);
    
    cout <<stPtr.a<<endl;
    cout <<stPtr.b<<endl;

    return 0;
}

void setMyStruct(myStruct * ptr)
{
    ptr->a = 10;
    ptr->b = 7.7;

    return;
}

요약

지금 함수의 상세 주제에 대해서 알아보고 있는데 세부적으로 들어가면 다소 지루하긴 합니다. 하지만 C++의 특징은 컴퓨터의 하드웨어 레벨에 가까운 원초적인 언어이기 때문에 원리를 깨닫기 시작하면 나중에는 그것들이 점점 연결되서 일맥상통하는 것을 경험할 수 있습니다. 이 포스팅 시리즈에서 처음에 설명하기도 했는데 C++이란 언어는 보상이 참 느리다. C언어도 느리지만 이건 더 방대하고 더 이해가 느리다. 튜토리얼에 잡설이 많은 것은 좋지 않지만 너무 많은 사람들이 뚜렷한 목적의식 없이 C++의 벽을 못 깨고 이탈하는 경우가 많아서 이 자습서에는 멘탈에 대한 이야기를 많이 하는 편입니다. 아무리 시중에 좋은 책과 강의가 많아도 멘탈이 갈리면 소용이 없기 때문입니다. 처음 시작할 때는 모든 것을 알 수 없으니 약간 막연한 희망도 필요한 법입니다.

개인적으로 C++ 기초 관련 포스팅은 이게 두번째 입니다. 첫번째는 다른 블로그에서 했는데 역시 C++은 두번째에도 어렵다는 것을 느낍니다. 언어 자체가 많이 불친절 하기 때문에 그냥 설명하면 역시 불친절하게 느껴져서 읽는 것을 포기하는 사람도 많습니다. 물론 이 블로그도 완전히 친절하지는 않습니다. C++의 경우도 그렇고 튜토리얼이 어느 정도 진행 되면 같은 내용이 반복되는 것은 길게 설명하지 않습니다.

암튼 벌써 자습서 36 번째 포스팅입니다. 아직 갈길이 멀지만 중간 점검 차원에서 최근 포스팅에 잡설을 좀 더 하고 있습니다. 학습자들도 여러 교재와 강의를 들으면서 이 때 쯤 한번 멘탈이 나가기도 하는데요. 하지만 C도 아니고 C++로 함수 챕터까지 왔다면 상당히 온 것 입니다. 많은 사람들이 거기까지도 가지 못하고 그만합니다. 조금 더 공부해 보면 그 이상의 보상을 받을 수 있을 것이라 생각합니다.

참고문서

struct (C++) | Microsoft Docs

Leave a Comment