coding

변수명 규칙 + 함수 앞에 언더바를 붙이는 이유

사과키라임파이 2022. 4. 22. 10:49

레퍼런스 코드 리뷰를 하다가 함수 명 앞에 _ 언더 바가 있는 코드를 발견했다. 왜일까?

var printArray = function() {
  function _print(targetArr) {  //왜 print가 아니라 _print로 썼을까?
   //코드생략
    }
  }
  _print(arguments[0]);
};

코딩 컨벤션(스타일 가이드)

함수명 앞에 _ 언더바를 붙여주는 것은 일종의 코딩 컨벤션 이다.

코딩 컨벤션이란 프로그래밍 언어별로 권장하는 코딩 규칙(스타일)이다. 예를 들면 구글에서 권장하는 방식은 링크를 통해 확인할 수 있다. 반드시 따라야 하는 룰이라기 보다는 이해하기 쉬운 코드를 작성하기 위한 가이드 정도로 참고해서 활용할 수 있다.

 

https://google.github.io/styleguide/jsguide.html

보통은 1) 지역변수(내부 사용 전용으로 사용범위를 보여 줌) 혹은 프라이빗 변수나 2) sub function일 경우, 혹은 3) 키워드에 해당하는 단어를 변수로 쓰고 싶을 경우

이름앞에 언더바를 써 주는데 이는 자바스크립트의 경우 접근제한자(public, private)가 없기 때문에 변수명으로 사용범위를 나타내는 것. 

 

그렇다면 일반적인 함수 이름에 관한 가이드는 대체로 어떤 게 있을까?

함수 이름

  • 동사를 사용하여 작성한다. (ex. getElement(), setOption()...)
  • Private 메소드 인 경우 메서드 이름 앞에 언더스코어(_)를 사용한다. 
  • 카멜 표기법을 준수한다. 복합어 이름은 첫 번째 단어를 소문자로 작성하고, 두 번째 이상의 단어 첫 글자를 대문자로 작성하여 단어를 구분한다.
  • 함수 이름의 첫 글자로 연속된 두 개의 언더스코어(__) 기호와 달러 기호($)는 사용하지 않는다.
  • Getter, Setter 메서드는 반드시 'get + 멤버변수 이름', 'set + 멤버변수 이름' 형식으로 작성한다. getElement(); isChecked(); setOption();
  • 이벤트 핸들러 메서드는 _on + 이벤트명으로 시작하도록 정의한다. 

 

 

 

 

함수이름 앞에 언더바(_)를 쓰는 이유

 

함수이름 앞에 언더바(_)를 쓰는 이유

