내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2022-04-01 08:23

제목

[C#] 참조 로컬과 참조 반환


이번엔 간단한 내용에 대해 포스팅 하려고 합니다. ref 키워드 (참조)에 관한 내용 입니다. C# 7 버전에서는 로컬 변수와 메서드가 반환하는 값을 참조형식으로 전달(메모리 주소를 넘김) 할 수 있는 ref키워드를 제공합니다. 간단한 샘플 코드를 통해 알아 보겠습니다.

참조 로컬

로컬 변수를 선언하고 값을 대입할때 참조형태로 전달할 수 있습니다.

int num1 = 1;
ref int num2 = ref num1;
num1 = 2;

Console.WriteLine($"num1 : {num1}");
Console.WriteLine($"num2 : {num2}");

출력 결과는

num1 : 2
num1 : 2

num2 로컬 변수에 num1의 값을 참조 형태로 전달한 결과 num1의 값이 변경될때 같이 영향을 받습니다. 당연히 그 반대로 num2의 값이 변경 되었을때 num1변수가 영향 받습니다.

읽기전용 참조 로컬

참조 로컬 변수를 ref readonly키워드 사용으로 읽기 전용으로 지정할 수 있습니다.

int num1 = 1;
ref readonly int num2 = ref num1;
num1 = 2;
num2 = 3;  // 빌드 오류 발생

참조 반환

ref키워드 사용으로 메서드의 값을 반환할때 참조 형식으로 반환 할 수 있습니다. 이렇게 사용되면 호출자에서 값 수정시 호출 메서드 내부에서 반영 됩니다. MS Docs에 심플한 예제가 있습니다.

public class Book
{
    public string Author;
    public string Title;
}

public class BookCollection
{
    private Book[] books = { new Book { Title = "Call of the Wild, The", Author = "Jack London" },
                        new Book { Title = "Tale of Two Cities, A", Author = "Charles Dickens" }
                       };
    private Book nobook = null;

    // Book객체를 참조형식으로 반환
    public ref Book GetBookByTitle(string title)
    {
        for (int ctr = 0; ctr < books.Length; ctr++)
        {
            if (title == books[ctr].Title)
                return ref books[ctr];
        }
        return ref nobook;  // 참조 반환
    }

    public void ListBooks()
    {
        foreach (var book in books)
        {
            Console.WriteLine($"{book.Title}, by {book.Author}");
        }
        Console.WriteLine();
    }
}

GetBookByTitle() 메서드를 통해서 title에 해당 되는 Book를 찾고 그 결과에 대해 참조로 해당 객체를 반환 하고 있습니다.

var bc = new BookCollection();
bc.ListBooks();

ref var book = ref bc.GetBookByTitle("Call of the Wild, The");
if (book != null)
    book = new Book { Title = "Republic, The", Author = "Plato" };
bc.ListBooks();

출력 결과는

Call of the Wild, The, by Jack London
Tale of Two Cities, A, by Charles Dickens
Republic, The, by Plato
Tale of Two Cities, A, by Charles Dickens

GetBookByTitle() 메서드로 반환된 Book객체 속성 변경시 대상 객체도 영향 받는 모습을 확인 할 수 있습니다.

출처1

출처2