C#에서 ref와 out

C#책을 읽다보니 Value 타입이랑 reference 타입있는데
뭐 C++에도 있는거지만 암튼 읽다보니 이런게 있더군.

참조형식이 ref를 쓰면 C++에서 &붙이는거랑 비슷하다

class anotherclass{
	public:
	int id1;
	int id2;
	anotherclass() { id1 = 5; id2 = 7; }
	
	void GetID(int &ID1, int &ID2){
		ID1 = id1;
		ID2 = id2;
	}
}

void Main(){
	anotherclass ac;
	int aaa = 0;
	int bbb = 0;
	ac.GetID(aaa, bbb);
	Console.WriteLine("aaa={0}, bbb={1}",aaa,bbb);
}

위는 대충 작성한 C++코드이고 밑에는 이걸 동일효과가 나는 C#코드

class anotherclass{
	public int id1;
	public int id2;

	public anotherclass() { id1 = 5; id2 = 7; }
	public void GetID(ref int ID1, ref int ID2){
		ID1 = id1;
		ID2 = id2;
	}
}

namespace _12
{
	class Program{
		static void Main(string[] args){
			anotherclass ac = new anotherclass();
			int aaa = 0;
			int bbb = 0;
			ac.GetID(ref aaa,ref bbb);
			Console.WriteLine("aaa={0}, bbb={1}",aaa,bbb);
		}
	}
}

ref가 들어가면 거기에 물리는 객체(aaa나 bbb)는 이미 인스턴스화 되어 있어야 하고
out을 쓰면 단순 C++표현으로 하면 포인터 값만 넣어주는것이라 그 메소드 내부에서
new 해서 인스턴스화 한담에 그 객체를 반환하는것이다.

ref는 사용하기전에 인스턴스화 까지 되어 있어야 하며
out은 단순 포인터 값만 넣으면 내부에서 인스턴스화 해서 값을 반환한다.

out을 쓰면 위의 예제가 이렇게 변한다.

class anotherclass{
	public int id1;
	public int id2;

	public anotherclass() { id1 = 5; id2 = 7; }
	public void GetID(out int ID1, out int ID2){
		//ID1, ID2가 만일 클래스 타입이었다면 new를 해줘야 한다.
		ID1 = id1;
		ID2 = id2;
	}
}

namespace _12
{
	class Program{
		static void Main(string[] args){
			anotherclass ac = new anotherclass();
			int aaa, bbb;
			ac.GetID(out aaa,out bbb);
			Console.WriteLine("aaa={0}, bbb={1}",aaa,bbb);
		}
	}
}

허겁지겁 대충 속독법으로 보고 있는 C#책이라.. 혹시 잘못이해한게 있으면 댓글 부탁드립니다.

크리에이티브 커먼즈 라이선스 Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.