Right now do !

[C#기초] Call by Value, Call by Reference

by 지금당장해

 회사에 주니어들 한테 교육을 진행 하다 보면 처음으로 약간의 난관에 부딛히는 주제가 바로 이것 Call by Value, Call by Reference이다. 이 주제가 언어 별로 조금씩 틀리고 같은 언어라도 C++같은 경우에 인자로 넘기는 것이 값 형인지, 포인터인지에 따라 작용이 다르게 보이니 더더욱 언어별로 정리 하고 가야 한다.


C#은 MS에서 아니라고 할지도 모르겠지만 분명 자바를 동경 했다. (지금은 그럴것도 없다.) 그래서 많은 부분을 차용하였는데 그러면서 MS답게 기존 MS개발자들을 고려 했다. 해서 C#에 함수 호출은 Call by Value에요 Call by Reference에요라고 질문을 하면 "둘다"라고 해야 정답이다. C#에서는 ref라고 하는 지시자를 함수의 선언과 호출에 명시적으로 사용하여 Call by Reference를 구현 할 수 있다. 자세한 내용은 예제 코드와 실행 결과로 확인 하자.



    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void CallCase1(Animal animal)
        {
            System.Diagnostics.Trace.WriteLine(animal.Howl);
            animal.Howl = "냐옹~~~~";
            animal.Friend = new Animal() { Kind = "닭", Howl = "꼬끼오", LifeTime = 7 };
            System.Diagnostics.Trace.WriteLine(animal.Howl);
            animal = new Animal() { Kind = "개", Howl = "멍멍", LifeTime = 10 };
            System.Diagnostics.Trace.WriteLine(animal.Howl);
            
        }

        private void CallCase2(ref Animal animal)
        {
            System.Diagnostics.Trace.WriteLine(animal.Howl);
            animal.Howl = "냐옹~~~~";
            System.Diagnostics.Trace.WriteLine(animal.Howl);
            animal = new Animal() { Kind = "개", Howl = "멍멍", LifeTime = 10 };
            System.Diagnostics.Trace.WriteLine(animal.Howl);
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Animal cat = new Animal() { Kind="고양이", Howl="야옹", LifeTime=7 };
            CallCase1(cat);
            System.Diagnostics.Trace.WriteLine(cat.Howl);
            System.Diagnostics.Trace.WriteLine(cat.Friend.Howl); // Java에서 Call by ref를 유사하게 구현 할 수 있는 방법
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Animal cat = new Animal() { Kind = "고양이", Howl = "야옹", LifeTime = 7 };
            CallCase2(ref cat);
            System.Diagnostics.Trace.WriteLine(cat.Howl);
        }
    }

    public class Animal
    {
        public string Kind { get; set; }
        public string Howl { get; set; }
        public int LifeTime { get; set; }
        public Animal Friend { get; set; }
    }

Button1 클릭 실행 결과
야옹
냐옹~~~~
멍멍
냐옹~~~~
꼬끼오 // 객체 내에 객체 레퍼런스 변수를 선언하여 생성한 값, JAVA에서 Call by reference를 할수 있는 방법
Button2 클릭 실행 결과
야옹
냐옹~~~~
멍멍
멍멍 // 함수에서 변경한 객체가 유지됨


부연하자면 Animal Class에 Friend라는 Self Ref.변수를 하나 선언하여 보여주고자 한것은 Call by Value호출시 하고 내부 Reference변수에 객체를 생성하여 할당 하면 Method를 벗어나도 객체 레퍼런스가 유지되는 것을 보여주고자 함이다. Java에서 C#과 같이 ref를 하려면 어떻게 해야 하는가 라고 구글링을 하면 대부분 이런 예제가 나온다.


명확히 하고자 이 글을 쓰긴 했지만 Call by Reference를 사용해야 하는지 숙고 해볼 필요가 있다.


블로그의 정보

지금 당장 해!!!

지금당장해

활동하기