2 minute read

Method 사용법

out, ref

outref는 메서드 매개변수로 사용되어, 반환값 대신 사용할 수 있다. 이 때 원래 값이 바뀌므로 조심해야 한다. ref는 값을 ref로 받아서 ref로 돌려줄 때 유용하다.

예시

void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

문법 조심

알 수 없는 [] 에러

Array, List 등을 초기화할 때 { 0, 0, 0 } 대신 [0, 0, 0]으로 초기화되는 문제를 겪었다. 이는 .NET 8.0 같은 최신 버전에서 발생하는 추가 기능이었다. 유니티는 .NET 4.x 버전을 사용하므로 기존 문법을 따르는 것이 좋다.

디버그

디버그에서 변수 보는 법

디버깅할 때 break point를 찍어 변수에 마우스를 대면 변수값을 쉽게 알 수 있다. 디버그는 차근차근 끈기 있게 진행해야 한다. 오늘의 에러는 index out of range였는데, y값을 x값으로 잘못 쓴 것이 문제였다.

클래스 상속

C#에서는 기본적으로 클래스의 메서드 상속이 금지되어 있다. 특별한 메서드만 상속이 가능하다.

virtual

virtual로 설정한 메서드는 자식 클래스에서 override로 상속 가능하다.

예시

public virtual void Method() {}

abstract

abstract 클래스와 메서드는 자식 클래스에서 반드시 구현해야 한다. 부모 클래스에서 abstract 메서드는 body를 정의할 수 없다.

예시

abstract class Parent
{
    public abstract void Method();
}

interface

interface는 클래스에서 구현해야 하는 멤버를 선언만 해두는 곳이다. 이를 상속한 클래스는 인터페이스의 모든 멤버를 구현해야 한다. 인터페이스는 다중 상속이 가능하다.

예시

interface IBase
{
    void Method();
}

enum

enum 값에 특정 값을 주어 형 변환이 가능하다. 1개만 값을 주면 나머지는 자동으로 순서대로 값을 가진다.

예시

enum E
{
    a = 1,
    b,
    c
}
int i = (int)E.a;
Enum e = (E)1;

delegate

C#의 함수 포인터로, 메서드를 등록하여 사용할 수 있다. 메서드와 delegate의 인자가 같아야 한다. 여러 개의 메서드를 등록하면 한번에 모두 실행된다.

함수 등록 예시

delegate int Calculus(int x, int y);
static int Add(int x, int y)
{
    return x + y;
}
...
Calculus C = Add;
int result = C(1, 2);

람다

람다 표현식은 간단한 문법으로 사용 가능하다.

예시

delegate void D(string str);
D del = (message) => {
    // 작업
};

Func<type, type, type…, return type>, Action

Func은 마지막 인자가 반환값의 형태이고, Action은 전부 인자이다.

LINQ

쿼리문을 사용하여 데이터를 간편하게 처리할 수 있다.

예시

List<int> nums = ...;
var oddNumbers = from num in nums
                 where num % 2 == 1
                 select num;

C# Nullable

int? 형식으로 null을 허용할 수 있다. .HasValue로 null이 아닌 값을 가지고 있는지 확인 가능하다. int i = nullvar ?? 0; 형식으로 null인 경우 대체값을 지정할 수 있다.

StringBuilder

문자열을 Append(), Insert(), Replace(), Remove() 등의 기능으로 조작할 수 있다. 문자열에 자주 변화를 줄 때 동적으로 크기를 조절해 메모리 효율을 높일 수 있다.