하드코딩이란 상수나 변수에 직접 들어가는 값을 "소스코드에 직접" 작성하는 방식이다.
예를들어 아래와 같이 돈을 입금하면 무조건 10%의 이자를 붙여주는 코드가 있다라고 가정해보자
using System;
class CapitalInterest
{
public float CalcTotalReturn(int capital)
{
int interest = capital / 10;
return interest + capital;
}
}
class CsTest
{
static CapitalInterest ci;
public static void Main()
{
ci = new CapitalInterest();
Console.WriteLine(ci.CalcTotalReturn(100));
}
}
하지만 만약 이자가 5%로 떨어지면 어떻게 수정하겠는가?
만약 10%의 숫자를 그대로 변경해도 되지만,
만약 그 숫자가 10,000,000개 있다고 생각해보자. 그걸 다 고칠수 있겠는가?
이래서, 하드코딩 지양의 기초.
매직넘버를 지양하자가 나온다.
매직넘버는 위의 예제처럼 변수가 아닌 숫자로 값을 이용해주는것을 의미한다.
따라서 위의 코드보다 더 좋은 코드는
using System;
class CapitalInterest
{
int interest = 10;
public float CalcTotalReturn(int capital)
{
int interestCost = capital / interest;
return interestCost + capital;
}
}
class CsTest
{
static CapitalInterest ci;
public static void Main()
{
ci = new CapitalInterest();
Console.WriteLine(ci.CalcTotalReturn(100));
}
}
이렇게 10이라는 숫자를 변수로 지정해주는 것이다.
class Test
{
static void Main()
{
int count = 0;
string c = nameof(count);
Console.WriteLine(c);
}
}
이렇게 사용을 한다.
반환값은 string이다.
GetType()으로 보면 string으로 출력된다.
어디에 사용되는걸까?
기본적으로 nameof는 컴파일시에 실행되고, ToString()은 런타임에 실행된다.
일단 ToString()보다 빠른이유도 있지만 가장 큰 이유는,
위에서 언급한 하드코딩을 피할수 있어서다.
유니티에서는 Invoke나 Coroutine을 사용할때, 함수명과 시간을 넣는다.
하지만 함수명을 넣을때 "InvokeMethod"
이런식으로 넣으면, 본 메서드 이름이 조금 수정이 되거나, 아예 조금 다를때, 오류를 찾기가 버거워 진다.
따라서 반환해주는 nameof()를 이용해서 사용하면,
본 메서드와 nameof()내부에 있는 이름이 다르면, 에러가 뜬다.
버그를 찾기 쉬워지는거다!
Invoke(nameof(InvokeMethod), 1f)
이런식으로 사용하면 된다!