Notice
Recent Posts
Recent Comments
Link
스토리지
[3.12] Call by Value & Call by Reference 본문
1. Call by Value
class Program
{
static void Main(string[] args)
{
int a = 5;
int b = 7;
swap(a, b);
Console.WriteLine("In Main a : {0}, b : {1}", a, b);
}
static void swap(int a, int b)
{
Console.WriteLine("바꾸기 전 a : {0}, b : {1}", a, b);
int tmp;
tmp = a;
a = b;
b = tmp;
Console.WriteLine("바꾼 후 a : {0}, b : {1}", a, b);
}
}
기대되는 값은 a : 7, b : 5라는 값이지만 출력은 그렇지 않다.
swap함수가 호출되면서 a,b가 전달되는 것 같지만 사실은 a,b 원본이 아닌 '복사본'이 전달이 된다.
그래서 swap함수에서 아무리 값을 바꾼들 Main함수의 값은 바뀌지 않는다.
*해결법
1. swap함수에서 바뀐 값을 Main으로 return 시킴
2. Call by reference 사용
2. Call by Reference
class Program
{
static void Main(string[] args)
{
int a = 5;
int b = 7;
swap(ref a, ref b);
Console.WriteLine("In Main a : {0}, b : {1}", a, b);
}
static void swap(ref int a, ref int b)
{
Console.WriteLine("바꾸기 전 a : {0}, b : {1}", a, b);
int tmp;
tmp = a;
a = b;
b = tmp;
Console.WriteLine("바꾼 후 a : {0}, b : {1}", a, b);
}
}
Call by reference는 인자를 전달할 때 값이 아닌 '주소'를 전달한다.
주소를 전달하기 때문에 Main변수의 값에 직접 접근하여 값을 변경할 수 있다.
해당 변수의 주소를 전달하기 위해서는 ref라는 키워드를 사용한다.
전달받은 함수의 매개변수또한 ref 타입이어야 한다.
실제로 A와 B의 주소를 확인해보면,
Call by Value | Call by Reference |
![]() |
![]() |
Call by Value는 각각 다른 변수를 가리키고 있는 반면에 Call by Reference는 둘 다 같은 변수를 가리킨다.
'Unity > 수업내용(C#)' 카테고리의 다른 글
[3.12] Array 연습 (0) | 2021.03.12 |
---|---|
[3.12] 메소드의 키워드 (ref, out, params) (0) | 2021.03.12 |
[3.11] C# 클래스 선언 및 인스턴스 생성 예제 (0) | 2021.03.11 |
[3.11] Class 생성 및 객체 생성 (0) | 2021.03.11 |
[3.10] 메소드 연습 2 - 반환값만 있는 메소드 (0) | 2021.03.10 |
Comments