Posts 유니티 - 깔끔하고 보기 좋은 변수명 짓기
Post
Cancel

유니티 - 깔끔하고 보기 좋은 변수명 짓기

Intro


코딩을 하다보면 변수의 이름을 지을 때 많은 고민을 하게 되고, 생각보다 많은 시간이 소요된다.

아무 의미 없는 이름을 짓게 되면 개발을 이어 나가면서 스스로도 혼란을 겪게 될 수 있으며

만일 협업을 하고 있었다면, 솔직히 혼나도 할 말이 없다.

그러니 ‘보기에도 깔끔하고 한 눈에 의미를 알아볼 수 있는 이름’을 짓기 위해 언제나 고심하게 된다.


Note


만약 팀 내에 속해 있다면, 당연히 그 팀의 이름 규칙을 따라야 한다.

이 포스팅은 아직 이름 규칙을 정하지 못한 경우 도움을 줄 수 있는

기본적인 유니티 C#의 이름 규칙과 약간의 팁을 다룬다.


Naming Rules


의미 있고 규칙성 있는 변수 이름을 짓기 위해, 몇가지 규칙을 정할 필요가 있다.

  1. 카멜 케이스(Camel Case)를 사용한다.
  2. 이름은 명사형으로 짓는다.
  3. 접두어 + 몸체 + 접미어 형태로 짓는다.
  4. 단어의 개수는 4개를 넘지 않는다.


[1] 카멜 케이스

1번 규칙은 기본 중의 기본이다.

카멜 케이스는 변수 이름의 대소문자 구성이 낙타의 등에 달린 혹을 연상할 수 있다고 하여 붙여진 이름이다.

예를 들어 변수 이름을 number of players에서 비롯하여 지을 때,

일단 모든 글자는 소문자로 적는다.

그리고 첫 번째 단어의 첫 글자는 소문자, 나머지 단어의 첫 글자는 대문자로 짓고

언더바(_)는 사용하지 않고 각 단어를 붙여 쓴다.

따라서 변수 이름은 numberOfPlayers가 된다.


어떤 프로그래밍 환경에서든 변수의 이름은 이렇게 카멜 케이스로 짓는 경우가 많다.

특히 C#에서는 MS에서 추천하는 공식 이름 규칙이기도 하다.


[2] 명사형

2번 규칙도 상당히 중요하다.

MS에서 추천하는 C# 공식 네이밍 가이드에서도 클래스 및 변수명은 명사형, 메소드는 동사형으로 지을 것을 권고한다.

일반적으로 변수는 주체 또는 객체(대상)로 동작하며, 메소드는 행위로서 동작한다.

따라서 변수는 명사를 통해 의미를 설명하고, 메소드는 동사를 통해 행위를 설명할 수 있는 이름을 짓는다.


[3] 접두어 + 몸체 + 접미어

3번 규칙은 2번 규칙처럼 어떤 가이드에서 추천했다거나 하는 건 아니다.

하지만 일관성 있는 규칙과, 스크립트 내에서 병렬적으로 나열된 변수명들을 깔끔하게 관리할 수 있는 장점을 제공한다.

따라서 참고 삼아 읽는 것이 좋다.


캐릭터 관련된 변수명들을 지을 때를 예시로 살펴본다.

  • characterMovement (캐릭터 이동 제어)
  • cInventory (캐릭터 인벤토리 관리)
  • recordedCharcterCommands (캐릭터 명령 기록)


characterMovementcharacter + Movement로 캐릭터 이동 관련된 변수라는 것을 알 수 있다.

cInventorycharacter를 줄인 접두어 c + Inventory로, 언뜻 봤을 때 ‘c’의 의미를 바로 알아채지 못하고 고민하게 될 수 있다.

recordedCharacterCommands는 형용사 + 명사 + 명사의 조합으로, 단순히 단어를 순서대로 나열하여 명명하였다.


각각의 변수명만 보면 나름 합리적이다.

그런데 세 변수명을 같이 놓고 보면, 솔직히 난장판으로 보인다.

따라서 일정한 규칙을 정해놓고 통일된 형태로 깔끔하게 이름을 지을 필요가 있어보인다.


3번 규칙을 부가 설명하자면 다음과 같다.

  • 접두어와 접미어는 완성된 단어 혹은 약어를 사용한다.
  • 접두어와 접미어는 각각 하나의 단어를 사용하거나, 아예 작성하지 않는다.
  • 몸체는 완성된 하나의 단어를 사용한다.
  • 여러 개의 몸체가 연결될 수 있다.
  • 유사한 성질을 지니는 변수는 동일한 접두어나 접미어를 사용한다.
  • 접두어는 의미적 특성, 접미어는 변수 형식의 특성을 나타내도록 짓는다.


기호로 표현하자면 아래와 같이 나타낼 수 있다.

1
[Prefix]{Body | Bodies}[Suffix]

(접두어 + 몸체 + 접미어) 형태를 기본으로 하지만,

(접두어 + 몸체), (몸체 + 접미어), (접두어 + 몸체1 + 몸체2 + 접미어), (몸체1 + 몸체2 + 몸체3) 등 파생 형태를 지닌다.


위의 규칙을 통해 다시 예시의 변수명들을 이름 지어본다.

  • characterMovement
  • characterInventory
  • characterCommandRecords


모두 캐릭터에 관련되어 있으므로, 공통 접두어로 character를 사용한다.

