Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 함수에서 여러 값을 반환하는 방법 완벽 정리

C나 C++에서는 함수가 return 문을 통해 여러 개의 값을 직접 반환할 수 없습니다. 하지만 몇 가지 트릭을 활용하면 하나의 함수에서 두 개 이상의 결과값을 얻어낼 수 있습니다.

포인터(주소 전달)를 이용한 방법

가장 대표적인 방법은 주소에 의한 호출(Call by Address) 또는 참조에 의한 호출(Call by Reference) 방식입니다. 호출자(caller) 쪽에서는 결과를 저장할 변수를 미리 준비해 두고, 함수는 포인터 타입의 매개변수를 받도록 선언합니다. 그러면 함수 내부에서 해당 주소를 통해 원본 변수에 직접 값을 기록할 수 있으므로, 사실상 여러 값을 반환하는 것과 같은 효과를 냅니다.

아래 예제는 하나의 함수에서 두 수를 나눈 몫(quotient)나머지(remainder)를 동시에 구해 반환하는 코드입니다.

예제 코드

#include<stdio.h>
void div(int a, int b, int *quotient, int *remainder) {
    *quotient = a / b;
    *remainder = a % b;
}
main() {
    int a = 76, b = 10;
    int q, r;
    div(a, b, &q, &r);
    printf("Quotient is: %d\nRemainder is: %d\n", q, r);
}

실행 결과

Quotient is: 7
Remainder is: 6

위 코드에서 div() 함수는 몫과 나머지를 저장할 변수 q와 r의 주소(&q, &r)를 인자로 받습니다. 함수 내부에서 역참조(*) 연산을 사용해 해당 메모리 위치에 직접 값을 대입하기 때문에, 함수가 종료된 후에도 호출자의 변수에 결과가 남아 있습니다.

C++에서는 참조자(reference)도 활용 가능

C++이라면 포인터 대신 참조자(&)를 매개변수로 사용할 수 있어 문법이 더 간결해집니다.

#include<iostream>
void div(int a, int b, int &quotient, int &remainder) {
    quotient = a / b;
    remainder = a % b;
}
int main() {
    int q, r;
    div(76, 10, q, r);
    std::cout << "Quotient: " << q << ", Remainder: " << r << std::endl;
}

정리

  • C 언어: 포인터를 매개변수로 받고, 호출 시 변수의 주소(&)를 전달합니다.
  • C++ 언어: 참조자(&)를 사용하면 포인터 없이도 동일한 효과를 낼 수 있습니다.
  • 그 외에도 구조체(struct)로 여러 값을 묶어 반환하거나, C++11 이후에는 std::tuple, std::pair를 활용하는 방법도 있습니다.

이처럼 주소 전달이나 참조 전달 기법을 익혀두면, 하나의 함수에서 여러 결과값을 손쉽게 처리할 수 있습니다.