->)을 사용해야 함StatInfo 구조체 정의#include <iostream>
using namespace std;
// 구조체 정의
struct StatInfo {
int hp; // 체력 (4바이트)
int attack; // 공격력 (4바이트)
int defence; // 방어력 (4바이트)
};
StatInfo 구조체는 체력(hp), 공격력(attack), 방어력(defence)을 저장하는 구조체입니다.📍 메모리 구조 예시 (32비트 시스템)
| 주소 | 변수명 | 크기 |
|---|---|---|
| 0x1000 | hp | 4바이트 |
| 0x1004 | attack | 4바이트 |
| 0x1008 | defence | 4바이트 |
void CreateMonster(StatInfo* info) {
info->hp = 100;
info->attack = 8;
info->defence = 5;
}
✅ 포인터(StatInfo* info)를 사용하여 원본을 직접 수정하는 방식
✅ 원본 데이터의 주소를 전달하므로, 메모리 복사 없이 직접 접근 가능
✅ 함수 내에서 변경된 값이 그대로 반영됨
📍 함수 호출 시 동작 원리
StatInfo monster;
CreateMonster(&monster);
| 전달 방식 | 설명 |
|---|---|
&monster | monster의 주소를 전달 (포인터 사용) |
info->hp = 100; | monster.hp를 직접 수정 |
➡ 포인터(->)를 사용하여 구조체 멤버에 접근 가능
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의 변경 사항은 사라짐
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)에는 영향 없음
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 | 원본 데이터를 직접 출력 |
➡ 포인터(->)를 사용하여 구조체 멤버 접근
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 | 원본 데이터를 직접 출력 |
➡ 포인터보다 가독성이 좋고, 값 전달 방식보다 성능이 뛰어남
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); → 참조 전달(원본 출력)
| 전달 방식 | 장점 | 단점 | 사용 예시 |
|---|---|---|---|
| 값 전달 | 원본 변경 방지 | 메모리 복사 오버헤드 발생 | 단순 데이터 출력 |
| 주소 전달 | 원본 데이터 수정 가능 | -> 문법 필요 | 큰 구조체 데이터 수정 |
| 참조 전달 | 값 전달처럼 사용 가능 + 원본 수정 가능 | 원본이 변경될 위험 | 가독성이 필요한 원본 수정 |
✅ 일반적으로 참조 전달을 권장 (StatInfo&)
✅ 큰 구조체를 다룰 때는 주소 전달을 사용하여 복사 비용 최소화