JAVA 변수명 네이밍
사람들은 읽기 좋은 코드를 좋은 코드라고 말한다.
변수, 메소드, 클래스 등의 이름이 일관성이 없고 쓰임을 분명하게 나타내지 않으면 어떨까?
코드의 유지보수가 어려워진다.
- 이름만 보고 쓰임을 알 수 있으면, 코드를 읽고 분석해야 하는 불필요한 과정들이 필요하게된다.
- 좋은 이름을 지으려면 시간이 필요하지만, 좋은 이름으로 절약하는 시간이 훨씬 더많다.
나이상태를 저장하는 변수를 선언해보자.
int a = 24;
int age = 24;
두 변수 모두 나이정보를 저장하는 변수이다.
age
의 경우는 변수를 보고 바로 나이를 저장하는 변수임을 알 수 있다.
a
의 경우 무엇을 의미하는지 알기 위해서는 반드시 코드 분석과정을 거쳐야한다.
쓰임을 분명하게 나타내는 변수이름을 작성하여 코드를 분석하는 과정을 생략할 수 있다.
협업자에 대한 배려가 필요하다.
- 협업자와 함께 개발을 하는 경우에는 이름을 통해 그것이 무엇을 의미하는지 나타내야한다.
- 그러므로 변수의 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하는 것이 좋다.
프레임워크마다 코드컨벤션이 달라지긴 하지만,
보통 자바는 오라클의 자바 코드컨벤션을 따른다.
코드컨벤션이란?
-읽고, 관리하기 쉬운 코드를 작성하기 위한 일종의 코딩 스타일 규약이다.
기본적인 변수명 네이밍 컨벤션
컴파일러에서 제한하는 변수 명명 규칙
- 대소문자는 구분되며 길이의 제한은없다.
- 예약어를 사용해서는 안된다.
- 숫자로 시작하면 안된다.
- 특수문자는 ‘_’ 와 ‘$’ 만 허용한다.
JE22에서 권장하는 변수 명명 규칙
- 변수는 첫 글자의 소문자로 시작하는 명사로 짓는다.
- 여러 단어로 이루어진 이름인 경우 각 단어의 첫 글자를 대문자로 한다. -> 카멜 표기법
String userName;
좋은 변수명 짓기
의도를 분명히 밝혀 이름을 짓기
- 따로 주석이 필요하면 의도를 분명히 드러내지 못했다는 의미이다.
- 변수 이름은 변수가 표현하고 있는 것을 완벽하고 정확하게 설명해야 한다.
- 이름은 가능한 구체적이어야한다. 모호하거나 하나 이상의 목적으로 사용될 수 있는 일반적인 이름은 좋지 않은 이름이다.
Set<Square> findSquaresToRemove(Squar s) {...}
s
라는 이름을 보았을때 String
의 s인지 square
의 s인지 바로 알 수 없다.
Set<Square> findSquaresToRemove(Squar squar) {...}
squar
라고 변경함으로써 이름을 통해 적절한 의미를 나타내줄 수 있다.
협업을 염두해서 짓기
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
라는 의미있는 변수명을 붙여주어 숫자만 걸러내는 식이라는것을 알 수 있게 된다.
맥락을 고려해서 짓기
이름이 지나치게 짧을 경우 변수의 용도를 알기 어렵다.
- 의도가 불분명한 짧은 이름보다는 의미있는 맥락이 있는 긴 이름이 좋다.
- 그러나 쓸데없이 구구절절한 이름은 오히려 독이된다.
public class User{
String userName;
int userAge;
...
}
위 코드에서 클래스의 이름을 보면 user
의 정보를 담는것을 알 수 있다.
굳이 멤버변수의 이름을 userName
, userAge
로 작성할 필요가 없다.
public class User{
String name;
int age;
...
}
user
를 붙이지 않아도 클래스의 이름을 보며 충분히 정보를 전달할 수 있다.
boolean 변수의 네이밍
done
,error
,found
,success
,ok
와 같은 성공함을 의미하는 구체적 이름이 있다면 다른 이름을 사용하는 것이 좋다.- 참이나 거짓의 의미를 함축하는
boolean
변수의 이름을 사용한다.
ex->statsuOK
,sourceFileAvailabble
not
보다는is
를 붙인 변수명을 짓는다. 그러나 접두어가 없는 이름이 읽고 이해하는데 더 쉬운 경우도 있다.
메소드가 여러번 호출된 한눈에 보기 힘든코드
변수에 일부 함수를 호출한 결과값을 담아서 길이를 줄여준다.
private static final String FORMAT_SYMBOL = "//(.*)\\\\n(.*)";
public static List<String> customSplit(String input) {
Matcher matcher = Pattern.compile(FORMAT_SYMBOL).matcher(input);
if (matcher.find()) {
return Arrays.asList(matcher.group(2).split(Pattern.quote(matcher.group(1))));
}
...
}
private static final String FORMAT_SYMBOL = "//(.*)\\\\n(.*)";
public static List<String> customSplit(String input) {
Matcher matcher = Pattern.compile(FORMAT_SYMBOL).matcher(input);
if (matcher.find()) {
String splitSymbol = matcher.group(1);
String content = matcher.group(2);
return Arrays.asList(content.split(Pattern.quote(splitSymbol)));
}
...
}
변수 이름에 자료형이 들어간다면?
private List<Double> numberList = new ArrayList<>();
private List<String> operatorList = new ArrayList<>();
List 대신 다른 자료형이 들어간다면 변수의 이름은 바뀌어야한다.
변수 이름에 자료형을 쓰지 않아도 타입을 통해 충분히 어떤 변수인지 파악이 가능하다.
private List<Double> numberList = new ArrayList<>();
private List<String> operatorList = new ArrayList<>();
댓글남기기