일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- mysql
- Blue-Green
- useMutation
- 어댑티브 해시 인덱스
- B+TREE
- 회고
- 계층별 구조
- DeleteAll
- useQuery
- InnoDB 버퍼 풀
- 멀티쓰레드 프로그래밍
- java
- jacoco
- 기능별 구조
- ci/cd
- 메서드명
- 주간회고
- BalancedTree
- 우테코
- 블로그 병행
- 도커
- SQL 실행순서
- N+1
- 백기선 스터디
- 클래스
- 월간회고
- 카카오 2차 코딩테스트
- 프리코스
- db
- Jenkins
- Today
- Total
Haneul's Blog
[클린 코드] 좋은 코드를 위한 자바 변수명, 메서드 네이밍 본문
우테코의 프리코스를 참여하면서 문제를 다 풀고 조금 더 개선할 부분이 없을까 찾아보다가 많은 분들이 자바 변수명 및 메서드의 네이밍을 짓는데 많은 고민을 하는 것을 보고 이와 관련하여 정리하면 좋겠다고 생각하였습니다.
저 또한 개발을 할 때 가장 어려워 하는 것이 변수명이나 메서드의 네이밍을 정하는 것인데, 기존에 제가 알고 있던 것과 좋은 코드를 위한 네이밍은 어떻게 해야 하는지를 비교하면서 글을 정리해보겠습니다.
자바 변수명 네이밍 규칙
기본적으로 제한하는 변수 명명 규칙
자바에는 기본적으로 제한하는 변수 명명 규칙이 있습니다. 이를 지키지 않으면 컴파일 자체가 되지 않기 때문에 아마 이 글을 읽지 않아도 자바로 개발을 해보셨다면 몸으로 자연스럽게 체득했을 수도 있습니다. 그 규칙은 아래와 같습니다.
- 대소문자는 구분되며 길이의 제한은 없습니다.
- 예약어를 사용해서는 안 됩니다.
- 숫자로 시작하면 안 됩니다.
- 특수문자는 _ 와 $ 만 허용합니다.
그리고 아래는 컴파일은 되지만 JE22에서 권장하는 변수 명명 규칙입니다.
- 변수는 첫 글자의 소문자로 시작하는 명사로 짓습니다.
- 여러 단어로 이루어진 이름인 경우 각 단어의 첫 글자를 대문자로 합니다. (카멜케이스)
좋은 변수명 짓기
위에서 언급한 기본적으로 제한하는 변수 명명 규칙은 필수로 지켜야하는 말 그대로 '규칙'이라고 생각하시면 됩니다.
반면에 여기서 언급할 내용은 어떻게 좋은 코드를 위해서 변수명을 지어야 하는지와 협업을 위해 다른 사람들이 내 코드를 보았을 때 한 눈에 이 변수가 어떤 곳에 사용될 것인지, 어떤 역할을 하는지를 알 수 있게 해주는 방법이라고 할 수 있습니다.
이는 필수 조건은 아니지만 필수 조건이라고 생각을 하고 지으면 협업에 있어서 많은 도움이 될 것 같습니다.
의도를 분명히 밝혀 이름 적기(사실상 협업을 염두에 둠)
많은 분들이 코드를 설명하기 위해서 주석을 달아 두는 경우가 많습니다. 하지만 정말 좋은 코드는 주석을 달지 않더라도 바로 이해할 수 있는 코드이고, 이를 위해서는 변수명은 변수가 표현하고 있는 것을 정확하게 설명해야 하기 때문에 변수명이 길어지더라도 구체적으로 적어야 합니다.
예를 들어서 1,2,3,4,5를 모두 더한 값을 저장해두는 변수를 만들고 싶다고 가정하면 변수명을 짧게 하기 위해 's'라는 변수로 정했을 때는 뒤의 로직을 살펴봐야 s가 어떤 역할을 해주는 변수인지를 알 수 있습니다. 반면에 변수를 'sum'이라고 했다면 뒤에 로직을 보기도 전에 '아 이 변수에는 어떤 값을 계속 더해주는 변수구나!'라고 유추할 수 있고 뒤의 코드를 읽기에도 수월해질 수 있습니다.
public class CleanCode {
public static void main(String[] args) {
// 좋지 않은 예시
int s = 0;
for (int i =1; i <= 5; i++) {
s += i;
}
// 좋은 예시
int sum = 0;
for (int i =1; i <= 5; i++) {
s += i;
}
}
}
위의 코드는 정말 간단한 예시라서 둘 다 보기 편할 수도 있습니다. 하지만 코드가 길어진다면 변수명을 막 지었을 때 협업을 하면 민폐가 될 수 있고, 나중에 내가 다시 코드를 보더라도 이게 무슨 역할을 하는 변수였는지도 까먹을 수 있습니다.
따라서 꼭 변수명을 지을 땐 의도를 밝히고, 개인 프로젝트라고 하더라도 협업을 염두에 두고 변수명을 지으면 좋을 것 같습니다.
맥락을 고려해서 짓기
위에서 변수명이 길어지더라도 구체적으로 적으라고 했는데, 그렇다고 무작정 길게 하라는 것은 아닙니다.
class Car {
String carName;
}
위의 코드를 보면 Car 클래스 안에 carName이라는 변수명이 있는 것을 볼 수 있습니다. 위에서 말했듯이 최대한 구체적으로 지었기에 어떤 역할을 하는지 알기 쉽습니다.
하지만 이게 정말 좋은 변수명일까요?
사실 Car 클래스의 멤버변수이기에 carName이 아닌 name으로만 해도 Car의 이름을 지칭하는지 알기 쉽기 때문에 carName으로 변수명을 하는 것을 좋은 변수명이라고 말하기는 힘들 것 같습니다. 이처럼 무작정 변수명을 길게 하는 것은 오히려 코드의 가독성을 해칠 수 있고 코드의 맥락을 고려하여 변수명을 짓는 것도 클린 코드를 위해 중요한 부분 중 하나입니다.
불린 변수의 네이밍
불린의 변수명은 참이나 거짓의 의미를 함축하는 불린 변수의 이름을 사용하는 것이 좋습니다. 예를 들어 status는 거짓이나 참이 명백하지 않아서 좋지 않은 변수명이고, 차라리 statusOk라는 이름으로 대체하는 것이 좋습니다.
또한 불린명을 지을 때 긍정적인 불린 변수를 사용하는 것이 좋습니다. 변수명이 예를 들어 notFound라면 이를 부정했을 때 오히려 헷갈리기 때문에 긍정적인 불린 변수를 사용해야 합니다.
그리고 자바에서는 is를 붙여서 불린 메서드나 변수명을 짓습니다. 하지만 isFound보다는 found가 더 쉽게 읽히는 것처럼 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))));
}
...
}
위의 코드를 봤을 때 Arrays의 asList 메서드를 보면 이 매개변수들이 넘어갔을 때 어떤식으로 다시 리턴이 될지 한 눈에 확인하기가 어렵습니다.
하지만 아래의 코드처럼 변수명을 따로 빼서 매개변수로 넘겨준다면 어떨까요?
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)));
}
...
}
여기서는 변수명을 따로 빼줘서 매개변수로 넘겨주었기 때문에 한 눈에 알아보기 좋고 어떻게 리턴 될지 알기 좋습니다.
이처럼 메서드에 매개변수로 넘겨줄 때도 이러한 점을 고려해서 변수명을 따로 빼야 할 것 같은 경우에는 빼면 좋을 것 같습니다.
변수 이름에 자료형이 들어갈 경우
만약에 List 자료형을 사용하기 위해서 carList라는 변수명을 지었다고 가정해보겠습니다. 그러다가 갑자기 List 자료형이 아닌 Set 자료형을 사용한다고 했을 때 기존의 carList라는 변수명이 붙어있으면 이는 좋지 않은 변수명입니다.
그래서아예 처음에 정할 때 어떤 자료형을 사용할지를 나타내는 것이 아닌 cars라는 복수형으로 표현하는 것이 좋습니다.
List<String> carList = new ArraysList<>(); // 좋지 않은 예시
List<String> cars = new ArraysList<>(); // 좋은 예시
메서드명 네이밍 규칙
좋은 메서드명 짓기
여기서 언급할 내용은 어떻게 좋은 코드를 위해서 메서드명을 지어야 하는지와 협업을 위해 다른 사람들이 내 코드를 보았을 때 한 눈에 이 변수가 어떤 곳에 사용될 것인지, 어떤 역할을 하는지를 알 수 있게 해주는 방법이라고 할 수 있습니다.
- 메서드 이름은 lowerCamelCase로 작성합니다.
- 메서드 이름은 동사/전치사로 시작합니다.
-> 기본적으로는 동사로 시작하고, 다른 타입으로 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드에는 전치사를 쓸 수 있습니다.
메서드 이름으로 자주 사용되는 동사
사실 메서드 이름으로 자주 사용되는 동사는 정해져 있고 이를 따라가기만 해도 어느정도 좋은 메서드명을 지을 수 있습니다.
자주 쓰는 동사는 아래와 같습니다.
- get/set
-> 자바에서는 getter/setter 자바 빈 규약이 있습니다. 이러한 상황들을 제외하고는 사실 get/set 메서드는 클래스 내부에서만 사용하는 것이 좋고, 객체에 메시지를 보내서 그 객체에서 동작을 처리할 수 있도록 하는 것이 좋습니다. - init
-> 데이터를 초기화할 때 사용됩니다. - is/has/can
-> 불린값을 리턴하는 메서드명에 쓰입니다. - create
-> 새로운 객체를 만든 후 리턴해주는 메서드명에 쓰입니다. - find
-> 데이터를 찾는 메서드명에 쓰입니다. - to
-> 해당 객체를 다른 형태의 객체로 변환해주는 메서드명에 쓰입니다. - A-By-B(ex: getUserByName)
-> B를 기준으로 A를 하겠다는 메서드명에 쓰입니다.
참고 자료
https://tecoble.techcourse.co.kr/post/2020-04-24-variable_naming/
좋은 코드를 위한 자바 변수명 네이밍
JAVA…
tecoble.techcourse.co.kr
https://tecoble.techcourse.co.kr/post/2020-04-26-Method-Naming/
좋은 코드를 위한 자바 메서드 네이밍
…
tecoble.techcourse.co.kr