pass-by-value

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
46/56

GPT

C/C++에서 값으로 전달(Pass by Value)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.

1. 값으로 전달 개요

값으로 전달은 함수에 인수를 전달할 때, 인수의 값을 복사하여 함수에 전달하는 방법입니다. 즉, 함수 내부에서 매개변수는 실제 인수의 복사본을 받게 되므로, 함수 내부에서 매개변수의 값을 변경해도 실제 인수에는 영향을 미치지 않습니다.

2. 값으로 전달의 선언과 사용법

예제: 값으로 전달

#include <iostream>

void modifyValue(int x) {
    x = 10; // 매개변수 x의 값 변경
}

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 함수  |
| 매개변수 x (복사본)|
+------------------+
| main 함수         |
| 변수 a            |
+------------------+
|      ...         |
+------------------+

메모리 접근

값으로 전달할 때, 매개변수는 실제 인수의 복사본을 받습니다. 함수가 호출될 때마다 새로운 메모리 공간이 할당되며, 함수 내부에서 매개변수의 값을 변경해도 실제 인수에는 영향을 미치지 않습니다.

4. 그림과 삽화

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

값으로 전달 예시:

int a = 5;
modifyValue(a);

메모리 배치:
+------------------+
| main 함수         |
| 변수 a: 5         |
+------------------+
       |
       v
+------------------+
| modifyValue 함수  |
| 매개변수 x: 5     |  <-- a의 복사본
+------------------+

값으로 전달 과정:
1. a의 값이 5로 설정됨
2. modifyValue(a) 호출 시 a의 값이 x로 복사됨
3. modifyValue 함수 내부에서 x의 값을 10으로 변경
4. modifyValue 함수 종료 후 x의 메모리 해제, a의 값은 여전히 5

5. 예제 코드 확장

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

함수 오버로딩과 값으로 전달

#include <iostream>

void display(int x) {
    std::cout << "Integer: " << x << std::endl;
}

void display(double x) {
    std::cout << "Double: " << x << std::endl;
}

int main() {
    int a = 10;
    double b = 5.5;

    display(a); // int형 값을 전달
    display(b); // double형 값을 전달

    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; // pt의 값은 변하지 않음
    return 0;
}

요약

값으로 전달은 함수에 인수를 전달할 때 인수의 값을 복사하여 전달하는 방법입니다. 이는 함수 내부에서 매개변수의 값을 변경해도 실제 인수에는 영향을 미치지 않음을 보장합니다. 값으로 전달은 함수 호출 시 새로운 스택 프레임을 생성하여 매개변수의 복사본을 저장하며, 함수 종료 시 해당 스택 프레임이 제거됩니다. 이를 통해 함수 간의 데이터 독립성을 유지하고, 메모리 관리를 단순화할 수 있습니다. 운영체제는 함수 호출과 관련된 스택 메모리를 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.

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

profile
李家네_공부방

0개의 댓글