ref와 out 차이
2015. 6. 23. 18:05ㆍ프로그래밍/C#
728x90
728x90
서론
기존 C++에서 사용하던 레퍼런스는 ref 키워드를 써서 사용하면 된다.
이와 비슷한 녀석인 out이 있는데..
처음 봐서 생소해서 예제를 넷에서 찾아보았다.
일단 out은 ref와 거의 비슷한 역할을 하지만 차이점이 있다.
첫 번째, 함수 호출 시 호출 인자를 초기화 하지 않으면 ref는 에러를 발생한다.
초기화 되지 않은 변수기 때문에 C#에선 조금 하드하게 에러를 발생한다.
하지만 out은 초기화하지 않은 변수도 사용할 수 있다.
이는 C#의 특성상 코드를 간결하게 하기 위한 언어이다.
초기화와 메소드에서 사용하는 값을 넣는 행위를 중복으로 간주할 수 있다.
이를 지원해주는 것이 out이다.
두 번째, out은 위에서 보았듯이 초기화 하지 않은 변수들이 넘어오기때문에 반드시 메소드 초기화 해주어야한다.
메소드에서 초기화 할 것을 가정하고 넘겼으므로 초기화 하지 않으면 에러를 리턴한다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RefAndOutTest { // program class Program { static void Main(string[] args) { Point myPoint = new Point(10, 15); int x1, x2; int y1, y2; myPoint.SetPointOut(out x1, out y1); /* 1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\ * RefAndOutTest\Program.cs(19,28,19,30): error CS0165: 할당되지 않은 'x2' 지역 변수를 사용했습니다. 1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\RefAndOutTest\ * Program.cs(19,36,19,38): error CS0165: 할당되지 않은 'y2' 지역 변수를 사용했습니다. */ // myPoint.SetPointRef(ref x2, ref y2); } } // Point class class Point { // public public Point(int x, int y) { this.x = x; this.y = y; } // set Function Out public void SetPointOut(out int x, out int y) { /* 안에서 초기화하지 않으면? 1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\RefAndOutTest\ * Program.cs(41,15,41,26): error CS0177: 제어가 현재 메서드를 벗어나기 전에 'x' out 매개 변수를 할당해야 합니다. 1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\RefAndOutTest\ * Program.cs(41,15,41,26): error CS0177: 제어가 현재 메서드를 벗어나기 전에 'y' out 매개 변수를 할당해야 합니다. */ x = this.x; y = this.y; } // set Function Ref public void SetPointRef(ref int x, ref int y) { x = this.x; y = this.y; } // private private int x; private int y; } } | cs |
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[.NET, C#] 비동기 네트워크 API (0) | 2016.02.14 |
---|---|
직렬화 (0) | 2015.08.03 |
Delegate (2) | 2015.08.03 |
데이터 보관하기 (0) | 2015.08.03 |
C#이란? (0) | 2015.08.03 |
가비지 컬렉션 (0) | 2015.07.28 |
처음만드는 C# 기초 입출력 (0) | 2015.06.22 |