현재 캡스톤 프로젝트를 진행중인데, 코드 컨벤션에 대한 코드 리뷰를 많이 받았다.
따라서 코드 컨벤션을 정리하고자 글을 작성하였다.
우선 코드 컨벤션이란 실제 지키지 않아도 오류가 발생하는 것은 아니지만,
내가 작성한 코드를 다른 사람들도 쉽게 이해할 수 있는 협업에 있어서 중요한 코드 작성법 규칙이다.
식별자에는 영문/숫자/언더스코어만 허용
변수명, 클래스명, 메서드명 등에는 영어와 숫자만을 사용한다. 상수에는 단어 사이의 구분을 위하여 언더스코어(_)를 사용한다. 정규표현식 `[^A-Za-z0-9_]`에 부합해야 한다.
한국어 발음대로의 표기 금지
식별자의 이름을 한글 발음을 영어로 옮겨서 표기하지 않는다. 한국어 고유명사는 예외이다.
패키지 이름은 소문자로 구성
package com.example.domain
클래스/인터페이스 이름에 대문자 카멜표기법 적용
public class Order
public class MemberReport
클래스 이름에 명사 사용
클래스 이름은 명사나 명사절로 짓는다.
메서드 이름에 소문자 카멜표기법 적용
메서드의 이름에는 첫 번째 단어를 소문자로 작성하고, 이어지는 단어의 첫 글자를 대문자로 작성하는 소문자 카멜표기법(Lower camel case)를 사용한다. 테스트 클래스의 메서드 이름에서는 언더스코어를 허용한다
메서드 이름은 동사/전치사로 시작
메서드명은 기본적으로는 동사로 시작한다.
다른 타입으로 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드에는 전치사를 쓸 수 있다.
getName()
changeMoney()
상수는 대문자와 언더스코어로 구성
상태를 가지지 않는 자료형이면서 static final`로 선언되어 있는 필드일 때를 상수로 간주한다. 상수 이름은 대문자로 작성하며, 복합어는 언더스코어(`_)를 사용하여 단어를 구분한다.
public final String SUCCESS_REVIEW = "리뷰가 등록되었습니다.";
변수에 소문자 카멜표기법 적용
상수가 아닌 클래스의 멤버변수/지역변수/메서드 파라미터에는 소문자 카멜표기법(Lower camel case)을 사용한다.
private boolean authorized;
private int accessToken;
임시 변수 외에는 1 글자 이름 사용 금지
메서드 블럭 범위 이상의 생명 주기를 가지는 변수에는 1글자로 된 이름을 쓰지 않는다.
반복문의 인덱스나 람다 표현식의 파라미터 등 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있다.
Member m = new Member();
Member member = new Member();
static import에만 와일드 카드 허용
클래스를 import할때는 와일드카드(*) 없이 모든 클래스명을 다 쓴다.
static import에서는 와일드카드를 허용한다.
import java.util.*;
import java.util.List;
import java.util.ArrayList;
제한자 선언의 순서
클래스/메서드/멤버변수의 제한자는 Java Language Specification에서 명시한 아래의 순서로 쓴다.
public protected private abstract static final transient volatile synchronized native strictfp
애너테이션 선언 후 새줄 사용
@GetMapping("/members")
public void findMembers() {}
한 줄에 한 문장, 하나의 선언문에는 하나의 변수만
int height = 180; int weight = 72;
int height = 180, weight = 72;
int height = 180;
int weight = 72;
배열에서 대괄호는 타입 뒤에 선언
String names[];
String[] names;
`long`형 값의 마지막에 `L`붙이기
long형의 숫자에는 마지막에 대문자 'L’을 붙인다.
소문자 'l’보다 숫자 '1’과의 차이가 커서 가독성이 높아진다.
long value = 1231l;
좋은 예
long value = 1231L;
들여쓰기
탭(tab) 문자를 사용하여 들여쓴다.
탭 대신 스페이스를 사용하지 않는다.
탭의 크기는 4개의 스페이스로 설정한다.
클래스, 메서드, 제어문 등의 코드 블럭이 생길 때마다 1단계를 더 들여쓴다.
K&R 스타일로 중괄호 선언
public class MemberController
{
public boolean isValidName(String name)
{
if (name == null)
{
return false;
}
return true;
}
}
public class MemberController {
public boolean isValidName(String name) {
if (name == null) {
return false;
}
return true;
}
}
닫는 중괄호와 같은 줄에 else, catch, finally, while 선언
if (name.equals(USERNAME)) {
return new Member(name, ROLE_UER);
}
else if (name.equals(ADMIN) {
return new Member(name, ROLE_ADMIN);
}
else {
return null;
}
if (name.equals(USERNAME)) {
return new Member(name, ROLE_UER);
} else if (name.equals(ADMIN) {
return new Member(name, ROLE_ADMIN);
} else {
return null;
}
빈 블럭에 새줄 없이 중괄호 닫기 허용
public void move() {}
조건/반복문에 중괄호 필수 사용
if (name == null) return false;
for (String name : names) if (name == null) return false;
if (name == null) {
return false;
}
for (String name : names) {
if (name == null) {
return false;
}
}
줄바꿈
최대 줄 사용 너비는 120자까지 가능하다.
package,import 선언문 중간에서는 줄을 바꾸지 않는다. 최대 줄수를 초과하더라도 한 줄로 쓴다.
가독성을 위해 줄을 바꾸는 위치는 다음 중의 하나로 한다.
- extends 선언 후
- implements 선언 후
- throws 선언 후
- 시작 소괄호(() 선언 후
- 콤마(,) 후
- . 전
- 연산자 전
-
- +, -, *, /, %
- ==, !=, >=, >,⇐, <, &&, ||
- &, |, ^, >>>, >>, <<, ?
- instanceof
빈 줄
package 선언 후 빈줄을 삽입한다.
import 선언의 순서와 빈 줄을 삽입한다.
삽입메서드의 선언이 끝난 후 다음 메서드 선언이 시작되기 전에 빈줄을 삽입한다.
공백
빈줄을 포함하여 모든 줄은 탭이나 공백으로 끝내지 않는다.
닫는 대괄호(]) 뒤에 `;`으로 문장이 끝나지 않고 다른 선언이 올 경우 공백을 삽입한다.
int[]numbers = new int[]{0, 1, 1};
int[] numbers = new int[] {0, 1, 1};
public void printWarnMessage(String line) {
if (line.startsWith(WARN_PREFIX)) {
...
} else {
...
}
}
제어문 키워드와 여는 소괄호 사이에 공백 삽입
if (maxLine > LIMIT) {
return false;
}
식별자와 여는 소괄호 사이에 공백 미삽입
식별자와 여는 소괄호(() 사이에는 공백을 삽입하지 않는다.
생성자와 메서드의 선언, 호출, 애너테이션 선언 뒤에 쓰이는 소괄호가 그에 해당한다.
콤마/구분자 세미콜론의 뒤에만 공백 삽입
for (int i = 0;i < length;i++) {
display(level,message,i)
}
for (int i = 0; i < length; i++) {
display(level, message, i)
}
주석문 기호 전후의 공백 삽입
주석의 전후에는 아래와 같이 공백을 삽입한다.
- 명령문과 같은 줄에 주석을 붙일 때 // 앞
- 주석 시작 기호 // 뒤
- 주석 시작 기호 /* 뒤
- 블록 주석을 한 줄로 작성시 종료 기호 */ 앞
좋은 예
/*
* 공백 후 주석내용 시작
*/
System.out.print(true); // 주석 기호 앞 뒤로 공백
/* 주석내용 앞에 공백, 뒤에도 공백 */
이외에도 많은 컨벤션이 존재한다.
스스로 많이 사용하고, 중요하다고 생각하는 것들을 위주로 정리하였다.
컨벤션은 실제로도 매우 중요하기 때문에 습관적으로 사용하자.
'좋은 개발자가 되기' 카테고리의 다른 글
객체지향의 사실과 오해(4장) (0) | 2023.04.25 |
---|---|
객체지향의 사실과 오해(3장) (2) | 2023.04.17 |
객체지향 생활 체조 원칙 (0) | 2023.04.16 |
객체지향의 사실과 오해(2장) (0) | 2023.04.11 |
객체지향의 사실과 오해 (1장) (0) | 2023.04.05 |