액션스크립트 초보를 위한 코딩 기본 규칙, 네이밍, 이것만은 지키자.
by 세계의끝 on 5.21, 2010, under 고수들은 가르쳐주지 않는 AS3.0 입문
요즘도 만드는지는 모르겠지만, 이소룡과 성룡이 전성기였던 시절 쿵푸를 소재로 한 영화들을 보면 대략 이런 스토리가 진행됩니다. 집안이 원수들에게 유린당하고 주인공만 홀로 남게 되었는데, (우연한) 기회에 절정고수의 무술 사부님을 만나, 혹독한 수련을 받은 후, 하산하여 원수를 갚는다. 라는 이야기죠. 쿵푸영화들의 절반 이상은 항상 이런식이었는데도 질리지도 않고 계속 비슷한 스토리의 영화가 나왔던것 같습니다.
영화의 전개 부분에는 사부님으로부터 배우는 혹독한 수련과정이 나오는데, 이 수련과정 또한 매우 스테레오타입인지라 마당쓸기, 물 길어오기, 빨래하기, 밥하기와 같은 허드렛 일을 열심히 했는데, 애초부터 책 같은 형태의 궁극의 비기(秘記) 따위는 없었고… 일견 쓸모 없어보였던 잡일이 알고보니 나중에 다 피가되고 살이되는 거였더라~ 라는 이야기 구성과 설정 또한 항상 같습니다.
오늘 다뤄볼 이야기는 이런 허드렛일과 비슷하고 기본 소양이 되는 그런 이야기 입니다. 코딩을 하다보면 이게 변수인지 파라미터인지 함수명인지 그것도 아니면 클래스명인지 알 수 없는 경험을 하고계신 분들이 있을겁니다.
변수도, 이게 전역변수인지 지역변수인지, 전역변수라면 public 인지 protected 인지 private 인지 구분하고 싶은데 맨 위까지 스크롤 했다가 다시 내려오는걸 반복했다가는 코딩하다가 금방 지쳐 쓰러지겠죠.
그래서 이런 경우 각 멤버들에 대한 네이밍 규칙을 정해 놓는다면, 코딩이 훨씬 수월해질 수 있다는거죠.
제가 지금부터 써 내려가는 규칙들은 세계의끝이 고심끝에 정한 궁극의 네이밍 규칙…이 아니라 조이 로트와 대니 패터슨 공저, 액션스크립트 3.0 디자인 패턴(Advanced ActionScript 3 Design Patterns) 의 내용에 기술되어 있는 네이밍 규칙을 다시 정리하여 여러분에게 알려드리는 것입니다.
이 책은 장호연씨의 번역과 양주일씨의 감수로 에이콘 출판사에서 번역서가 나와 있으므로 관심이 있는 분들은 읽어보시면 되겠습니다.
이 포스트에서 소개하게될 네이밍 규칙이 유일하고 절대적인 규칙이 아니라는 것을 책에서도 설명하고 있습니다. 이것은 다분히 스타일의 문제이고 가독성의 문제이지 프로그램 성능의 본질과는 직접적인 관계가 없기 때문입니다. 물론 내가 작성한 코드를 남이 볼 때 쪽이 덜 팔리는 부수적인(?) 효과정도는 보너스로 얻을 수 있을것 같습니다.
네이밍에 대한 규칙은 41페이지부터 나와 있는 내용이므로 이 책에서도 가장 기본 단계의 지식으로 다루고 있는 셈 입니다.
* * *
사용할 수 있는 문자
액션스크립트에서 클래스, 패키지, 변수, 함수, 인터페이스를 네이밍할 때 사용할 수 있는 것으로는
- a부터 z까지 그리고 A부터 Z까지의 영문 문자열[01]
- 0부터 9까지의 숫자. 그러나 네이밍이 숫자로 시작할 수는 없습니다.
- _ (언더바 또는 언더스코어), 그리고 $(달러) 기호의 단 두가지 특수기호.
이렇게 세 종류를 네이밍에 사용할 수 있습니다. 상당히 심플하죠? 세번째 항목의 두 가지 특수기호 외에는 모두 연산자 또는 정규표현식에서 사용하도록 예약되어 있는 기호들이라 네이밍에는 사용할 수가 없습니다.
* * *
변수의 네이밍 (캐멀 표기법)
변수는 소문자로 시작하고 의미가 있는 단어를 구분하여 첫 글자만 대문자로 표현합니다.
0 | var myInstanceName:Sprite |
위와 같은 형태입니다.
위와 같이 소문자 기본에 단어를 기준으로 첫 글자를 대문자로 작성하는 표기법을 캐멀 표기법(Camel Notation 또는 Camel case)이라고 합니다. 네, 여러분이 떠올리신 그 낙타 맞습니다. 이런거죠. ^^
이 캐멀 표기법은 액션스크립트 코딩의 전반에 걸쳐 사용될 뿐만 아니라 거의 모든 객체지향 프로그래밍 언어들에서 사용하고 있는 방법이기도 합니다.
한편, 변수중에는 함수 내부에서 사용되는 지역 변수가 있을 수 있고 클래스 전체에서 사용되는 전역변수가 있죠?
0 1 2 3 4 | function getHealthPoint():int{ var value:int; // 함수 내부에서만 사용할 목적의 지역 변수를 생성하였습니다. value = _hp + _itemBonus; return value; } |
지역변수는 이렇게 함수 내부에서 잠깐 쓰이고 소멸시키는 변수이므로 간략하게 표현하는 경향이 있습니다. 함수가 길지 않은 경우라던가 무슨 의미인지 함수 바깥에서 굳이 알 필요가 없다면 더욱 간단하게 한글자 변수도 사용할 수 있습니다. 우리가 for 문에서 흔히 사용하는 i 나 j 같은 것이 그에 해당하겠죠.
0 1 2 3 4 5 6 | package{ public class PlayCharacter{ public var name:String; // public 변수명은 그냥 평범하게 사용합니다. protected var _money:Number; // protected 와 private var _hp:uint; // private 에는 변수명 앞에 _ 가 붙어있습니다. } } |
전역변수는 다시 public, protected, private, internal 네 가지로 나뉘지만 internal 은 거의 사용하지 않으므로 제외하고 위와 같이 세 가지의 접근제한자를 살펴보겠습니다.
외부로 노출되는 public 전역변수는 가장 위에서 살펴본 것과 같이 일반적인 네이밍을 해 줍니다.
private 는 이 클래스 내부에서만 사용할 수 있는 전역변수이므로 빠른 코드 힌팅을 위해 _ 언더바를 가장 처음에 붙여 네이밍 하는 경우가 많습니다. 우리는 이런 네이밍에 이미 익숙하죠? AS2.0 때부터 사용하던 네이밍 방식입니다. 물론 AS2.0 때는 언더바가 붙든 아니든 public 이었지만 말이죠.
protected 는 상속 체인상에서만 사용할 수 있는 전역변수이므로 private 와 같은 스타일로 코딩하면 편리합니다.
이렇게 클래스의 private 변수에 언더바를 붙이는 방식은 사용하는 개발자도 있고, 그렇지 않은 개발자도 있습니다. 서로 의견이 다를 수는 있지만 이거 하나는 확실하죠. 코드 힌트를 받을 수 있는 에디터에서는 _ 를 타이핑 하는 순간 public 이 제외된 private, protected 멤버만 쫙~ 볼 수 있다는거!

FlashDevelop 에서의 코드 힌팅
* * *
상수의 네이밍 (언더스코어 표기법)
상수(const)는 변하지 않는 값입니다. 상수 생성과 함께 한번 설정한 값은 수정할 수 없습니다.
변수는 var 키워드로 생성하지만, 상수는 const 키워드를 이용해 생성합니다.
이러한 특성 때문에 상수는 변수와 확연히 구분되는 언더스코어 표기법(Underscore notation 또는 Underscore case)을 사용합니다.
0 1 | // MouseEvent 클래스의 상단에는 이와 같이 상수가 정의되어 있을 것입니다. static public const ROLL_OVER:String = "rollOver"; |
액션스크립트에서 상수를 표기할때 사용하는 언더스코어 표기법은 모든 문자열을 대문자로 작성하고 단어와 단어 사이는 언더바로 연결하는것이 일반적입니다.
* * *
함수의 네이밍 (캐멀 표기법)
함수의 네이밍은 기본적으로 변수의 규칙과 동일합니다. 생성자 함수 외에는 첫 글자를 소문자로 시작하고 언더바는 사용하지 않는것이 보통입니다.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package{ public class PlayCharacter{ public var name:String; protected var _money:Number private var _hp:uint; public function PlayCharacter(){ // 생성자 함수는 클래스의 이름과 동일해야 하기 때문에 예외적으로 첫 글자를 대문자로 사용합니다. } private function useWeapon():void{ // 일반 함수의 네이밍 } } } |
함수는 보통 어떤 행동을 묘사하는 경우가 많으므로 위의 예제코드 대로라면 “무기를사용” 한다라는 의미와 목적에 따라 단어를 조합해 사용하게 됩니다. 그리고 영어의 어순에 따라 weaponUse 보다는 useWeapon 과 같이 동사+명사의 순서로 조합사용하는 것이 좀 더 일반적인 형태 입니다.
물론 play() 와 같이 한 단어로 이루어진 함수명도 문제없습니다.
그러나 단어가 명사라면? 그러니까 name 이라든지 age 같은 것이라면 이것은 속성이 되야하는 것은 아닌가 생각해 볼 필요가 있습니다.
* * *
클래스의 네이밍 (파스칼 표기법)
클래스는 대문자로 시작하고 나머지는 소문자로 작성하되, 의미가 다른 단어가 나오면 첫글자를 다시 대문자로 작성합니다. 캐멀 표기법과 동일하지만 네이밍의 첫 글자가 대문자로 표기하는 이 방법을 파스칼 표기법이라고 부릅니다.
0 1 2 3 4 5 6 | package{ public class PlayCharacter{ // 클래스명의 첫 문자는 대문자 public function PlayCharacter(){ // 생성자 함수 } } } |
간혹 코딩시작한지 얼마 안되는 초보분들이 클래스명을 소문자로 시작하거나 _ 언더바 기호를 단어 중간 사용하는 경우를 볼 수 있는데, 클래스의 대문자 시작 규칙과 특수기호를 사용하지 않는 규칙은 반드시 지켜주는 것이 좋습니다. 이 규칙이 깨질경우 변수, 함수와의 구분이 어려워지고 코드의 가독성이 떨어지게 됩니다.
클래스명은 다른 한편으로는 데이터 형(type) 이죠. 우리가 var i:number 라고 하지 않고 var i:Number 라고 사용한다는 것을 기억하시기 바랍니다.
* * *
인터페이스의 네이밍
여러분이 인터페이스를 사용할 정도라면 표기법 정도는 이미 알고 계실테지만, 빠짐없이 모두 짚고 넘어가보자는 취지를 살려보겠습니다.
인터페이스 역시 클래스와 마찬가지로 데이터형(type)이 될 수 있고, 상속과 비슷한 implements (구현)을 통해 클래스를 확장하는 기능을 합니다.
인터페이스를 메소드 상속이라고 부르는 사람도 있죠? 상속과 비슷하지만 메서드를 구현하는것을 강제하기 때문인데요. 메서드가 기본적으로 동사형태를 띄고 있으므로 메서드를 강제한다, 또는 사용할 수 있다는 의미로 “~를 할 수 있는” 의 의미를 가진 able 을 접미사로 붙이게 됩니다.[02]
Java 인터페이스 역시 -able 을 붙이는 스타일이 일반적이고, 액션스크립트가 Java 로부터 많은 부분의 기원을 두고 있으므로 액션스크립트도 그런 스타일을 따르기도 합니다만, 액션스크립트는 그보다는 우리가 흔히 볼 수 있는 IEventDispatcher 에서 처럼 인터페이스 가장 첫 글자 앞에 대문자 I 를 붙이는 방법을 더 많이 사용합니다.
물론 IObserverble 과 같이 두 가지 방법을 모두 적용해도 무방합니다.
0 1 2 3 4 | package{ public interface IAttackable{ function attack():Damage } } |
이런식이 되겠네요.
* * *
그리고 단어 줄임 또는 단어 이니셜 사용
위에서 소개한 네이밍 규칙들을 모두 적용해보면, 변수나 함수의 길이가 길어지게 됩니다만,[03] 그렇다고 해서 단어를 약어나 이니셜을 과도하게 사용하게 되면 코드의 가독성이 떨어지게 됩니다.
“어차피 다른사람이 볼 코드도 아닌데 뭐” 라는 생각을 하고 계실지라도 말이죠. 정작 본인조차도 2주 후에는 알아볼 수 없는 코드가 되버립니다. 유지보수 효율성은 저 달나라로 가고 있습니다.
btn (button), mc (MovieClip), cfg (config), init (initialize) 같은 수준은 괜찮습니다. 줄인 단어일지라도 자주 사용되고 누가봐도 대부분 뜻이 통하면 사용에 지장이 생기지 않습니다.
무엇보다 과도하게 길어지지 않는 한도내에서 옆사람도 이해할 수 있도록 쉬운 영어로 풀어서 묘사적으로 네이밍 하는것이 기본이라 할 수 있습니다. 학교다닐때 영어공부를 열심히 하지 않으신 분은 인터넷 영어사전 하나 쯤 펼쳐놓고 코딩하는 자세가 좋을것 같습니다.
- 물론 액션스크립트는 uft-8 로 인코딩을 하므로 한글을 포함한 모든 언어의 문자열을 사용할 수 있으나 여러 가지 문제가 생길 수 있는 여지가 있으므로 영문 문자열로 네이밍을 제한하는 것이 좋습니다. 이에 해당하는 내용은 차후 별도의 포스트로 정리할 기회가 있을것 같습니다. [↑]
- Observer 패턴의 인터페이스로 able을 붙여 Observerable 이라고 네이밍 하는 식입니다. [↑]
- 상하로 늘어나진 않겠죠. 좌우로 늘어납니다. [↑]

Blog under the Creative Commons Attribution-NoDerivs 3.0 License
5월 29th, 2010 on pm 1:02
저도 첨엔 막 썼는데 ㅎㅎ
구글 코딩보면서 스타일이 많이 바뀌더라구요. 지금은 거의 글 내용대로 하는것 같네요.
초보에게 참 좋은 내용같습니다.
처음부터 습관을 들이는게 좋죠
5월 29th, 2010 on pm 7:37
액션스크립트에서는 자주 쓰이지 않아 이 포스트에는 언급하지 않았지만, MS 쪽에서부터 유래한 헝가리안 표기법도 있고…
함수 인자의 네이밍 방식 같은것은 개인마다 차이가 있는데다가 어떻게 작성하든 가독성에는 그다지 영향을 미치지 않기 때문에 역시 이 내용도 뺐습니다.
포스트 길이가 너무 길어지는것도 좀 문제라 말이죠.
말씀대로 네이밍은 누구나 가장 처음부터 올바르게 습관을 들이는것이 좋겠습니다. 현업에서 작업을 하는 사람들은 대부분 위와 같은 네이밍은 기본으로 사용하고 있기 때문에 이 규칙들을 지킨다면 어딜가서나 코딩 때문에 커뮤니케이션이 오류가 나는일은 거의 없겠죠 ^^
6월 10th, 2010 on pm 12:25
지금이야 저대로 쓰고있긴 하지만 처음에는 어떻게 쓰는지 몰라서
제대로 쓰지 못했었는데 초보분들이나 이제 언어를 배우시는 분들에게는
좋은 자료가 될거 같네요~
6월 10th, 2010 on pm 10:46
이 내용은 별로 어려운 내용도 아니니까 처음부터 알고 시작하면 좋겠지. ^^
6월 15th, 2010 on pm 6:04
플생사모 게시글타고 왔는데 완전 유용하네요. 이제 막 프로그램에 발을 들여놓은 초보입니다.
본업은 디자이너 ㅎㅎ
완전 도움되는 글이네요. 모셔갑니다. ^^
6월 16th, 2010 on pm 1:46
본문 전체를 퍼가지 마시고, 링크만 가지고 가 주세요.
부득이 전체를 스크랩 하고 싶으실 경우는 비공개 글로 해 주시면 감사하겠습니다.
종종 놀러오세요 ^^
8월 6th, 2010 on pm 12:30
정말 잘 읽고 갑니다~ㅠ
하루에 두 세번은 꼭 들렷다 가네요
으허허허~
8월 6th, 2010 on pm 12:45
두세번씩이나 들릴것 까지야 ㅎㅎ