pass-by-reference

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
48/56

GPT

C++에서 참조로 전달(Pass by Reference)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다. C에서는 참조 개념이 없지만, 포인터를 사용하여 비슷한 기능을 구현할 수 있습니다.

1. 참조로 전달 개요

참조로 전달은 함수에 인수의 참조를 전달하는 방법입니다. 참조는 변수의 별칭으로, 함수가 매개변수를 통해 인수의 실제 값을 직접 수정할 수 있습니다. 따라서 함수 내부에서 매개변수의 값을 변경하면 실제 인수에도 영향을 미칩니다.

2. 참조로 전달의 선언과 사용법

예제: 참조로 전달

#include <iostream>

// 참조로 전달을 통한 값 수정 함수
void modifyValue(int& ref) {
    ref = 10; // 참조를 통해 값 변경
}

int main() {
    int a = 5;
    std::cout << "Before modifyValue: " << a << std::endl;
    modifyValue(a); // 참조로 전달
    std::cout << "After modifyValue: " << a << std::endl; // a의 값이 변경됨
    return 0;
}

주요 개념

  • 참조 사용: 함수 호출 시 인수의 참조를 전달합니다.
  • 직접 수정: 함수 내부에서 참조를 사용하여 인수의 실제 값을 직접 수정할 수 있습니다.

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

스택 프레임과 참조로 전달

참조로 전달할 때, 함수가 호출될 때마다 새로운 스택 프레임이 생성됩니다. 이 스택 프레임에는 매개변수의 참조, 지역 변수, 반환 주소 등이 저장됩니다. 함수가 종료되면 해당 스택 프레임은 제거됩니다.

스택 메모리 구조:
+------------------+
|      ...         |
+------------------+
| modifyValue 함수  |
| 매개변수 ref (참조)|
+------------------+
| main 함수         |
| 변수 a            |
+------------------+
|      ...         |
+------------------+

메모리 접근

참조로 전달할 때, 함수는 매개변수로 받은 참조를 통해 실제 인수의 메모리 위치에 접근합니다. 이를 통해 함수 내부에서 인수의 값을 직접 수정할 수 있습니다.

4. 그림과 삽화

참조로 전달의 개념과 메모리 구조를 이해하기 쉽게 그림과 표로 표현하였습니다.

참조로 전달 예시:

int a = 5;
modifyValue(a);

메모리 배치:
+------------------+
| main 함수         |
| 변수 a: 5         |
+------------------+
       |
       v
+------------------+
| modifyValue 함수  |
| 매개변수 ref: 참조 |
+------------------+

참조로 전달 과정:
1. a의 참조가 ref에 전달됨
2. ref가 a를 참조함
3. ref를 통해 a의 값을 10으로 변경
4. modifyValue 함수 종료 후 a의 값은 10으로 변경됨

5. 예제 코드 확장

다양한 상황에서 참조로 전달을 사용하는 예제를 추가로 제공합니다.

참조를 사용한 배열 수정

#include <iostream>

// 배열을 참조로 전달하여 값 수정 함수
void modifyArray(int(&arr)[5]) {
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 2; // 배열 요소 수정
    }
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    std::cout << "Before modifyArray: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    modifyArray(arr); // 배열을 참조로 전달

    std::cout << "After modifyArray: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

구조체의 참조로 전달

#include <iostream>

struct Point {
    int x, y;
};

// 구조체를 참조로 전달하여 값 수정 함수
void modifyPoint(Point& p) {
    p.x = 10;
    p.y = 20;
}

int main() {
    Point pt = {5, 5};
    std::cout << "Before modifyPoint: (" << pt.x << ", " << pt.y << ")" << std::endl;
    modifyPoint(pt); // 구조체를 참조로 전달
    std::cout << "After modifyPoint: (" << pt.x << ", " << pt.y << ")" << std::endl;
    return 0;
}

요약

참조로 전달은 함수에 인수의 참조를 전달하는 방법으로, 함수가 매개변수를 통해 인수의 실제 값을 직접 수정할 수 있습니다. 참조로 전달은 함수 호출 시 새로운 스택 프레임을 생성하며, 참조를 사용하여 메모리에 접근합니다. 이를 통해 함수 내부에서 인수의 값을 직접 수정할 수 있으며, 인수의 메모리 복사 없이 효율적으로 값을 변경할 수 있습니다. 운영체제는 함수 호출과 관련된 스택 메모리를 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.

이와 같은 내용을 통해 C++의 참조로 전달에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글