레퍼런스 코드 리뷰를 하다가 함수 명 앞에 _ 언더 바가 있는 코드를 발견했다. 왜일까? var printArray = function() { function _print(targetArr) { //왜 print가 아니라 _print로 썼을까? //코드생략 } } _pri..

seoramyeon.tistory.com

 


가장 큰 목적은 스코프 구분에 따른 표시입니다. 개발언어는 해당 콘텍스트에 선언하여 사용되는 고유의 스코프영역(scope)을 가지고 있습니다. 스코프는 각각의 네임으로 참조할 수 있는 범위인데 이를 구분하기 위한 목적으로 언더바가 많이 사용됩니다. 예를들어 아래를 봐주세요.

 

 

# 언더바 _ 기호를 사용한 변수 또는 함수, 메소드 사용 예제먼저 클래스를 선언하였고 내부에는 두개의 함수가 존재합니다.

class NameA():
  def _formatType():
    return 'A'
  def getName():
    return self.name


위 코드에서 선언된 클래스 NameA는 두개의 메소드를 가지고 있습니다. 이 중에서 위에 선언된 _formatType은 앞에 _ 기호를 가지고 있어 클래스 내부 스코프 영역에서만 사용될 것임을 매우 직관적으로 개발자에게 알려줍니다. 반대로 getName()의 경우 다른 스코프에서도 접근이 가능한 메소드임을 한 눈에 판단할 수 있습니다. 다른 예제를 하나 더 볼까요?

showMsg = function(name) {
  return 'My Name is ' + _checkName(name);

  function _checkName(a) {
    return a ? a : 'Empty'
  }
};

이번 예제 역시 비슷합니다. 함수 _checkName()은 showMsg()의 내부에서 선언되고 사용될 것이기에 앞에 _ 기호를 사용하여 다른 함수와 구분하도록 하였습니다.

변수의 경우도 다르지 않습니다. 아래 예제를 보면 함수 내부의 변수에 일부를 _ 기호를 사용하여 다른 변수와 구분하였습니다.

이처럼 내부에 사용될 변수들과 외부에서도 호출되거나 사용될 변수들은 각각 구분하여 다른 위치에 선언하는 것이 일반적입니다. 함수 내부에서도 그룹화하여 관리하는 것이 유지보수 및 관리차원에서 더욱 효과적일 수 있습니다.

 

 

https://webisfree.com/2017-11-06/%EC%BD%94%EB%93%9C%EC%9D%98-%EB%B3%80%EC%88%98%EB%82%98-%ED%95%A8%EC%88%98-%EB%93%B1%EC%97%90-%EC%96%B8%EB%8D%94%EB%B0%94%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94

 

코드의 변수나 함수 등에 _ 언더바를 사용하는 이유는?

개발 언어의 클래스 및 함수를 보면 _ 언더바를 사용한 코드를 쉽게 볼 서 있습니다. 왜 이렇게 이름 앞에 _ 기호를 추가할까요? 그 이유 및 목적에 대하여 간단히 알아봅니다.가장 큰 목적은 스

webisfree.com

 

 

https://bottom2top.tistory.com/4

 

변수명에 관하여

개발을 처음 접할때는 변수라는 개념부터 잘 와닿지 않았다. 일상에서 사용하는 변수라는 단어는 한자의미 그대로 "변할 수 있는 수" 였다. 하지만 프로그래밍에선 변수(Variable)에 [저장공간]의

bottom2top.tistory.com

 

개발을 처음 접할때는 변수라는 개념부터 잘 와닿지 않았다.

일상에서 사용하는 변수라는 단어는 한자의미 그대로 "변할 수 있는 수" 였다.

하지만 프로그래밍에선 변수(Variable)에 [저장공간]의 개념이 붙는다.

저장공간(메모리) 안에 담기는 수가 변할 수 있기 때문에 변수라고 부르는 것이다.

메모리에 담기는 변하지 않는 수는 상수라고 부른다.

 

 

변수명의 기본 규칙

컴파일러에서 제한하는 변수 명명 규칙

  • 대소문자는 구분되며 길이의 제한은 없다.
  • 예약어를 사용해서는 안 된다.
  • 숫자로 시작하면 안 된다.
  • 특수문자는 _  $ 만 허용한다.

JE22 에서 권장하는 변수 명명 규칙

  • 변수는 첫 글자의 소문자로 시작하는 명사로 짓는다.
  • 여러 단어로 이루어진 이름인 경우 각 단어의 첫 글자를 대문자로 한다. (카멜 표기법 사용)

예시.

//예약어를 사용할 수 없다.
var true: Boolean = false

//숫자로 시작할 수 없다.
var 1stUserName: String = "robin"

//변수명은 첫글자의 소문자로 시작하는 명사로 짓는다.
//여러 단어로 이루어진 이름인 경우 각 단어의 첫 글자를 대문자로 한다.(CamelCase)
var userAge: Int = 10

예약어

자바의 예약어

abstract assert boolean break byte case catch
char class const continue default do double
else extends false final finally float for
goto if implements import instanceof int interface
long native new null package private protected
public return short static super switch synchronized
this throw throws transient true try void
volatile while          

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=suboo00&logNo=220585655351 

 

2-4 변수의 이름 규칙, 자료형의 표현 방식

2. 변수와 자료형2-4 변수의 이름 규칙, 자료형의 표현 방식새로 생긴 에디터가 적응이 안 되네요;; A. 변...

blog.naver.com

 

좋은 변수명을 짓기 위한 몇 가지 방법

변수의 목적을 분명히 하도록 이름짓기

변수명은 하나의 목적을 표현하도록 변수가 가지는 의도를 명확하게 밝히는 것이 좋다.

 

예시.

//findItem의 인자 i의 의도를 바로 알기 어렵다.
fun getItem(i: Int) {
//생략
}

//인자 i의 의도를 변수명으로 정확히 나타낼 수 있다.
fun getItem(itemIndex: Int) {
//생략
}
//page와 currentPage가 이렇게 같이 있다면 page의 의도가 애매해지기때문에 좋은 변수명이라고 하기 어렵다.
var page: Int = 30
var currentPage: Int = 10

 

협업을 염두해서 이름짓기

private void validateNumericPosition(String[] expressionAsArray) {
    for (int i = 0; i < expressionAsArray.length; i += 2) {
    	...
    }
}

위 코드에서 2가 의미하는게 뭘까? 다른 사람이 봤을 때 i += 2 를 통해 어떤 처리를 하는지 파악하려면 코드를 분석해야 한다.

private void validateNumericPosition(String[] expressionAsArray) {
    int numberIndex = 2;
    for (int i = 0; i < expressionAsArray.length; i += numberIndex) {
    	...
    }
}

2에 numberIndex 라는 의미 있는 변수명을 붙여주면 숫자만 걸러내기 위한 식인지 알 수 있다.

맥락을 고려해서 짓기

//정확한 의도를 담으려는 의도는 좋지만 굳이 User 클래스의 속성값에도 user라는 키워드가 들어갈 필요는 없다.
data class User(
	var userName: String,
	var userAge: Int
)

//개선
data class User(
	var name: String,
	var age: Int
)

위의 클래스는 읽어보자면 사용자의 사용자명, 사용자의 사용자 나이 이다.

변수의 의도를 분명히 나타내도록 최대한 자세하게 적는 것은 좋지만 과하다면 오히려 독이된다.

의도를 분명히 나타내려다보니 변수명이 너무 길어진다면 약속에 따라 축약어를 사용하는 것도 좋은 방법이다.

 

Boolean 변수에 대하여

Boolean은 true 혹은 false를 표현한다.

즉, 맞다 혹은 아니다의 상태만 표현하는 변수이다.

그렇기 때문에 Boolean의 변수명은 맞다 혹은 아니다로 대답할 수 있도록 지어야한다.

그래서 보통 Boolean 변수명은 be동사 is, 조동사 has, can, should, 동사원형 includes, allows등을 앞에두는 등 의문문 형식의 변수명을 사용한다.

하지만 done, error, ok 등 성공과 실패의 의미를 나타내고자 한다면 found, processingComplete등 무엇을 성공했는지에 대해 구체적인 설명이 되는 변수명을 사용하는 것이 좋다.

 

Boolean 변수는 부정형으로 만들지 않는것이 좋다. 부정을 부정, 부정을 긍정하는 코드는 가독성이 떨어지기 때문이다.

예시.

//해석: 못찾지 않았다.
var notfound: Boolean = false

//해석: 찾았다.
var found: Boolean = true

 같은 의미지만 긍정의미에 대해서 구분하는 편이 더 읽기 좋다.

 

Boolean은 is, 조동사, 동사원형을 사용하여 보통 변수명을 짓지만 경우에 따라 접두어를 생략하는 편이 더 이해하기 쉬운 경우가 있다.

 

예시.

var isComplete: Boolean = true
var complete: Boolean = true

 

Collection 변수에 대하여

val userList: List<User> = listOf<User>()

위와같이 변수명에 자료형이 들어가게 된다면 자료형이 바꾸는 상황(예를들어 List -> Set)에서 변수명도 변경해야하는 번거로움이 생긴다. 

때문에 Collection 자료형은 아래와 같이 복수형으로 표현하는것이 좋다.

val users: List<User> = listOf<User>()

 

참고:

opentutorials.org/module/1226/8103

woowacourse.github.io/javable/post/2020-04-24-variable_naming/

soojin.ro/blog/naming-boolean-variables

 

 

 

https://velog.io/@g0garden/JS007-%EB%B3%80%EC%88%98%EB%AA%85%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A7%80%EC%96%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

 

 

[JS007] 변수명을 어떻게 지어야 할까?

팀에서 정한 컨벤션(규칙)을 따르는게 제일 베스트이다. 없다면 보편적으로 권장되는 규칙들을 따르면 된다. 1.변수, 함수명은 카멜케이스 첫글자는 소문자, 단위로 첫글자 대문자를 사용, 중간

velog.io