Coding Convention이란?
코딩 컨벤션은 프로그래머 사이의 코드를 작성하는 양식입니다. 개발자마다 미묘하게 코드를 작성하는 방식이 다르죠. 좁게는 괄호의 위치, indent 간 스페이스의 개수부터 시작해서, 넓게는 변수, 클래스, 객체의 이름을 짓고 javadoc을 작성하는 것까지 Convention에 해당합니다. 우아한 테크코스에서는 Google 자바 코딩 컨벤션을 참고하였으나 거기에 추가 요구사항(indentation, 열너비의 변경사항)을 반영한 컨벤션으로 코드를 작성해야 했습니다. 사실 IDE에는 내장된 formatter를 사용해서 대략적인 컨벤션에 맞춰 자동으로 코드를 수정해주는 기능이 있습니다. IntelliJ에서는 Ctrl + Alt + L를 통해서 코드 양식을 맞출 수 있습니다. 다만, IDE의 formatter는 indent, space 등에 국한되며, 변수명, 주석 등의 convention은 수정되지 않습니다. 컨벤션의 자세한 내용은 아래 링크를 참고해주세요.
[구글 자바 컨벤션]https://google.github.io/styleguide/javaguide.html
우선, Code Convention의 중요한 내용만(주관적) 간추려서 정리해보았습니다.
Google Java Coding Convention
1. 소스 파일 구조
각 계층은 정확히 하나의 empty line으로 구분됩니다.
1) 라이센스, 저작권 정보
2) Package 구문
3) Import 구문
4) 정확히 하나의 최상위 Class
1.1 Import 구문
- 와일드 카드로 가져와서는 안됩니다.
- import문은 줄 바꿈되지 않습니다.
- 열제한은 적용되지 않습니다.
- import 순서
- 단일 블록 static imports
- 단일 블록 non-static imports
- non static과 static은 하나의 빈줄로 구분됩니다.
- 이름은 ascii 정렬 순서로 나타냅니다.
import java.util.*; // wildcard import 금지
1.2 클래스 선언
- 정확히 하나의 최상위 클래스가 존재해야합니다. (최상위 클래스가 두 개 이상 존재해서는 안됩니다.)
- 클래스의 멤버와 이니셜라이저에 대한 순서는 정해진 방법은 없으나, 논리적 순서에 따라야합니다.
- 오버로드 간에는 다른 코드가 끼어들어서는 안됩니다.
2. Formatting
2.1 괄호
선택사항인 경우에도 괄호는 사용되어야 합니다. (if 등 block 내부 하나의 문장이 올 때)
if (true)
System.out.printf("괄호를 써야합니다.");
2.1.1 Block - K & R 스타일 사용
- 여는 중괄호 앞에 줄바꿈 없고, 뒤에 줄바꿈이 있습니다.
- 닫는 중괄호 앞의 줄 바꿈이 있고, 뒤에도 줄바꿈이 있습니다.
- 닫는 중괄호 뒤에 else, 쉼표, catch 등 구문은 줄바꿈이 없습니다.
try { // 여는 중괄호 앞의 줄바꿈 X, 뒤에 줄바꿈
String input = readline();
} catch (Exception e) { // catch 뒤의 줄바꿈 없음
return ;
} // 닫는 중괄호 뒤 줄바꿈
2.1.2 빈 블록
- 멀티 블록 명령문(try ~ catch, if ~ else 등) 외에는 간결한 빈 블록({})을 사용할 수 있습니다.
2.2 블록 들여 쓰기 : +2 공백
새 블록 또는 블록과 유사한 구조가 열리면 2칸의 space 들여 쓰기를 해야합니다. 우테코는 예외적으로 +4칸의 들여쓰기를 적용합니다.
2.3 열 제한 : 100
100자의 character(유니코드 포인트) 열 제한이 있습니다. javadoc, import문은 열제한에서 제외됩니다.
2.4 줄 바꿈
코드를 하나의 줄에서 여러 줄로 나누는 것을 줄바꿈이라고 합니다. 목적은 열제한을 충족시키면서 명확한 코드를 작성해 가독성을 높이는 것입니다.
- 할당 연산자에서 줄 바꿈을 넣는 경우 일반적으로 기호 뒤에 넣습니다. (어느 쪽이든 허용)
- lambda 함수를 사용하는 경우 lambda 화살표 이후 여는 중괄호 뒤에서 줄 바꿈을 넣습니다.
- 예외적으로, 중괄호가 없는 경우 화살표 바로 뒤에서 개행할 수 있습니다.
2.4.1 줄바꿈 시 연속 줄을 최소 +4 공백 들여쓰기
줄 바꿈 시 연속 줄은 원래 줄에서 +4만큼 들여쓰기합니다. (연속임을 표시하기 위한 장치입니다.) 일반적으로 두 개의 연속 줄은 병렬 요소인 경우에만 동일한 들여쓰기를 하고, 그 외에는 들여쓰기를 임의로 변경할 수 있습니다.
try {
String input =
Arrays.stream(inputs) // +4 들여쓰기
.mapToInt(Integer::parseToInt) // 임의로 들여쓰기 수준 변경
.toArray();
2.5 공백
2.5.1 세로 공백
- 코드를 논리적 섹션으로 구분하기 위해 가독성 목적으로 빈 줄을 삽입할 수 있습니다.
- 첫 번째 멤버 앞, 이니셜 라이저 앞, 클래스의 마지막 멤버, 이니셜 라이저 뒤의 빈줄은 권장되지 않습니다.
2.5.2 수평 공백
- 선언 type과 변수 사이
- 캐스트, :, 닫는 괄호 뒤
- (//) 주석 시작 뒤
- 이항, 삼항 연산자의 양쪽
- 예약어의 괄호 앞(if, else, try 등)
2.5.3 수평정렬
토큰의 위치를 맞추는(tab과 같이) 수평 정렬은 사용하지 않습니다. 가독성은 좋지만 수정 시에 유지 관리가 어렵습니다.
2.6 그룹화 괄호 : 권장!!
가독성을 위한 괄호는 항상 권장됩니다. 우선순위가 있더라도 괄호로 감싸세요.
2.7 변수 선언
2.7.1 선언 당 하나의 변수
한번에 하나의 변수만 선언합니다. ex) int a,b;는 허용되지 않습니다.
2.7.2 지역 변수의 범위 최소화
지역 변수는 시작 부분에서 습관적으로 선언하지 않고, 사용이 필요한 부분에서 선언하여 지역 변수의 범위를 최소화 합니다.
일반적으로 선언 직후에 초기화 시킵니다.
2.7.3 배열의 타입
배열의 대괄호는 type의 일부를 형성합니다. ex) int[] a;
3. Naming
3.1 Package 이름
패키지 이름은 소문자, 연속된 단어는 camel case, under bar없이 연속으로 나타냅니다.
ex) com.example.deepspacenot (O)
3.2 클래스 이름
- 클래스 이름은 UpperCamelCase로 작성합니다.
- 클래스 이름은 명사, 명사구로 짓습니다.
- Interface 이름은 형용사, 형용사 구로 지을 수 있습니다.
- 테스트 클래스 이름은 테스트 중인 클래스 이름 + Test로 짓습니다.
3.3 메서드 이름
- lowerCamelCase로 작성합니다.
- 동사, 동사구로 짓습니다.
- 클래스 이름과 연계해서 지어야합니다. ex) Camel.walkCamel 보다는 Camel.walk가 낫습니다.
3.4 Constant 이름
- CONSTANT_CASE를 사용합니다.
- 상수는 정적 최종 필드를 이야기합니다. 인스턴스의 상태가 변경될 여지가 있으면 상수가 아닙니다.
- static final이더라도 list에 add되거나 요소가 변할 수 있으면 상수가 아닙니다.
static final int NUMBER = 5;
static final String[] a = {"a"}; //상수가 아니다.
3.5 상수가 아닌 필드, 파라미터, 지역 변수 이름
- lowerCamelCase로 작성합니다.
- 보통 명사, 명사 구를 사용합니다.
3.6 Type 변수 이름
- 단일 대문자 + (단일 숫자) ex) T, T2
- 클래스에 사용된 형식의 이름 뒤의 대문자 T ex) RequestT 등
3.7 Camel Case 짓기
- 약자인 경우에도 원래 문자의 대소문자는 무시합니다. ex) HttpAlgo
- 어퍼스트로피는 제거됩니다.
- 하이픈도 제거합니다.
Java 코딩 컨벤션에 대해 알아봤으니, 다음에는 코딩 컨벤션을 적용해서 IDE Formatter 설정하기, 그리고 IDE의 플러그인과 연결해 CheckStyle로 검사하는 방법을 알아보겠습니다.
'자바(Java)' 카테고리의 다른 글
[TIL] 객체 지향 설계 - 사다리 타기 게임 (Java) (1) | 2023.03.11 |
---|---|
Java Coding Convention 검사하기 - Formatter, CheckStyle (0) | 2023.01.08 |
ArrayList의 동적 배열 할당 원리 (Java) (0) | 2023.01.06 |
배열의 메모리는 연속일까? 메모리 주소 조회 (Java) (0) | 2023.01.06 |