티스토리 뷰

코드리뷰 시리즈

프로그램 코드에서 이름이 글자수로 따지면 몇 퍼센트나 될까? 놀랍게도 80% 이상이다[각주:1]. 그럼 이름이 코드의 가독성에 미치는 영향은 어느 정도일까? 놀라겠지만 필자는 90% 이상이라고 확신한다. 왜냐고? 클래스 이름, 메소드 이름, 변수 이름이 코드를 이해하는데 얼마나 중요한가는 사실 남의 코드를 읽어본 사람이라면 누구나 느끼게 된다. 그러나 단순히 이해하는데 도움을 주는 것보다 훨씬 많은 역할을 할 수 있다. 변수 이름은 자료구조를 나타낼 수도 있고 메소드 이름은 함수가 하는 일을 알려준다. 또한 적절한 변수 이름을 이용해서 어떤 객체에서 무슨 일이 일어나는지를 알 수 있다. 이러한 도움은 있으면 좋은 정도가 아니라 코드에서 반드시 지켜야 할 필수 요건이다.

Student st; Book b;
st.lend(b);   // 학생 st가 책 b를 대출한다.
st.addBookshelf(b); // 학생 st가 책 b를 책꽂이에 저장한다. 

자바에서 모든 이름의 규칙은 여러 단어를 연결할 때 단어의 시작 글자만 대문자로 쓰는 Camel Style을 따른다.[각주:2]

  • 처음 시작은 소문자로
  • 뒤에 단어 시작은 대문자로 

또한 클래스 이름과 메소드, 필드 이름의 규칙은 다음과 같다. 

  • 클래스 이름 : 대문자로 시작하고 명사를 가지며 알아볼 수 있는 단어를 써야함 (지나친 약어보다는 읽을 수 있는 정상 단어)[각주:3]
  • 메소드 이름 : 소문자 동사로 시작한다. 메소드는 클래스 객체인 주어가 하는 일(동작)을 나타낸다. 

이름을 붙일 때 원칙은 편리성과 충분한 정보의 제공 두가지다. 가능하면 짧고 간결하고 기억하기 쉬운 이름이 코딩할 때 좋다. 굳이 중요하지도 않은 변수 이름을 거창하게 붙여서 타이핑 시간만 늘릴 이유가 없다. 그런가 하면 반대 측면으로 이름은 코드를 읽을 때 무슨 일을 하고 무슨 값을 가지고 있는지 알려주는 중요한 역할을 한다. 변수 이름, 메소드 이름이 잘 붙어 있으면 코드를 볼 때 파악하는 속도가 훨씬 빨라진다. 그러므로 이 두 가지의 트레이드오프를 이해하고 균형을 가지는 것이 이름을 잘 붙이는 테크닉이라고 할 수 있다.[각주:4]

메소드 이름

메소드 이름은 가능하면 간결하게 한 단어 동사로 정하고 하나의 프로젝트 안에서 모든 클래스에 대해 같은 것을 사용하는 것이 좋다. (클래스들이 같은 이름의 메소드를 가지는 것은 문제가 안되고 오히려 바람직하다.)

   예: read, print, compare, contains, , find, ... 

즉 일관성이 중요하다. 그리고 클래스 이름은 메소드명 굳이 뒤에 붙일 필요가 없다. 어차피 메소드가 호출될 때 클래스 또는 객체가 점 앞에 나타나서 구분되기 때문이다. 그러나 한 클래스 안에서 여러 개의 print 메소드가 있거나 같은 메소드 이름으로 다른 대상(목적어)에 적용해야 한다면 구별할 단어를 뒤에 붙인다.[각주:5]

printLend, compareAll, ...

마찬가지로 boolean을 돌려주는 메소드는 is나 has를 앞에 붙여서 상태나 조건을 검사하는 메소드임을 나타내는 것이 좋다.

isLogin, isLongerThan, hasAccount, hasLog, ...

클래스 필드의 이름

클래스 필드의 이름은 소문자 명사를 사용한다. 필드 이름으로 많은 것을 나타내야 한다.

(1) 필드와 변수 이름도 메소드와 마찬가지로 일관된 이름을 쓰는 것이 좋다. 흔히 개발자들은 자신이 즐겨 사용하는 변수 이름이 있다.

count, id, index, maxCount, url, user, ...

(2) 변수 이름에 많은 것을 나타내야 한다. 단수인지 복수인지, 리스트인지, 어떤 클래스 참조변수인지가 이름으로 표시되어야 한다.

   book, user, id, url, ...

구별이 필요할 때 뒤에 단어(객체 종류, 무슨 리스트인지, 무슨 max인지 등)를 붙인다.

userIndex, userList, bookList, maxUserSize, maxIdLength, 

(3) boolean 타입은 구별이 중요하므로 필드 앞에 b를 붙이기도 한다. 

