기본 문법

유니티

C#의 기본 문법은 기존 C와 매우 유사하다, 따라서 쭉 공부 하면서 잘 몰랐던 문법에 대해서만 정리한다

참조 변수 (ref, Out, in … Span)

C에선 포인터 변수가 C++에는 참조 변수가 있듯이 C#에도 포인터와 참조가 존재하는데 포인터는 권장하는 방법은 아니라고한다 (unsafe)

참조하는 방식으로 ref, out, in 키워드를 사용할수 있다.

ref는 우리가 알고있는 참조와 똑같다 (단 a도 ref a 로 넘겨줘야함)

int a = 1;
ref int b = ref a;
b = 3;
Console.WriteLine(a) // 3

배열의 경우는 어떨까?

int[] arr = {1,2,3,4,5};
 
// 인자 하나에 대해서는 ref를 사용해야함
ref int tmp = ref arr[1];
tmp = 10;
 
// 배열 자체는 메모리참조이므로 기존과 같게 사용가능
int[] brr = arr;
 
// foreach문 사용가능 : 대신 in 사용
foreach(int num in brr) {
	Console.Write(num + " "); // 1 10 3 4 5
}

out의 경우 초기화를 반드시 해야할때 사용되는 키워드라고 한다

using System;
 
namespace MyCompiler {
    class Program {
        public static void Main(string[] args) {
            int x, y;
            getValue(out x, out y);
            Console.Write(x +  " " + y);
        }
 
        static void getValue(out int x, out int y) {
            x = 10;
            y = 20;
        }
    }
}

같은 동작을 ref로도 할 수 있는데 왜 out이라는 키워드가 있는가하고 찾아봤더니 가독성 측면에서 좋다고 하고 ref하나만으로 같은 동작을 이끌어낼 수 있다.

하지만 out 의 경우 매개변수로 넘겨줄때도 out x, out y로 넘겨줘야하는 것처럼 해당 구간에서 할당되는게 확실하게 보여서 out도 적절하게 쓰면 좋을거 같긴하다

in의 경우는 읽기 전용으로 메모리를 넘겨줄때 사용되는 키워드라고 한다(immutable) 메모리 복사를 방지하고 immutable상태로 넘겨줌으로서 코드의 안정성을 높혀준다

근데 in은 값이 value여야 의미가 있는데 보통 c#에선 class만 쓰고, class 자체는 참조값을 넘기기 때문에 in이 무의미하다 → 따라서 in 은 잘 안쓰임

in 보단 Span<T> 를 많이 쓴다고 함 (ref보다 더 강력하고 범용적)

int[] numbers = { 1, 2, 3, 4, 5 }; // ✅ 배열을 Span으로 변환 (복사 없이 참조)
 
Span<int> span = numbers.AsSpan();
 
span[0] = 100; // 원본 배열도 변경됨!
 
Console.WriteLine(numbers[0]); // 출력: 100

일반 new는 힙(Heap)에 할당되지만, stackalloc을 사용하면 스택 메모리에 할당된다 이를 이용해서 Span과 stackalloc을 사용할 수 있음 (Garbage Collector 부담 없이 빠른 메모리할당 가능)

using System;
 
public class Program
{
    public static void Main(string[] args) {
        Program a = new Program();
        a.Run();
    }
    public void Run() { // ✅ static 제거
        Span<int> arr = stackalloc int[] {1,2,3,4,5};
        Console.WriteLine(arr[0]);
    }
}

다음 주제