Lee's Grow up

[CodingConvention] Google Java Coding Style 정리 본문

Agile

[CodingConvention] Google Java Coding Style 정리

효기로그 2020. 12. 8. 16:54
반응형

구글에서 제공해주는 자바 코딩 스타일 가이드에 대한 정리입니다.원문
해당 내용은 작성일 기준 문서의 내용을 정리한 것 입니다.

소스파일

  • 이름 : 포함하고 있는 최상위 레벨의 대소문자 구분되는 이름으로 이루어집니다.
  • 확장자 : .java 확장자를 사용합니다.
  • 인코딩 : UTF-8
  • ASCII(0x20)은 유일한 공백 문자이며, 탭 문자는 공백에 사용하지 않습니다.
  • 모든 특수 문자를 사용할 때 이스케이프 시퀀스 (\b, \w 등)을 사용하며, 그 문자의 진수, 유니코드는 사용하지 않습니다.
  • 비 ASCII문자는 유니코드를 사용하고, 주석으로 설명해도 무방합니다.

소스파일 구조

  • 소스 파일은 다음 순서로 구성됩니다. 각 객션 간에는 공백 라인이 하나 들어가야 합니다.
    1. 라이센스 또는 저작권 정보 ( 있는 경우 )
    2. 패키지 명세서
    3. import문
    4. 최상의 클래스

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

Finalizers 사용 금지

Javadocs 필수가 아닙니다. 필요시 문서 참조

반응형
Comments