nameof와 하드코딩

정제로·2023년 9월 22일
0

C#

목록 보기
30/30

하드코딩

하드코딩이란 상수나 변수에 직접 들어가는 값을 "소스코드에 직접" 작성하는 방식이다.

예를들어 아래와 같이 돈을 입금하면 무조건 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이라는 숫자를 변수로 지정해주는 것이다.


nameof

class Test
{
    static void Main()
    {
        int count = 0;
        string c = nameof(count);
        Console.WriteLine(c);
    }
}

이렇게 사용을 한다.
반환값은 string이다.

GetType()으로 보면 string으로 출력된다.

어디에 사용되는걸까?

ToString()보다 빠름

기본적으로 nameof는 컴파일시에 실행되고, ToString()은 런타임에 실행된다.

왜 사용할까?

일단 ToString()보다 빠른이유도 있지만 가장 큰 이유는,

위에서 언급한 하드코딩을 피할수 있어서다.

유니티에서는 Invoke나 Coroutine을 사용할때, 함수명과 시간을 넣는다.

하지만 함수명을 넣을때 "InvokeMethod"이런식으로 넣으면, 본 메서드 이름이 조금 수정이 되거나, 아예 조금 다를때, 오류를 찾기가 버거워 진다.

따라서 반환해주는 nameof()를 이용해서 사용하면,
본 메서드와 nameof()내부에 있는 이름이 다르면, 에러가 뜬다.
버그를 찾기 쉬워지는거다!

Invoke(nameof(InvokeMethod), 1f)이런식으로 사용하면 된다!

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글

관련 채용 정보