Coding Memo

메소드 인자 전달 방법 (Method Parameters) 본문

Language/C#

메소드 인자 전달 방법 (Method Parameters)

minttea25 2023. 5. 2. 14:28

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

 

메서드 매개 변수 - C# 참조

메서드 매개 변수(C# 참조) 아티클 04/07/2023 기여자 13명 피드백 이 문서의 내용 --> C#에서는 인수를 값 또는 참조로 매개 변수에 전달할 수 있습니다. C# 형식은 참조 형식(class) 또는 값 형식(struct)

learn.microsoft.com