Ref 키워드와 Out 키워드를 더 잘 이해하기 위해서는 call by refurence , call by value를 알고 보는 게 좋다.
Ref , Out 키워드
정의부터 설명하자면
Ref Pass by Reference
ㄴ 얕은 복사 매개변수 지정자
Out Output Parameters
ㄴ 출력용 매개변수 - 내부에서 값을 할당해주어야 한다.
사용 방법
ref 와 out 사용법
함수 선언 시
리턴 값 함수명 (ref & out키워드 매개변수 타입 변수 이름 ) <-함수를 선언 또는 구현 시에도 매개변수 앞에 써줘야 한다.
함수 사용 시
함수명( ref & out 키워드 변수 ) <- 사용할 때에도 매개변수 앞에다 ref 키워드를 써줘야 한다.
public void FuncRefB(ref int A)
{
A++;
}
public void Func( int A)
{
A++;
}
public void FuncOutB(out int A)
{
A = 10; // 내부에서 값을 대입 하지 않으면 오류가 나온다.
}
...
{
int A;
FuncOutB(out A);
Console.WriteLine(A); // 내부에서 생성해서 받는다 Call by Refurence + @ 10
Func(A);
Console.WriteLine(A); // 늘어나지 않는다 Call by Value 10
FuncRefB(ref A);
Console.WriteLine(A); // 값이 늘어난다. Call by Refurence 11
}
이처럼 c나 c++처럼 포인터 참조형처럼 Call by Reference 형식으로 넘겨줄 수 있다.
(참고할 점)
1. Ref 키워드는 할당이 되어있어야 한다.
2. Out 은 Ref처럼 할당이 되어있지 않아도 사용 가능하지만. 내부에서 새로 할당한다.(이전 값은 사라짐)
3. Ref int -> int 오버로드는 가능하나 Out -> Ref , in 오버로드는 불가능하다.
구조체 같은 경우 기본적으로 call by value 형식이기 때문에 구조체를 ref 키워드로 넘겨주면
얕은 복사(주소 값)처럼 사용할 수 있다.
in 키워드
in : 읽기 전용 매개변수 지정자
함수 선언 시
리턴 값 함수명 ( in 키워드 매개변수 타입 변수이름 ) <-함수를 선언 또는 구현 시에도 매개변수 앞에 써줘야 한다.
함수 사용 시
함수명( 키워드 변수 ) <- in은 사용할 때 앞에 붙여 주지 않는다.
void FuncIn(in int num)
{
//num++; 내부 수정불가능
}
내부에서 수정이 불가능하기 때문에 혹여나 다른 값을 입력하거나 수정하는 실수를 미연에 방지할 수 있다.
Ref 와 in 키워드는 복사 비용을 참조로 변경하여 성능 향상을 생각할수 있다.
--추가--
out 키워드 의경우 C#7.0 버전부터는 튜블 반환을 지원했다.
튜플 반환이 있기전에 여러값을 반환 할수 없었기 때문에 out을 주로 사용하였다.
(int sum, int product) Calculate(int a, int b) => (a + b, a * b);
void Calculate(int a, int b, out int sum, out int product)
{
sum = a + b;
product = a * b;
}
Calculate(2, 3, out int sum, out int product);
out 키워드는 성능이 중요한 코드나 오래된 api, 호환성 때문에 쓰인다.
반복적으로 많이 쓰일때 생성되는것보다 out으로 불필요한 메모리할당과 GC부하를 줄일수있다.
'언어 > C#' 카테고리의 다른 글
c# ?? 연산자 (Null 병합 연산자) (0) | 2022.07.12 |
---|---|
c# Nullable값 형식 (0) | 2022.03.24 |
c# Tuple (0) | 2022.03.23 |