일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 회고
- 알고리즘
- 독서
- 인강리뷰
- javascript
- 자바
- Head First Design Pattern
- study
- 후기
- 디자인패턴
- 인코딩
- 프로그래머스
- 인프런
- spring
- 공부
- 우아한테크코스
- 독서리뷰
- Java
- math
- Eclipse
- JPA
- Design Pattern
- 매핑
- 이펙티브자바
- Singleton
- 람다
- Oracle
- 오라클
- 에러
- 카카오톡1차
- Today
- Total
Lee's Grow up
[CodingConvention] Google Java Coding Style 정리 본문
구글에서 제공해주는 자바 코딩 스타일 가이드에 대한 정리입니다.원문
해당 내용은 작성일 기준 문서의 내용을 정리한 것 입니다.
소스파일
- 이름 : 포함하고 있는 최상위 레벨의 대소문자 구분되는 이름으로 이루어집니다.
- 확장자 :
.java
확장자를 사용합니다. - 인코딩 : UTF-8
- ASCII(0x20)은 유일한 공백 문자이며, 탭 문자는 공백에 사용하지 않습니다.
- 모든 특수 문자를 사용할 때 이스케이프 시퀀스 (\b, \w 등)을 사용하며, 그 문자의 진수, 유니코드는 사용하지 않습니다.
- 비 ASCII문자는 유니코드를 사용하고, 주석으로 설명해도 무방합니다.
소스파일 구조
- 소스 파일은 다음 순서로 구성됩니다. 각 객션 간에는 공백 라인이 하나 들어가야 합니다.
- 라이센스 또는 저작권 정보 ( 있는 경우 )
- 패키지 명세서
- import문
- 최상의 클래스
Pacakge 문
- 이름은 소문자로 작성합니다.
- 패키지문은 아무리 길어도 한 문장으로 써야합니다. 줄 바꿈 되지 않습니다.
Import 문
- 정적이든 비정적이든 와일드 카드(*)는 사용하지 않습니다.
- 순서
- 단일 블록에서 모든 정적
- 단일 블록의 모든 비 정적
- 정적과 비정적 사이에만 빈 줄이 있고, 다른 import 문 사이에는 다른 빈 줄이 없습니다.
- 각 블록 내에서의 이름은 ASCII 정렬 순서로 나타냅니다.
- 정적 중첩 클래스에는 정적 import가 사용되지 않습니다. 일반 import를 사용합니다.
Class
- 대문자로 시작하며, UpperCamelCase를 사용하며, 명사 또는 명사구입니다. 인터페이스는 명사 또는 명사구 또는 형용사 형용사구가 될 수 있습니다.
- 테스트 클래스의 경우 Test를 붙입니다.
HashTest
- 클래스 멤버의 순서는 절대적인 것은 없습니다. 다만 순서가 논리적이여야 합니다. 가령 새로운 메소드가 추가되었다고 해서 클래스의 가장 마지막에 구현되는 것은 논리적이지 않습니다.
- Class에 여러 생성자 또는 동일한 이름을 가진 여러 메서드가 있는 경우 사이에 다른 코드 없이 순차적으로 나타냅니다.
Method
- lowCamelCase를 사용합니다.
- 동사구입니다.
- JUnit 테스트 메서드 이름의 경우 _ 뒤엔 lowCamelCase를 따릅니다 `_ pop_emptyStack
상수
- 상수는 CONSTANT_CASE 구분은 밑줄로 모든 단어는 대문자로 사용합니다.
필드
- lowerCamelCase를 사용합니다.
- 고용ㅇ 메소드에서 사용한 변수 이름은 피해야 합니다.
지역 변수
- lowerCamelCase를 사용합니다.
- 절대로 상수로 지정해서는 안됩니다.
유형 변수 이름
- 임의의 단일 대문자 T, E, X 또는 클래스 이름 + T , RequestT, FooT, BarT
포메팅
- 들여쓰기는 2space를 사용합니다.
블록 {}
-
빈 블록의 경우
-
블록 문은 내용이 비어있거나, 단 하나의 문이 포함된 경우에도 사용한다.(if, else, for, do, while )
-
다중 블록이 아닌 경우, 블록({}) 사이에 문자나 줄 바꿈 없이 열린 직후 닫을 수 있습니다.
// 단일 블록은 둘 다 사용 가능 void doNothing() {} void doNothingElse() { } // 다중 블록은 사용 불가 try { doSomething(); } catch (Esception e) {}
-
-
비어있지 않은 블록의 경우
- 여는 중괄호 앞에는 줄 바꿈이 없습니다.
- 여는 중괄호 뒤의 줄 바꿈
- 닫는 중괄호 앞의 줄바꿈
- 닫는 중괄호 뒤의 줄바꿈 단, 중괄호가 명령문을 종료하거나, 메서드 , 생성자 또는 클래스의 본문을 종료하는 경우에는 줄바꿈이 없습니다. 예를들어
; ( semicolon)
또는,else
문
세로 공백
- 각 문 뒤에는 줄 바꿈이 있습니다. ( 한 줄에 하나의 문 )
- 열 제한은 100자 입니다. 단 javadoc의 긴 ULR 또는 긴 JSNI 메소드 참조나, pacakge 문, import 문은 예외입니다.
- 연속 줄바꿈인 경우 4space 의 indent를 사용합니다.
- 세로 공백은 하나의 빈줄을 사용합니다. 여러 개의 빈 줄이 허용되지만 권장은 아닙니다.
- 클래스의 필드, 생성자, 메소드, 중첩 클래스, 정적 초기화 및 인스턴스 사이에 공백이 들어갑니다.
- 두 개의 연속된 필드에 빈줄은 논리적은 그룹을 만드는데 사용합니다.
가로 공백
- if, for, catch 다음에 오는 '(' 사이에 공백문자
- else 또는 catch 이전에 오는 '}' 사이에 공백 문자
- 여는 중괄호 '{' 앞에 공백
- 단 어노테이션의 경우 공백 사용하지 않음 @SomeAnnotation({a, b})
- 배열의 경우 선택 사항 new int[] {5, 6} 또는 new int90 { 5, 6 }
- 이항 또는 삼항 연산자에서
- <T extends Foo & Bar>
- 예외 catch 블록에 대한 파이프 : catch (Exception | BarException e)
- 확장된 for문에서 ' : '
- 람다 식의 화살표 ' -> '
- ',:;' 또는 닫는 괄호 뒤 '}'
- 주석 // 의 시작 허용은 되지만 선택사항
- '[]' 또는 '...' 사이
수평 정렬
-
수평 정렬은 사용하지 않습니다.
// 맞는 사용 private int a; private String b; // 틀린 사용 private int a; private String b
Enum 클래스
-
열거 형 상수 뒤에 오는 각 쉼표 뒤에 줄 바꿈은 선택사항, 추가 빈줄도 허용합니다.
private enum Answer { YES { @Override public String toString() { return "yes"; } }, NO, MAYBE
-
배열처럼 사용 가능합니다.
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
변수 선언
- 선언 당 변수 하나, int a, b; 는 허용되지 않습니다.
- 단 for 루프 헤더에 여러 변수 선언은 허용됩니다.
- 시작 부분에 습관적으로 선언하지 않고, 필요할 때 선언하며, 필요한 지점에 가깝게 선언해 범위를 최소화 합니다.
배열 선언
-
블록처럼 사용 가능합니다. 아래는 모두 가능합니다.
new int[] { 0, 1, 2, 3 } new int[] { 0, 1, 2, 3 } new int[] { 0, 1, 2, 3 } new int[] {0, 1, 2, 3}
-
스타일 배열 선언을 사용하지 않습니다.
String[] args
는 가능String args[]
는 사용 금지
스위치문
-
들여쓰기는 2spaces를 사용합니다.
-
default를 작성합니다.
-
break, continue, return이 없는 경우
// fall through
주석 사용switch (input) { case 1: case 2: prepareOneOrTwo(); // fall through case 3: handleOneTwoOrThree(); break; default: handleLargeNumber(input); }
어노테이션
-
클래스, 메서드 또는 생성자의 주석은 문서 블록 바로 뒤에 나타나며, 각 주석은 1줄을 사용하며 들여쓰기를 사용하지 않습니다. 단 매개변수가 없는 단일 주석인 경우 한줄에 표현이 가능합니다. 필드에 적용되는 주석의 경우 한줄로 나열 될 수 있습니다.
@Override @Nullable public String getNameIfPresent() { ... } ## 가능 @Override public int hashCode() { ... } ## 가능 @Partial @Mock DataLoader loader;
-
매개변수, 지역변수, 타입에대한 어노테이션은 규칙은 없습니다.
Modifiers 순서
public protected private abstract default static final transient volatile synchronized native strictfp
숫자 리터럴
- long의 경우 대문자 접미사를 사용합니다. 숫자 1과 혼동을 피하기 위해
네이밍
아스키 코드나 숫자만 허용하며 prefixes 또는 suffixes를 사용하지 않습니다. not use mName, KName
등
Override 어노테이션
- 생략하지 않습니다.단 부모 메소드가 @Deprecated인 경우 생략할 수 있습니다.
예외
- catch 블록은 무조건 액션을 취합니다. 다만 테스트 케이스일 경우 생략 가능합니다.
정적 멤버
- 클래스 이름으로 접근합니다. 인스턴스 명으로 접근하는건 잘못 된 예시입니다.
Foo aFoo = .... Foo.aStaticMethod() // OK aFoo.aStaticMethod() // bad