안녕하세요. BlockDMask입니다.
지난 시간에 ref 포스팅에서 call by value, call by reference에 대해서 배웠었는데요.
오늘은 ref 키워드와 마찬가지로 call by reference로 호출해주는
C#의 키워드 중 in 키워드 = in 한정자 = in 매개변수 한정자에 대해서 알아보려 합니다.
<목차>
1. C# in 한정자 설명
2. C# 매개변수 in 한정자 예제
1. C# in 매개변수 한정자 설명
*매개변수 한정자?
어떤 함수 void Func(int a)가 있을 때 매개변수 앞에 붙이는 키워드들을 매개변수 한정자라고 부릅니다.
void Func([한정자] int a) 이런 식으로 데이터 타입 앞쪽에 위치하게 됩니다.
이 매개변수 한정자 중에 오늘 배울 것은 “in” 키워드입니다.
void Func(in 데이터 타입 변수)
void Func(in int num)
void Func(in string str)
void Func(string str1, in string str2)
위 예제와 동일하게 in의 위치는 매개변수의 데이터 타입 앞에 위치하게 됩니다.
in 키워드를 사용하면 매개변수가 참조로 전달이 됩니다. (call by reference)
in 키워드를 사용한 매개변수는 값을 수정할 수 없게 됩니다. (값 수정 불가)
private void FuncEx(in int num)
{
// 불가능!!
// num = 10;
}
값 타입(int, double 등)은 매개변수로 넘어가게 되면 값이 복사가 되어서 메모리에 위치하게 되는데 그렇게 되면 복사 비용이 들게 됩니다.
그런 비용을 줄여주기 위해서 in을 사용하게 됩니다. (단, 특별한 제약이 붙죠)
여기서 특별한 제약이란 in이 붙은 매개변수들은 함수 내부에서 값을 수정할 수 없게 강제됩니다.
(그 조건으로 참조로 보내는 것입니다.)
in 이 붙은 매개변수는 메서드 내부에서 값을 수정할 수 없기 때문에!
무조건 해당 변수는 초기화가 된 후에 매개변수로 넘길 수 있습니다.
int a = 10; // 초기화 필수
FuncEx(a);
void FuncEx(in int num)
{
// num 사용...
}
그래서 in은 언제 사용할까요?
제가 생각하기로는 아래 두 가지 경우에 해당한다면 in 키워드를 사용하면 좋을 것 같습니다.
1) 함수 매개변수로 넘겨줘야 하지만, 함수 내부에서 변경을 하지 못하게 하고 싶은 경우. in 키워드를 사용하면 함수 내부에서 값을 변경할 수 없기 때문.
2) 함수 내부에서 참조만(변경을 안 함) 하는 필요한데, 복사 비용이 많이 드는 매개변수를 넘기는 경우. in 키워드를 사용하면 참조로 전달되기 때문에 복사 비용을 아낄 수 있다.
call by reference, call by value에 대해서 궁금하다면 지난 포스팅 ref에 대해서 의 글을 한번 보시는 걸 추천드립니다.
*in 키워드, in 한정자, in 매개변수 한정자라고 불리는데 모두 맞는 말입니다
*키워드는 언어에서 특별한 의미로 사용하겠다고 지정한 것들을 지칭하는 말입니다. (for, int, double, while, case 등등)
2. C# in 예제
이렇게 ChangeRef 함수 내에서 in 키워드로 전달한 매개변수의 값을 변경하려 하면 에러가 나오게 됩니다.
한가지 in 키워드의 특징은 함수 호출할때 ChangeRef(a, name) 과 같이 호출을 하게 되는데
이때 in 키워드를 따로 붙여주지 않아도 된다는 것 입니다.
이상으로 오늘은 C# in 키워드에 대해서 알아보았습니다.
ref 키워드 포스팅에 call by value, call by reference가 무엇이 다른지 상세히 설명해두었습니다.
감사합니다.
'<개인공부> > [C#]' 카테고리의 다른 글
[C#] out 매개변수 한정자 설명 및 예제 (out 키워드) (4) | 2022.11.05 |
---|---|
[C#] ref 매개변수 한정자 설명 및 에제 (ref 키워드) (0) | 2022.10.22 |
[C#] 확장 메서드 (Extension Method) 설명과 예제 (0) | 2022.10.15 |
[C#] Equals, ==, ReferenceEquals 비교 및 설명 (0) | 2022.10.08 |
[C#] 실행 시간 측정, 코드 수행 시간 측정(Stopwatch) (0) | 2022.09.25 |
[C#] const, readonly 설명 사용법과 차이점에 대해서 (0) | 2022.09.22 |
[C#] 타입 조사 Type, 리플렉션(reflection) (0) | 2022.09.11 |
[C#] 인덱서 객체(인스턴스)를 배열 처럼 사용해보자 (0) | 2022.09.04 |