Coding Memo
메소드 인자 전달 방법 (Method Parameters) 본문
Summary
자료형에 따라 call by reference 인지, call by value인지 결정되는데, 직접 전달 방식을 정할 수도 있다.
call by value: 값을 복사하여 사용
call by reference: 값을 참조하여 사용
Value Type: 기본 자료형 (int, float, char), struct, …
Reference Type: Class (string …), Action, …
Variable Data Type | Call By | 매개변수에서 참조하는 개체 상태 수정 - 호출자 표시 여부 | 매개 변수에 다른 객체를 참조하여 할당 - 호출자 표시 여부 |
Value | value | X | X |
reference (ref) | O | X | |
Reference | value | O | X |
reference (ref) | O | O |
Value Type - Call by Value
이건 뭐… 간단하다.
int a = 1;
// print a - 1
Change(a);
// print a - 3
static void Change(int v)
{
x += 5;
// print x - 2
}
1 6 1 |
변경된 값은 함수 내에서만 유효하다. (값을 복사하여 사용했음)
Value Type - Call by Reference
Value 형식을 참조로 전달할 수도 있다! (C++에서의 pointer나 reference로 전달하는 것도 동일하다.)
매개 변수 전달 시 앞에 ref를 붙이면 이 값은 참조로 전달 하겠다는 의미이다.
명시적으로 함수에서도 이 값을 참조로 받겠다는 의미로 ref를 붙여주어야 한다.
int a = 1;
// print a - 1
Change(ref a);
// print a - 3
static void Change(ref int v)
{
x += 5;
// print x - 2
}
1 6 6 |
Value 형식이지만 참조 형식으로 전달하여 값을 변경하고 호출자에서도 변화가 반영이 되었다.
Reference Type - Call by Value
int[] arr = { 1, 2, 3 };
// print arr[0] - 1
Change(arr);
// print arr[0] - 3
static void Change(int[] arr)
{
arr[0] = 0;
// print arr[0] - 2
arr = new int[5] { 10, 11, 12, 13, 14 };
// print arr[0] - 3
}
1 0 10 0 |
index=0인 값을 변경한 것은 호출자에서 반영이 되었지만 new를 이용해 새로운 개체를 할당하여 참조한 것은 반영이 되지 않았다.
Reference Type - Call by Reference
뭔가 이상하긴 하지만, Reference 타입을 Reference로 전달할 수 있다(!?)
int[] arr = { 1, 2, 3 };
// print arr[0] - 1
Change(ref arr);
// print arr[0] - 3
static void Change(ref int[] arr)
{
arr[0] = 0;
// print arr[0] - 2
arr = new int[5] { 10, 11, 12, 13, 14 };
// print arr[0] - 3
}
1 0 10 10 |
new 를 이용해 새로운 값을 참조하도록 할당을 해준 변화가 호출자에서도 반영이 되었다.
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/method-parameters
'Language > C#' 카테고리의 다른 글
[C#] lock (Monitor) (0) | 2023.08.08 |
---|---|
[C#] TCP 흐름제어 확인해보기 (0) | 2023.07.17 |
[C#] SocketAsyncEventArgs.BufferList 참고사항 (0) | 2023.07.16 |
ThreadPool (SetMinThreads, SetMaxThreads) 주의사항 (0) | 2023.05.02 |
매개변수 한정자 (ref, in, out) (0) | 2023.05.02 |