본문 바로가기
컴퓨터 과학/데이터 구조

구조체와 함수의 조화

by 그마곤 2023. 11. 29.
반응형

이번 글에서는 구조체와 함수를 주제로 다뤄보겠습니다. 특히, 함수에서 구조체 변수를 반환하는 방법에 대해 자세히 살펴보겠습니다. 이전 강의에서는 포인터를 구조체의 매개변수로 전달하는 방법을 배웠었습니다. 이제는 함수에서 구조체 변수를 반환하는 방법에 초점을 맞춰 알아보도록 하겠습니다.

구조체와 함수의 조화
구조체와 함수의 조화

함수로부터 구조체 변수 반환

함수에서 구조체 변수를 반환하는 방법은 C 프로그래밍에서 일반적으로 사용되는데, 이를 위해서는 구조체를 함수로 전달하고 수정된 구조체를 반환해야 합니다. 아래는 간단한 예시 코드와 함께 설명한 방법입니다.

#include <stdio.h>

// 구조체 정의
struct Point {
    int x;
    int y;
};

// 함수 정의: 구조체를 전달받아 수정 후 반환
struct Point edit(struct Point p) {
    // 구조체 변수를 수정
    p.x += 1;
    p.y += 5;

    // 수정된 구조체를 반환
    return p;
}

int main() {
    // 구조체 변수 초기화
    struct Point p1 = {23, 45};

    // edit 함수를 호출하여 구조체 변수 수정 및 반환
    struct Point modifiedP1 = edit(p1);

    // 수정된 값 출력
    printf("Original p1: %d %d\n", p1.x, p1.y);
    printf("Modified p1: %d %d\n", modifiedP1.x, modifiedP1.y);

    return 0;
}

이 코드에서 edit 함수는 Point 구조체를 받아와서 내부에서 수정한 후에 다시 반환합니다. main 함수에서는 이 함수를 호출하고 수정된 값을 출력합니다.

주의할 점은 구조체를 함수로 전달할 때는 값에 의한 복사가 일어납니다. 따라서 함수 내부에서 구조체를 수정하더라도 원본 구조체는 영향을 받지 않습니다. 함수가 수정한 구조체를 반환하여 필요한 경우 이를 저장하면 됩니다.

이 방법을 응용하여 여러 구조체 변수를 다루거나, 함수에서 구조체 배열을 반환하는 등의 다양한 상황에서 사용할 수 있습니다.

간단한 변수 반환

함수에서 구조체 변수를 반환하는 것은 기본적으로 일반 변수를 반환하는 것과 유사합니다. 반환 과정은 변수의 값을 복사하여 전달하는 방식을 따릅니다. 아래에 간단한 변수와 구조체 변수 반환의 유사점을 보여주는 코드 예시를 제시합니다.

변수 반환 예시

#include <stdio.h>

// 정수를 받아 증가시키고 반환하는 함수
int increment(int num) {
    num++;
    return num;
}

int main() {
    int originalNum = 10;

    // 함수를 통해 변수를 증가시키고 반환
    int modifiedNum = increment(originalNum);

    // 수정된 값 출력
    printf("Original: %d\n", originalNum);
    printf("Modified: %d\n", modifiedNum);

    return 0;
}

이 예시에서 increment 함수는 정수를 받아와서 1을 증가시킨 후 반환합니다.

구조체 변수 반환 예시

#include <stdio.h>

// 구조체 정의
struct Point {
    int x;
    int y;
};

// 구조체를 받아 필드를 수정하고 반환하는 함수
struct Point modifyPoint(struct Point p) {
    p.x++;
    p.y++;
    return p;
}

int main() {
    struct Point originalPoint = {5, 8};

    // 함수를 통해 구조체 변수를 수정하고 반환
    struct Point modifiedPoint = modifyPoint(originalPoint);

    // 수정된 값 출력
    printf("Original: %d %d\n", originalPoint.x, originalPoint.y);
    printf("Modified: %d %d\n", modifiedPoint.x, modifiedPoint.y);

    return 0;
}

