전체 코드

🔹 1. 개요

✅ 값 전달 (Pass by Value)

  • 구조체나 변수를 복사하여 함수에 전달
  • 함수 내에서 변경해도 원본에는 영향을 주지 않음

✅ 주소 전달 (Pass by Pointer)

  • 구조체나 변수를 포인터로 전달하여 원본을 직접 수정 가능
  • 원본 데이터에 직접 접근 가능하므로 메모리 효율성이 높음
  • 포인터 문법(->)을 사용해야 함

✅ 참조 전달 (Pass by Reference)

  • 구조체나 변수를 참조로 전달하여 원본을 직접 수정 가능
  • 주소 전달과 같은 원리를 가지지만, 일반 변수처럼 사용 가능
  • 값 전달처럼 보이지만 내부적으로 주소를 사용하여 동작함

🔹 2. 코드 분석 및 주석 설명

📌 2.1 StatInfo 구조체 정의

#include <iostream>
using namespace std;

// 구조체 정의
struct StatInfo {
    int hp;       // 체력 (4바이트)
    int attack;   // 공격력 (4바이트)
    int defence;  // 방어력 (4바이트)
};
  • StatInfo 구조체는 체력(hp), 공격력(attack), 방어력(defence)을 저장하는 구조체입니다.
  • 각 멤버 변수는 4바이트 크기이며, 메모리 상에서 연속적으로 배치됩니다.

📍 메모리 구조 예시 (32비트 시스템)

주소변수명크기
0x1000hp4바이트
0x1004attack4바이트
0x1008defence4바이트

📌 2.2 주소 전달 방식 (포인터 사용)

void CreateMonster(StatInfo* info) {
    info->hp = 100;
    info->attack = 8;
    info->defence = 5;
}

포인터(StatInfo* info)를 사용하여 원본을 직접 수정하는 방식
원본 데이터의 주소를 전달하므로, 메모리 복사 없이 직접 접근 가능
함수 내에서 변경된 값이 그대로 반영됨

📍 함수 호출 시 동작 원리

StatInfo monster;
CreateMonster(&monster);
전달 방식설명
&monstermonster의 주소를 전달 (포인터 사용)
info->hp = 100;monster.hp를 직접 수정

포인터(->)를 사용하여 구조체 멤버에 접근 가능


📌 2.3 값 전달 방식 (복사)

void CreateMonster(StatInfo info) {
    info.hp = 100;
    info.attack = 8;
    info.defence = 5;
}

함수 호출 시 원본 데이터를 복사하여 전달
함수 내에서 변경해도 원본(monster)에는 영향 없음
메모리 사용량 증가 (큰 구조체일 경우 비효율적)

📍 함수 호출 시 동작 원리

StatInfo monster;
CreateMonster(monster);
전달 방식설명
monster새로운 복사본이 생성됨
info.hp = 100;원본 monster.hp에는 영향 없음

CreateMonster()가 끝나면 info의 변경 사항은 사라짐


📌 2.4 값 전달 방식으로 정보 출력

void PrintInfoByCopy(StatInfo info) {
    cout << "-------------------- " << endl;
    cout << "HP: " << info.hp << endl;
    cout << "ATT: " << info.attack << endl;
    cout << "DEF: " << info.defence << endl;
    cout << "-------------------- " << endl;
}

구조체를 복사하여 출력
원본 데이터는 변경되지 않음

📍 함수 호출 예시

PrintInfoByCopy(monster);
전달 방식설명
monster새로운 복사본이 생성됨
info.hp복사본의 값을 출력

출력 후 info가 사라지므로 원본(monster)에는 영향 없음


📌 2.5 주소 전달 방식으로 정보 출력 (포인터 사용)

void PrintInfoByPtr(StatInfo* info) {
    cout << "-------------------- " << endl;
    cout << "HP: " << info->hp << endl;
    cout << "ATT: " << info->attack << endl;
    cout << "DEF: " << info->defence << endl;
    cout << "-------------------- " << endl;
}

포인터(StatInfo* info)를 사용하여 원본 데이터를 직접 출력
메모리 복사 없이 원본 값 사용 가능

📍 함수 호출 예시

PrintInfoByPtr(&monster);
전달 방식설명
&monster원본 주소 전달
info->hp원본 데이터를 직접 출력

포인터(->)를 사용하여 구조체 멤버 접근


📌 2.6 참조 전달 방식 (Reference 사용)

void PrintInfoByRef(StatInfo& info) {
    cout << "-------------------- " << endl;
    cout << "HP: " << info.hp << endl;
    cout << "ATT: " << info.attack << endl;
    cout << "DEF: " << info.defence << endl;
    cout << "-------------------- " << endl;
}

값 전달처럼 보이지만, 내부적으로 주소 전달과 동일한 방식
포인터(* / ->) 없이 일반 변수처럼 사용 가능
메모리 복사 없이 원본 데이터 직접 접근

📍 함수 호출 예시

PrintInfoByRef(monster);
전달 방식설명
monster원본 주소를 기반으로 전달
info.hp원본 데이터를 직접 출력

포인터보다 가독성이 좋고, 값 전달 방식보다 성능이 뛰어남


📌 2.7 main() 함수

int main() {
    StatInfo monster;
    
    // 주소 전달 방식 (원본 변경됨)
    CreateMonster(&monster);

    // 값 전달 방식 (원본 변경되지 않음)
    CreateMonster(monster);

    // 원본을 출력하는 3가지 방식
    PrintInfoByCopy(monster);
    PrintInfoByPtr(&monster);
    PrintInfoByRef(monster);

    return 0;
}

CreateMonster(&monster);포인터 전달, 원본 수정 가능
CreateMonster(monster);값 전달, 원본 변경 없음
PrintInfoByCopy(monster);값 전달(복사본 출력)
PrintInfoByPtr(&monster);포인터 전달(원본 출력)
PrintInfoByRef(monster);참조 전달(원본 출력)


🔹 3. 언제 어떤 방식을 사용할까?

전달 방식장점단점사용 예시
값 전달원본 변경 방지메모리 복사 오버헤드 발생단순 데이터 출력
주소 전달원본 데이터 수정 가능-> 문법 필요큰 구조체 데이터 수정
참조 전달값 전달처럼 사용 가능 + 원본 수정 가능원본이 변경될 위험가독성이 필요한 원본 수정

일반적으로 참조 전달을 권장 (StatInfo&)
큰 구조체를 다룰 때는 주소 전달을 사용하여 복사 비용 최소화


profile
李家네_공부방

0개의 댓글