C# out, ref

CJB_ny·2022년 7월 15일
0

C#

목록 보기
3/24
post-thumbnail

https://mathmakeworld.tistory.com/89#:~:text=out%20%ED%82%A4%EC%9B%8C%EB%93%9C%EB%8A%94%20%ED%95%A8%EC%88%98%20%EC%84%A0%EC%96%B8,%EB%AC%B4%EC%A1%B0%EA%B1%B4%20%EA%B0%92%EC%9D%B4%20%EB%B0%94%EB%80%8C%EC%96%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.

out

out 키워드는 함수 선언과 호출에 모두 붙여서 사용해야 합니다. (한 곳에만 붙일 경우 컴파일 에러가 납니다.)

out으로 보내는 변수는 초기화를 생략할 수 있으며 함수 내부에서는 쓰기만 가능하며 강제됩니다.

쓰기가 강제되기 때문에 함수가 호출되고 나면 무조건 값이 바뀌어 있습니다.

  • 초기화는 생략이 가능하지만 함수의 매개변수로 넘겨졸 경우 함수안에서 무조건 "쓰기"가 강제된다.

ref

ref 키워드는 함수 선언과 호출에 모두 붙여서 사용해야 합니다. (한 곳에만 붙일 경우 컴파일 에러가 납니다.)

ref로 보내는 변수의 경우 초기화를 생략할 수 없으며 함수 내부에서는 읽기와 쓰기 모두 가능합니다.

단, 읽기와 쓰기가 강제는 아니어서 아무것도 하지 않아도 괜찮습니다.

그리고 가장 중요하게도 함수 내부에서 값을 수정하면 함수 외부에서도 값이 바뀝니다.

테스트

ref

한곳에만 ref붙여주면 에러남.

또한 초기화를 생략할 수 없다(main함수에서)

out

main함수에서 이런식으로 선언을 해준 상태를 바로 넘길 수 있고,

위에서 선언 한 후 넘겨줄 수 있다.

이럴경우 num2의 값은 무조건 바뀜.

바뀐다.

왜나하면 받는쪽에서는 무조건 초기화 작업을 해주어야 해서.

Pass by reference를 사용하는 상황과 동작 방식 ❗❗❗


참고
1. int는 선언만 해주면 0으로 초기화 되어 있다.


Pass by reference를 사용하는 상황은 크게 3가지가 있다.

  1. 커다란 Struct 변수를 함수 인자로 보내고 싶은데 메모리 복사하는 연산이 부담스러울 때

  2. 어떤 Referece Type 변수의 생성을 함수 안에서 해야할 때 (string 변수에서 특히 많이 발생)

  3. 함수로부터 여러 타입의 리턴 값을 받고 싶을 때

지금 이럴경우 출력값이 어떻게 될까??

=> 0, 40 나온다.

이유는 function4는 ref로 넘겨주고 받기때문에 해당 객체가 p인 그대로 상태라

새로 객체를 만들면 strength가 0으로 초기화 된다. OK

40이 나오는 이유는

ref없이 넘겨주었는데

p는 현재 인자로 넘겨받는 녀석의 복사본 (객체를 하나 더 만듦) p라는 녀석의 힘은 0인데

person2의 힘은 그대로 40이라 40이 출력 된다.


person1.strength가 0으로 출력되는 이유는 Person Class에 따로 생성자를 두지 않았고

strength는 기본적으로 0으로 초기화되기 때문입니다.

여기서 중요한 것은 person1은 Function4 함수가 호출된 후 함수 본문의 영향을 그대로 받았고

person2는 Function5 함수가 호출된 후 함수 본문의 영향을 받지 않았다는 것이죠.

보시다시피 Pass by reference를 하게 되면

인자로 받은 변수 그 자체를 바로 함수 본문에서 사용하는 것처럼 동작하게 됩니다.

함수 사용 부분에서 우리가 만든 person1과 Function4에서 사용된 p는 프로그래머 눈에만 다르게 보일 뿐

사실 컴퓨터에게는 같은 변수(같은 메모리 공간)으로 취급되는 것이지요.

이전 포스팅에서 소개한 Pass by value가 사실은 변수 선언과 복사를 내포하고 있는 것과 배치됩니다.

Pass by reference의 동작 방식을 이해했다면 앞서 말한 3가지 이유가 어느 정도 설명이 될 것입니다.


https://mathmakeworld.tistory.com/89#:~:text=out%20%ED%82%A4%EC%9B%8C%EB%93%9C%EB%8A%94%20%ED%95%A8%EC%88%98%20%EC%84%A0%EC%96%B8,%EB%AC%B4%EC%A1%B0%EA%B1%B4%20%EA%B0%92%EC%9D%B4%20%EB%B0%94%EB%80%8C%EC%96%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글