이 예시에서 modifyPoint 함수는 구조체를 받아 필드를 각각 1씩 증가시킨 후에 반환합니다. 구조체의 경우에도 값이 복사되어 함수에 전달되며, 함수 내에서 수정된 값이 반환됩니다.

이처럼 함수에서 일반 변수와 구조체 변수를 반환하는 방식은 본질적으로 유사하며, 값에 의한 전달이 일어난다는 점에서 공통점을 가지고 있습니다.

매개변수 및 인수 유형 일치

매개변수 및 인수 유형 일치는 프로그래밍 언어에서 함수 호출 시 함수의 매개변수와 전달되는 실제 값(인수)의 데이터 유형이 일치해야 하는 원칙을 의미합니다. 이 규칙은 안정적인 프로그램 작성과 예기치 않은 오류를 방지하는 데 중요합니다.

간단한 설명을 통해 매개변수와 인수 유형 일치의 개념을 이해해 보겠습니다.

매개변수와 인수

  • 매개변수(Parameter): 함수가 정의될 때, 함수 내에서 사용할 변수 또는 값을 받아들이는 변수를 매개변수라고 합니다. 이는 함수의 선언부나 정의부에서 지정됩니다.
  • 인수(Argument): 함수를 호출할 때, 함수에 전달되는 실제 값 또는 표현식을 인수라고 합니다. 함수 호출 시 인수는 해당 함수의 매개변수에 전달됩니다.

데이터 유형 일치 주의사항

  • 데이터 타입 일치: 함수의 매개변수와 호출 시 전달되는 인수의 데이터 타입이 일치해야 합니다. 예를 들어, 정수를 요구하는 매개변수에 실수를 전달하거나, 문자열을 요구하는 매개변수에 정수를 전달하는 것은 오류를 발생시킬 수 있습니다.
void printNumber(int num) {
    // num은 int형 매개변수
    printf("Number: %d\n", num);
}

int main() {
    double value = 3.14;
    // 오류: double 타입을 int 타입에 전달하려고 함
    printNumber(value);
    return 0;
}
  • 매개변수 개수 일치: 함수 호출 시 전달되는 인수의 개수가 함수가 정의된 매개변수의 개수와 일치해야 합니다. 매개변수의 개수가 부족하거나 초과하면 컴파일러가 오류를 발생시키게 됩니다.
void addNumbers(int a, int b) {
    // a와 b는 매개변수
    printf("Sum: %d\n", a + b);
}

int main() {
    // 오류: 매개변수가 부족함
    addNumbers(5);
    // 오류: 매개변수가 초과함
    addNumbers(2, 3, 4);
    return 0;
}
  • 포인터 및 배열의 주의: 특히 포인터와 배열의 경우, 데이터 타입과 크기에 대한 일치가 중요합니다. 잘못된 주소에 접근하거나 배열의 경계를 넘어가는 경우에는 런타임 에러가 발생할 수 있습니다.

주의하여 데이터 타입을 일치시키고, 매개변수의 개수를 올바르게 맞추면 프로그램이 안정적으로 동작할 가능성이 큽니다. 따라서 프로그래밍 중에 함수 호출과 선언, 그리고 변수의 사용과정에서 데이터 타입 일치를 항상 주의 깊게 확인하는 것이 좋습니다.

마무리

데이터 유형 일치는 프로그래밍에서 매우 중요한 개념입니다. 함수의 매개변수와 인수 간에 데이터 유형이 일치해야 안정적인 프로그램을 작성할 수 있습니다. 변수나 구조체를 함수로 전달하거나 반환할 때, 데이터 타입을 정확히 일치시키는 것이 핵심입니다. 이를 통해 컴파일러 오류나 런타임 에러를 방지하고 예기치 못한 동작을 방어할 수 있습니다. 프로그램을 작성할 때에는 항상 매개변수와 인수 간의 일치를 주의깊게 확인하여 코드의 안정성을 확보하는 것이 좋습니다.

 

반응형