bEven, bOrdered, bCheckedIn, ...

(4) 이름에서 단복수는 일관되게 구분 (여러 개면 s 붙이고 한 개면 단수로)

   예: printAllBooks, findBook, getLendStudents(또는 getLendStudentList), ...

지역변수 이름

지역변수는 짧게 약어로, 필드는 풀단어로 쓴다. 특히 지역 변수 중 임시값을 나타내는 int와 String 타입은 간단한 이름을 쓴다

n, str, kwd, cnt, id, index, ...

이 때 한 소스 파일 안에서 다른 타입을 같은 이름으로 쓰지 않는다. 예를 들어 어디서는 n이 int로 쓰이고 다른 메소드에서는 String으로 쓰이는 것은 코드의 가독성을 떨어뜨린다. 예를 들면 i, j, k, n, m, num 등은 int 값에 쓰이고 s, str, kwd 등은 스트링, p, q, r 등은 객체 참조 등 일관된 규칙이 있는 것이 좋다. 보통 회사에서는 그 회사의 naming 규칙이 있어서 그것을 따르게 되어 있다.

변수 이름도 일관성이 중요하다. 어디서는 count라고 쓰고 어디서는 cnt라고 쓴다거나 size와 sz를 섞어쓰는 것은 코드 작성할 때도 헷갈리고 보는 사람에게도 혼란을 준다. 특히 잘못된 스펠링을 써서 그 이름을 다시 쓸 때 기억이 나지 않는 일은 피해야 한다. 

배열이나 리스트의 위치를 나타내는 값을 인덱스라고 하고 이름으로 구분되는 것이 좋다. 루프의 변수는 i, j, k를 쓰는 것이 좋다. 굳이 다른 이름을 쓴다면 이유가 있어야 한다.

필드의 이름과 지역변수의 이름은 구분하는 것이 좋지만 필요한 경우는 name, id, index 등 필드에 있는 이름을 지역변수로 다시 쓸 수도 있다. 단 이런 경우 이름이 충돌이 일어나므로 필드는 this.을 붙여 구분해 주어야 한다.

이름 붙이는 일반적인 규칙 - 자바 코딩의 기술에서 발췌

자바의 이름 규칙을 따라라

자바는 영어 단어를 이용하여 Camel 스타일로 이름을 붙이라고 한다. 단어 첫 글자를 대문자로 써서 이어붙이는 것으로 첫단어는 소문자로 시작한다. 예를 들면 다음과 같은 형태가 된다.

milesPerHour, serialNumber, newSerialNumber
midTermScore, nameLecture, nameProfessor

한 글자 이름을 피하라

프로그램을 처음 짜는 사람들이 제일 많이 쓰는 이름이 영어 한 글자 a, b, c 같은 것이다. 여기다 a2, a3, b2, b3 같이 숫자 붙여서 쓰기도 하고 aa, bb 이런 이름을 붙이기도 한다. 이것은 프로의 세계에서는 절대로 쓰지 말아야 하는 이름들이다.

한 글자 이름은 사용 범위가 짧은 경우에는 적합하다. 블록 내에서 사용하는 이름이라면 한 글자로 간단히 붙이는 것이 나쁘지 않다. 대표적인 것이 for 루프의 인덱스 변수다.

for (int i : numbers)

약어를 사용하지 마라

이 규칙에서는 약어를 쓰지 말라고 한다. 약어란 쓰는 사람마다 다르고 널리 알려져 있지 않은 약어를 이름에 사용하면 자칫 쓴 사람만 아는 이름이 될 가능성이 크다는 것이다. 자바는 변수 이름이 길어지는 것을 좋아하는 언어다. 예를 들면 다음과 같이 약어로 쓴 이름은 full 영단어를 써서 바꾸어 주는 것이 좋다.

dir2 -> newDirectoryStream
fLn -> fileLine
inBuf -> inputBuffer

임의로 만든 약어는 많은 경우 다른 사람에게 이해되기 어렵고 머릿속에 남지 않는다. 그러면 그저 암호같은 알파벳 글자가되고 만다.

그러나 타입을 나타내는 str이나 n 같은 머릿글자는 나쁘지 않다. 또한 공인된 약어의 경우는 그대로 사용해도 된다. 그런데 이 때는 첫글자만 대문자로 쓰는 방법이 눈에 거슬릴 수가 있다. 그래서 다음과 같이 모두 대문자로 쓰는 것을 권장하기도 하는데 좋은 방법이라고 생각된다.

lastHttpRequest -> lastHTTPRequest
strDns -> strDNS

이렇게 이름을 붙여주면 코드를 읽을 때 그 변수가 어떤 역할을 하는지 분명해지고 가독성을 크게 올려줄 수 있다. 새로 생긴 계열의 변수라면 숫자 2를 뒤에 붙이는 대신 new처럼 의미를 가진 단어를 앞에 붙이라고 한다.

