2-2 코드 흐름 제어 : ref, out

omniAI·2022년 5월 3일

C#

목록 보기
6/14
post-thumbnail

🎲 함수

Call by Value

  • Call by Value 👉 numbera와 동일한 값을 가진 것 뿐인 별개의 메모리를 가진다.

  • Call by Reference
    • a 메모리 자체를 AddOne 함수의 매개변수로 넘겨준다. 따라서 number 값이 변하면 a 값도 변한다. 둘은 동일한 메모리를 참조한다!


  • Default 매개 변수
    • 매개 변수 c, d, e 는 인수를 넘기지 않더라도 각각의 디폴트 값으로 설정된다.
    • C++ 에선 인수를 넘길 때 꼭 매개 변수와 대응되게 자리를 맞춰주어야 했지만 C# 에선 위와 같이 d 매개변수에 대해선 인수를 따로 넘겨주고 싶다면 d:2.0f와 같이 넘길 수 있다.


🎲 ref & out

  • ref 👉 refCall by Reference로 받기 위한 키워드다.
    • 자료형 보다도 앞에 쓰인다:) ref int a;
    • 매개 변수는 & 타입이라도 인수에까지 &을 붙일 필요는 없었던 C++ 문법과는 다르게 C# 에선 넘겨주는 인수까지 꼭 ref를 붙여주어야 한다. 매개 변수가 ref int number로 선언되어 있다면 인수도 마찬가지로 꼭 ref a로 넘겨주어야 한다.
  • out 👉 ref랑 똑같다.(Call by Reference) 매개 변수에 저장을 강제하는 ref!
    • 매개 변수가 ref인 경우
      • 매개 변수에 값을 저장(write)하지 않고 그저 읽기(read)만 하더라도 문법적 오류 전혀 없다! 즉, 매개변수를 Call by Reference로 인수의 메모리를 참조하기로 해놓고 사용하지 않더라도 문제가 전혀 없다는 뜻!
      • [함수 외부] <-> [함수 내부] 양방향으로 통신하기 위해서 데이터 참조를 주고 받기 위한 개념!
        • 읽기(Read) + 쓰기(Write) 가능. 사용하지 않아도 됨.
      • 함수 내부/외부 사이에 데이터를 빠르게 넘겨주기 위해 사용!
      • 반드시 초기화가 되어 있는, 메모리가 비어 있지 않은 변수에만 ref를 사용할 수 있다. 초기화 되지 않은 변수에 ref를 붙이면 컴파일 오류 발생!! 함수 내부에서 그냥 읽기만 할 수도 있기 때문에 런타임 에러의 위험이 있을 수 있다.
    • 매개 변수가 out인 경우
      - 매개 변수에 어떤 값을 저장(write)하는 활동이 전혀 없다면 컴파일 오류가 발생한다! 반드시 참조 매개변수를 함수 내부에서 write 시켜야 한다! 단순 읽기만 해서는 안된다.
      - Call by Reference 매개 변수가 참조 중인 메모리의 사용을 강제하기 때문에 ref와 달리 초기화를 전혀 하지 않은 변수를 인수로서 out 매개 변수에 넘기는 것이 가능하다.
      - 함수가 끝나면 넘겨준 인수에도 Call by Reference를 통해 어떤 값이 반드시 저장될 것이라는게 보장되기 때문이다. out이 이를 강제함!
      - [함수 내부]에서 작업한 최종 결과물을 [함수 외부] 쪽으로 넘겨주는 일방적 통행 (out 이름처럼!)
      - 함수 내부에서 값을 바꿔서 외부에 전달! 참조 중인 외부 메모리에도 영향을 끼침.
      - 반드시 쓰기 과정이 필요!
      - 함수 내에서의 로직으로 매개 변수 write를 진행한 최종 데이터를 함수 외부로 넘겨주기 위한 용도로 사용!

      위 사진과 같이 out이 붙은 매개 변수에 아무런 값도 저장되어 있지 않다면 컴파일 오류가 발생한다!!
      때문에 out 매개 변수에 저장(write)을 강제해줘야 한다!
      ref였으면 아무 문제 없음!
      아래 사진과 같이 out 매개 변수에 값을 저장하면 오류가 사라진다.

      ref와 마찬가지로 인수에도 모두 out을 붙여주어야 함!
profile
킵러닝

0개의 댓글