규도자 개발 블로그

좋은 변수 이름 정하기 : 전역 변수의 구분과 한정자 본문

소프트웨어 공학/Clean Code

좋은 변수 이름 정하기 : 전역 변수의 구분과 한정자

규도자 (gyudoza) 2018. 10. 7. 04:44

전의 게시물에서도 밝혔다시피 이 게시물은 스티브 맥코넬이 쓴 CODE COMPLETE2에 나온 내용이며 다른 사람들에게도 변수 이름의 중요성과 그 이름을 정하는 데 도움을 주기 위해, 그리고 나 자신도 필요할 때마다 참고하기 위해 쓴다는 것을 알린다.

전역 네임스페이스에 있는 변수

전역 네임스페이스에 있는 변수에는 한정자(qualifier)를 사용하라. 변수가 전역 공간에 있다면(이름 상수, 클래스 이름 등) 전역 공간을 나누고 이름 충돌을 피하기 위한 규약이 필요한지 고려해 본다. C++와 C#에서는 전역 공간을 나누기 위해서 namespace키워드를 사용할 수 있다.

전역 공간을 분할하기 위해서 namespace 키워드를 사용하는 C++ 예제

namespace UserInterfaceSubsystem{
    ...
    // a lot of codes...
    ...
}

namespace DatabaseSubsystem{
    ...
    // a lot of codes...
    ...
}

Employee 클래스를 UserInterfaceSubsystem과 DatabaseSubsystem 모두에 선언한다면 UserInterfaceSubsystem::Employee나 DatabaseSubsystem::Employee를 작성하여 참조하고자 하는 클래스를 구분할 수 있다. 자바에서는 패키지(package)를 사용하여 같은 효과를 얻을 수 있다.

 네임스페이스나 패키지를 지원하지 않는 프로그래밍 언어에서도 전역 공간을 분할하기 위해 이름 규칙을 사용할 수 있다. 한 가지 규약은 전역으로 노출되는 클래스는 서브시스템 연상 기호(mnemonic)를 접두사로 사용하는 것이다. 사용자 인터페이스 Employee 클래스는 uiEmployee, 데이터베이스 Employee클래스는 dbEmployee가 될 수 있을 것이다. 이러한 규약은 전역 공간 충돌의 위험을 최소화한다. 흔히들 prefix라는 이름으로 쓰고 있는 '접두어'를 의미하는 것이다. 하지만 namespace를 지원하는 언어에서는 되도록이면 namespace를 사용하자.

변수 이름의 계산값 한정자

많은 프로그램이 총계, 평균, 최댓값 등 계산된 값을 보관하는 변수를 갖는다. Total이나 Sum, Average, Max, Min, Record, String, Pointer와 같은 한정자로 변수의 이름을 만들 경우 이름 끝에 한정자를 입력한다.

 이러한 습관은 여러 가지 장점을 제공한다.


  • 첫째, 변수 이름에서 가장 중요한 변수의 의미를 가장 잘 전달하는 부분이 앞부분이기 때문에 가장 눈에 띄고 잘 파악된다.
  • 둘째, 이러한 규약을 마련함으로써 totalRevenue와 revenueTotal을 같은 프로그램에서 사용하는 혼란을 피할 수 있다. 이름이 의미상 같은데 규약을 통해 그것들이 서로 다르게 사용되는 것을 막을 수 있을 것이다.
  • 셋째, revenueTotal, expenseTotal, revenueAverage, expenseAverage와 같은 이름은 보기 좋은 대칭을 이룬다. totalRevenue, expenseTotal, revenueAverage, averageExpense와 같은 이름은 정돈되어 있다는 느낌으르 주지 않는다.
  • 마지막으로 일관성 있게 관리하면 이해하기 쉽고 유지보수도 쉽다.

계산된 값을 변수 이름의 끝에 놓는 규칙에 대한 한 가지 예외는 Num 한정자의 관습적인 위치다. 변수의 이름 앞에 있으면 Num은 총계를 가리킨다. numCustomer는 전체 고객의 수다. 변수의 끝에 있으면 인덱스를 가리킨다. customerNum은 고객번호를 가리키는 의미처럼 보이지 않는가? numCustomers에 있는 s는 또 다른 의미를 제공한다. 하지만 Num을 사용하면 혼란을 일으키기 때문에 전체 고객의 수를 가리키기 위해서 Count나 Total을 사용하고 특정한 고객을 가리키는 데 Index를 사용함으로써 이러한 문제를 피하는 것이 가장 좋은 방법이다. 결론적으로 전체 고객의 수는 customerCount, 특정 고객을 가리킬 때는 customerIndex를 쓰는 게 좋다.

Comments