그리고 Movement, Inventory, Command, Record는 몸체에 해당된다.

마지막으로 characterCommandRecordss는 접미어에 해당된다.

Records 자체가 하나의 단어로서 몸체가 아닌가? 이렇게 생각할 수 있지만

s를 접미어로 분리하여 여기는 것이 좋다.


여기서 s는 마지막 세부 규칙인 ‘접두어는 의미적 특성, 접미어는 변수 형식의 특성을 나타내도록 짓는다.’에서 ‘변수 형식의 특성’을 나타내는 역할을 한다.

characterMovement, characterInventory는 접미어가 없으므로 단일 개체로서의 특징을 지니고

characterCommandRecord라고 이름을 지을 경우, 마찬가지로 단일 개체라는 것을 유추할 수 있다.

하지만 s를 접미어로 붙임으로써 ‘배열’ 혹은 다중 개체라는 특성을 부여하고, 유추할 수 있게 된다.

유사한 의미로 s 대신 Array, Arr 등을 붙여서 더 명시적으로 나타낼 수도 있다.


[4] 단어 개수 4개 제한

변수 이름은 최대한 ‘자기설명적’으로 짓는 것이 좋다.

변수 이름을 보면 그 변수의 특징은 무엇이고, 어떻게 사용될지 추측할 수 있어야 한다.

예를 들어 num보다는 numberOfCharactersInTheWorld가 차라리 나을 수도 있다.

numberOfCharactersInTheWorld는 이름을 보자마자 그 의미를 아주 간명하게 파악할 수 있다.

하지만 과유불급이라고, 길어도 정말 너무 길기 때문에 실제로 사용하기에는 무리가 있다.

이런 변수명을 코드에 사용하면 문장도 길어지고 눈도 피로해질 것이다.

따라서 실제로 사용하려면, 의미를 명확히 드러내되 적당히 줄여서 numWorldCharacters 정도로 타협할 것이다.


이렇게 자기설명적인 이름을 지으려다가 변수명이 너무 길어질 수 있기 때문에

하나의 변수를 이루는 단어의 최대 개수를 3~4개 정도로 제한하여 적당히 짓는 것이 좋다.

혹은 단어 개수 대신 글자 수 제한을 통해, 글자 수를 최대 20까지만 허용하는 등의 방안도 괜찮다.


물론 numWorldCharacters보다 numberOfCharactersInTheWorld를 더 선호하는 경우도 존재할 수 있다.

따라서 이 규칙은 개인/팀의 선호에 따라, 혹은 경험에 의존하여 결정하는 것이 좋다.


Prefix 예시


  • 여러 변수를 한데 묶었을 때 공통 분모가 될 수 있는 의미를 나타낸다.


이름 설명
game 게임에 직접적으로 관련된 변수. 주로 매니저, 설정 등에 사용한다.
world 1. game과 비슷한 의미(게임 월드)
2. ‘공간’으로서의 의미
3. local의 반대 의미 : world space
player 플레이어 캐릭터 또는 사용자의 직접 조작에 따라 동작하는 대상
character 독립적 객체로서 사용되며, 이동, 상호작용 등 행위의 주체가 되는 대상


Body 예시


  • 기능을 나타낸다.


이름 설명
Index 인덱스(번호)
Number 수량
Movement 이동 기능
Input 입력, 조작 기능
Position 2D, 3D 위치 벡터
Direction 2D, 3D 방향 벡터
Rotation 주로 3D 회전(쿼터니언, 오일러 각)에 사용된다.
Angle Degree, Radian 등으로 표현될 수 있는 단일 각도
Controller 대상을 종합적으로 통제(이동, 회전, 입력 등)하는 컴포넌트
Manager 대상을 종합적으로 관리하는 컴포넌트 또는 정적 클래스
Setting 대상의 설정 값들을 기억하고 조정하는 컴포넌트
Option 구체적인 설정의 분기 또는 데이터


Suffix 예시


  • 변수 형식(타입)의 특성을 나타낸다.


이름 설명
s 배열
Arr, Array 배열
List 리스트
Dict, Dictionary 딕셔너리
Set 1. 해시셋(HashSet)
2. 튜플과 같이 여러 변수를 하나로 묶은 경우


상태를 나타내는 변수의 이름 규칙 : is + 형용사


변수는 명사형을 기본으로 짓는 것이 좋으나, ‘반드시’ 그런 것은 아니다.

여기서는 is + 형용사를 사용하는 경우에 대해 소개한다.

주로 상태나 플래그를 나타내는 bool 타입 변수들에 해당한다.


예시로, 다음과 같은 변수들이 있다.

  • moving (현재 이동 중인지 여부)
  • jumping (점프 중인지 여부)
  • damaged (피해를 입었는지 여부)

각각 한 단어로 이루어져 있고 간결한 편이지만,

여기에 간단한 규칙을 적용하여 통일성을 줄 수 있다.


  • isMoving
  • isJumping
  • isDamaged

is-를 붙임으로써 상태를 나타내는 bool 타입 변수라는 것을 명시적으로 드러내고,

유사한 속성의 변수들에 통일성을 부여할 수 있게 되며

이름의 앞부분을 보자마자 0.1초만에 그 변수의 역할을 곧바로 짐작할 수 있게 되는 장점이 있다.


This post is licensed under CC BY 4.0 by the author.

(Amplify) Screen Effect - Pixelation

Fisher-Yates Shuffle 간단 정리