반응형

 

 

"Call by Value(값에 의한 호출) / Call by Reference(참조에 의한 호출)"

 

 

개발을 하다보면 함수에 변수를 넘겼는데 함수 안에서 값을 바꿨더니 원본이 바뀌기도 하고, 

어떤 경우에는 전혀 안 바뀌어서 헷갈릴 때가 있다.

 

 

이때 핵심은 '함수에 인자를 넘길 때 무엇을 복사해서 넘기는가?' 에 있는데, 

그 대표 개념이 Call by Value(값에 의한 호출), Call by Reference(참조에 의한 호출)이다.



오늘은 Call by Value(값에 의한 호출)와  Call by Reference(참조에 의한 호출)가 무엇인지 정리하고, 

둘이 어떤 차이를 만드는지 간단하게 살펴볼 예정이다.

 

 

 


 

 

1) Call by Value(값에 의한 호출) 란?



Call by Value는 인자를 넘길 때 값(복사본)을 전달하는 방식이다.
즉, 함수는 원본이 아니라 복사된 값을 받는다.

[값 복사]
원본 변수 x = 10
      │ (값 복사)
      ▼
함수 매개변수 a = 10

함수에서 a를 99로 바꿔도
x는 그대로 10

 

 

예시 코드

void Add(int a)
{
    a += 1; // a만 바뀜
}

int x = 10;
Add(x);
Debug.Log(x); // 10

 

 

 

 


 

 

2) Call by Reference(참조에 의한 호출) 란?

 


Call by Reference는 인자를 넘길 때 원본을 가리키는 참조를 전달하는 방식이다.
그래서 함수에서 값을 바꾸면 원본에도 반영된다.


(ref / out / in 같은 키워드로 참조 전달을 명시할 수 있다.)

[참조 전달]
원본 변수 x = 10
      │ (원본을 가리킴)
      ▼
함수 매개변수 a ---► x

함수에서 a를 99로 바꾸면
x도 99로 바뀜


 
예시 코드

void Add(ref int a)
{
    a += 1; // 원본 변경
}

int x = 10;
Add(ref x);
Debug.Log(x); // 11

 

 

 

 


 

 

3) 참조 타입에서 원본 변수를 바꾸고 싶다면?



예를 들어,

함수 안에서 player 자체를 다른 객체로 바꿔서 호출자에게도 반영하고 싶다면

'ref'를 사용해야 한다.

 


예시 코드(ref 사용 X)

void Replace(Player p)
{
    p = new Player { hp = 1 };
}

var player = new Player { hp = 100 };
Replace(player);
Debug.Log(player.hp); // 100 (안 바뀜)

 

 


예시 코드(ref 사용 O)

void Replace(ref Player p)
{
    p = new Player { hp = 1 };
}

var player = new Player { hp = 100 };
Replace(ref player);
Debug.Log(player.hp); // 1

 

 


+++

 

 

관련 키워드 간단 설명

 

ref : 입력도 받고, 함수에서 바꾼 값도 돌려주고 싶을 때 

 


out : 함수에서 무조건 값을 만들어서 반환할 때

(초기화 강제)

 


in : 참조로 넘기되 읽기 전용으로 쓰고 싶을 때

(큰 구조체 성능 최적화 등)

 

 


 

 

 

4) Unity에서의 값 타입과 참조 타입



int, float, struct(Vector3)는 기본적으로 값 타입이라서 복사가 기본이다.

class, GameObject, Transform참조 타입이라서 객체 내부 변경은 바뀌어 보임
(하지만 변수 자체(참조)를 바꿔서 반영하려면 ref가 필요)

 

 

 


 

 

5) 오늘의 한 줄 요약



 Call by Value(값에 의한 호출)은 호출 시 인자의 값을 복사하여 함수에 전달하는 방식이고, 

Call by Reference(참조에 의한 호출)은 호출 시 인자의 참조(메모리 주소)를 전달하는 방식이다.

반응형

+ Recent posts