본문 바로가기
Dev.Mobile/iPhone

[iOS] Constants 정의 시, 'k' prefix 사용은 적절한가

by Devkin 2012. 1. 10.

Core Foundation, Audio Unit 등의 Core Framework 을 사용할 경우, 'k' 로 시작하는 Constants 를 보게 되는데 Core Foundation Design Concepts 문서를 보면 Naming Conventions 항목에 "(An exception to this convention are constants, which put "k" before the type prefix)" 와 같이 Constants 에 대한 설명이 있다. 그렇다면, 사용자 프로젝트에서도 Constants 정의 시에 'k' prefix 를 사용하여 이름을 정하면 되는 걸까?

AudioUnitProperties.h [AudioUnit.framework]

enum {
	kAudioUnitScope_Global		= 0,
	kAudioUnitScope_Input		= 1,
	kAudioUnitScope_Output		= 2,
	kAudioUnitScope_Group		= 3,
	kAudioUnitScope_Part		= 4,
	kAudioUnitScope_Note		= 5,
	kAudioUnitScope_Layer		= 6,
	kAudioUnitScope_LayerItem	= 7
};
#define kAUPresetVersionKey 		"version"
#define kAUPresetTypeKey 			"type"
#define kAUPresetSubtypeKey 		"subtype"


왜 'k' prefix 인가

Core Foundation 등의 Core Framework 헤더파일들을 보면, 헝가리언 네이밍 규칙을 따른 흔적들을 제법 볼 수 있다. 일단 'k' 는 헝가리언 네이밍에 따라 사용된 걸로 보인다. Constants 의 'c' 는 이미 헝가리안에서 'char' 의 'c' 로 예약이 되어 있는 상황이니 중복을 피하기 위해 동일한 발음기호인 'k' 를 사용한 것으로 추측된다. Core Foundation 의 역사를 고려하면 헝가리언 네이밍을 따른것이 어느정도 이해가 된다.

Coding Guidelines for Cocoa vs. Google Objective-C Guide 

Coding Guidelines for Cocoa 의 Constants 항목을 간략히 정리하면, 그룹이나 연관된 Integer Values 의 경우 Enumeration 을 사용하고 2~3개의 대문자로 이루어진 prefix 로 시작되는 Class Name 정의를 따르는 "Naming Functions" 규칙을 따라 정의한다. 일단, 가이드라인 자체가 Hungarian Notation 을 따르지 않으며 어디에도 'k' prefix 에 대한 내용은 없다.


반면, Open Source Project 작성 시 기준을 위한 Google Object-C Guide 에서는 Constants 의 경우 'k' prefix 를 사용해야 한다고 명시되어 있다. 

일단, 위 두가지 가이드라인에서 Prefix 를 제외하고 나머지 이름에 Camel-Case 가 적용이 되는 것은 동일하다. 문제는 상반되게 기술된 Prefix 사용법이다.

Class/Function Name 과 동일한 Prefix 를 사용하면, 해당 Constants 와 연관되는 네임스페이스 파악이 용이하다. 
반면, 'k' prefix 를 사용할 경우에는 해당 Value 가 Constant 라는게 바로 파악이 가능하다.

결론

개인적으로는 Constants 정의 시에는 'k' prefix 사용을 배제하고 애플의 공식 문서 Coding Guidelines for Cocoa  를 따라 정의 되어야 한다고 본다.  Open Source 들을 보면, 'k' prefix 를 사용한 프로젝트도 제법 보이나, 최근의 프로젝트들은 전자인 Coding Guidelines for Cocoa 의 Constants 네이밍 규칙을 따르고 있다. 'k' prefix 는 Core Frameworks 의 오랜 역사로 묻어두자.
반응형

댓글