ref, out 차이

정제로·2023년 8월 17일
0

C#

목록 보기
21/30
post-thumbnail

아래와 같이 함수가 있다고 가정해보자

일반함수

string _Name = "MinJi";

static void ChangeName(string Name)
{
    Name = "GilDong";
}

ChangeName(_Name);
Console.WriteLine(_Name);

어떤값이 호출이 될까?
MinJi가 호출이 된다.
그 이유는 간단하다.

  • ChangeName메서드로 들어가서 _Name을 string Name의 매개변수로 넘겨보자
  • _Name은 GilDong으로 바뀌게 된다.
  • 하지만 바뀐건 함수안에서 바뀐것일뿐 직접적은 _Name변환이 없었기에
    출력은 MinJi가 출력된다

이 문제는 변수의 스코프로 이해하면 편하다.
함수내의 스코프는 함수외부에서의 스코프와는 전혀 다른 공간이기 때문이다.

ref를 사용해보자

사용법은 간단하다 함수와 함수 호출시에 ref만 붙여주면 된다

string _Name = "MinJi";

static void ChangeName(ref string Name)
{
    Name = "GilDong";
}

ChangeName(ref _Name);
Console.WriteLine(_Name);

출력이 어떻게 될까?

GilDong으로 출력된다!
왜그런고 하니, ref를 사용하면 흩어져있던 스코프를 한데 모아주기 때문이다.

이런식으로 이동되어 값 변경이 일어난다.

특징

  • 매개 변수가 ref로 전달되기 전에 초기화해야 한다.
  • 호출 메서드로 돌아가기 전에 매개 변수 값을 초기화할 필요는 없다.
  • ref 매개 변수를 통한 값 전달은 호출된 메서드가 전달된 매개 변수의 값을 변경해야 할 때 유용하다.
  • ref를 사용하면 데이터를 양방향으로 전달할 수 있다.

out을 사용해보자

string _Name = "MinJi";

static void ChangeName(out string Name)
{
    Name = "GilDong";
}

ChangeName(out _Name);
Console.WriteLine(_Name);

역시나 출력은 GilDong으로 된다
하지만 ref와 작동방식이 좀 다르다

특징

  • 매개 변수가 전달되기 전에 초기화할 필요가 없다.
  • 호출 메서드로 돌아가기 전에 매개 변수 값을 초기화해야 한다.
  • out 매개 변수를 통한 매개 변수 선언은 메서드가 여러 값을 리턴할 때 유용하다.
  • out을 사용할 때 데이터는 단방향 방식으로 만 전달된다.(호출된 메서드에서 호출자 메서드로)

차이점

ref는
메서드 내부에서 변수의 값을 변경하며, 그 변경사항을 메서드 호출자에게 반영할때 사용

out은
메서드에서 값을 반환하며 동시에 호출자에게 값을 전달할때 사용

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글

관련 채용 정보