여기에 덧붙여 가끔 학생들이 사용하는 한국어 음을 딴 이름들이 있는데 이것도 정식으로 발표하는 코드라면 금해야 할 것이다. Hapgye, Jango, Yeyak 이런 이름을 쓰는데, 개발자의 세계에서는 받아들여지기 어렵다.

의미없는 단어를 쓰지 마라

잘못된 이름을 붙였을 때 코드를 이해하기가 얼마나 어려운가는 다른 사람들의 코드를 읽어보면 이해가 된다. 우리가 작성한 사람의 생각을 따라가면서 아 이렇게 문제를 풀었구나 하고 이해해야 하는데 그것을 위해서는 여러 줄의 설명이나 코멘트보다 잘 붙인 이름 하나가 효자 노릇을 한다.

그런데 이름을 잘못 사용하면 오히려 도움이 되기보다 방해가 되는 경우가 있다. 다음 코드는 스택 두 개를 이용한 큐 구현 예제다. 여기서

void enq(elem item) {
	if (in.is_full()) {
		printf("ERROR: QUEUE full\n");
		...
	}
	in.push(item);
}

이것을 다음과 같이 바꾸면 훨씬 이해하기 쉬운 코드가 된다. 일단 이름을 약어 대신 풀 단어로 쓰면서 알아보기 쉬워지고 in이라는 애매한 변수 이름으로 인해 뭔지 잘 모르겠던 코드가 훨씬 알아보기 쉬워진다.

void enqueue(element item) {
	if (inStack.is_full()) {
		printf("ERROR: QUEUE full\n");
		...
	}
	inStack.push(item);
}

그 분야의 용어를 찾아보고 사용하라

객체지향 프로그램은 실생활에서 사용되는 개념을 그대로 클래스 이름 메소드 이름에 사용하는 경우가 많다. 예를 들어 도서 대출 시스템이라면 도서관에서 사용하는 용어들이 있다.

borrower, reader, lending, borrow, due date, late,
borrowing process, automatic renewal, ordered, reserved

사실 소프트웨어를 설계할 때 도서관 대출이 어떤 방식으로 이루어지는지 미리 조사할 필요가 있다. 이런 사전 조사에서 영어로 된 문서를 참조하여 관련 단어들을 모아 놓으면 객체를 설계할 때나 코딩할 때 편리하다. 관련된 단어를 찾는 것은 구글을 이용하면 매우 쉽다. 예를 들어 구글에서 library lending 이렇게 쓰면 관련 글이 나오고 그 중에 적당한 것을 찾아 용어들을 정리하면 된다.

  1. void int new for 같은 키워드와 기호 ( ) = < { 등을 빼면 모든 것이 이름이다. 물론 이 중에는 라이브러리의 클래스나 메소드 이름이 상당 부분이고 프로그래머가 직접 붙인 이름의 비율은 그 반 정도일 것이다. 그러나 그것만 해도 엄청나게 중요함을 알 수 있다. [본문으로]
  2. C 언어는 이름의 여러 단어를 밑줄로 연결하는 snake_style 규칙을 따른다. [본문으로]
  3. 클래스 이름은 사실 프로그램 코드에 대해 코드리뷰나 토론을 할 때 가장 자주 불려지는 이름이다. 그러므로 입에 붙는 이름이어야 한다. [본문으로]
  4. 물론 영어 단어를 잘 알아야 하고 프로그램이 하는 일에 대한 이해와 그것을 잘 표현하는 능력 등은 개발의 경험과 경륜에 의해 쌓이는 것이다. 그래서 프로그램 개발할 때 혼자 하지 않고 몇명이 같이 이야기하면서 클래스 이름, 변수 이름, 메소드 이름을 어느 정도 정하는 단계가 "설계" 과정이다. 이것이 코딩만큼 중요하다는 것은 소프트웨어 개발자라면 누구나 이해하고 있을 것이다. 초보 개발자는 프로그래밍 연습을 하는 단계이므로 이러한 규칙들을 숙지하고 자기 프로그램에 최대한 적용해 보려고 노력하고, 다른 사람의 코드를 많이 읽고 좋은 방식을 흉내내고, 기회가 될 때마다 자기 코드를 다른 사람에게 리뷰 받아서 고칠 부분을 찾고 연습하는 것이 필요하다. [본문으로]
  5. 한가지 더 고려해야 될 점은 메소드가 매개변수 타입이 다르면 같은 이름을 쓸 수 있다는 점이다. (함수 오버로딩) 매개변수가 일종의 목적어 역할을 하므로 굳이 이름에 그것을 표시하지 않아도 되는 경우도 있다. [본문으로]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함