Google Java Style Guide 뜯어보기

알파로그·2024년 1월 29일
0

Code conventions

목록 보기
1/4

✏️ 발단

새로운 팀프로젝트에 합류하면서 Google 의 컨벤션을 베이스로 한다고 해서 이번기회에 하나하나 살펴보려고 한다.

딱 봤을 때 납득이 되거나 잘 사용되지 않을 것 같은 부분은 따로 정리하지 않고,
왜 이런 컨벤션을 지향해야 하는지 의문이 들거나 햇갈리는 것들만 정리해봤다.

🔗 Google Java Style Guide 번역

✏️ 2.3.1 공백 문자

  • 코드를 들여쓰기 할 때 탭을 사용하지말자.
    • 탭 대신 스페이스 문자를 사용해야하는 이유는 코드와 포맷의 일관성을 유지하기 위함이다.
    • 다양한 편집기 및 IDE 에서 탭 문자의 표시, 크기가 다르게 해석될 수 있어 스페이스로 통일하는 것이 좋다.

✏️ 3.3.4 클래스에는 static import 를 하지 않는다.

  • 코드를 읽을 때 어느 클래스의 method 임을 명확히 알기 어려움으로 지양하는 것이 좋다고 한다.
    • 하지만 해당 컨벤션을 따르는 프로젝트를 참고해보니 test 객체에서는 예외인듯 하다.

✏️ 4.1.1 선택 사항인 경우에도 중괄호가 사용됩니다.

  • if, else, for, do 및 while문 또는 body가 비어 있거나 단 하나의 문이 포함 된 경우에도 괄호가 쓰인다.
    • 가독성 향상과 통일성 유지 때문에 이러한 규칙이 있는 것 같다.

✏️ 4.1.2 비어 있지 않은 블록 : K & R 스타일

  • 중괄호의 줄바꿈에 관한 규칙이다.
    • 4.1.3 에 규칙에 대한 예외가 있다.
  • 여는 중괄호 앞에 공백 문자, 뒤에 줄 바꿈
  • 닫는 중괄호 앞, 뒤에 줄 바꿈
    • 뒤에 else 또는 , 가 오면 줄바꿈 x
// Ex)
return () -> {
  while (condition()) {
    method();
  }
};

return new MyClass() {
  @Override public void method() {
    if (condition()) {
      try {
        something();
      } catch (ProblemException e) {
        recover();
      }
    } else if (otherCondition()) {
      somethingElse();
    } else {
      lastThing();
    }
  }
};

✏️ 4.1.3 빈 블록: 간결 할 수 있음

  • 위의 4.1.2 의 예외에 관한 규칙이다.
    • 빈 블록, 블록과 유사한 구조는 중괄호 에 줄 바꿈 없이 작성할 수 있음
// 허용
void doNothing() {}

// 허용
void doNothingElse() {
}

// 허용되지 않음 : 멀티 블럭 구문에서는 간결한 빈 블럭을 사용할 수 없다.
try {
  doSomething();
} catch (Exception e) {}

✏️ 4.4 열 제한 : 100

  • Java 코드의 열 제하는 100 자 이다.

    • 100 자를 넘을 경우 줄 바꿈 또는 메서드, 지역 변수를 추출하는 방법으로 해결해야 한다.
  • 예외

    • 열 제한을 따를 수 없는 행 (Javadoc 의 긴 URL, JSNI 메서드 참조 등..)
    • package, import 문
    • 셸에 복붙되는 주석의 명령 줄
  • 줄바꿈 예시

// before
int result = someLongVariable + anotherLongVariable - yetAnotherVariable * calculateSomeValue();

// after
int result = someLongVariable +
             anotherLongVariable -
             yetAnotherVariable * calculateSomeValue();

// before
object.method().property1.property2.property3;

// after
object.method()
      .property1
      .property2
      .property3;

// before
public <T extends SomeReallyLongTypeName & AnotherLongTypeName> void someMethod() {
    // method implementation
}

// after : 제네릭이 길 때 줄 바꿈
public <T extends SomeReallyLongTypeName & AnotherLongTypeName>
       void someMethod() {
    // method implementation
}

// good : 쉼표 뒤에 줄 바꿈
int[] numbers = {
    1,
    2,
    3,
    4
};

✏️ 4.6.1 세로 공백

  • 연속적인 멤버앞에 하나의 빈 줄을 추가한다.
  • 두 개 이상 연속 된 필드 사이의 빈 줄은 선택사항이다.
    • 필요에 따라 빈 줄로 논리적 그룹을 만들 수 있다.
  • 클래스의 마지막 맴버 뒤의 빈 줄은 권장되지 않는다.
  • 여러개의 연속 된 빈 줄이 허용되지만 권장되지는 않는다.

✏️ 4.6.2 수평 공백

  • 여는 괄호 앞과 닫는 괄호 뒤에 공백문자를 추가한다.
  • 예외
    • 괄호가 중첩될 경우 안쪽의 괄호의 앞, 뒤
    • 메서드 명 뒤의 여는 괄호, 어노테이션의 여는 괄호

✏️ 5.2.1 Package 이름

  • 패키지 명은 카멜 케이스나 스네이크 케이스 등을 사용하지 않고 전부 소문자로 연속된 단어로 작성해야 한다.
// bad
package com.example.myApp
package com.example.my_app

// good
package com.example.myapp

✏️ 5.2.4 Constant 이름

  • constant (상수) 는 CONSTANT_CASE 를 사용한다.
    • 모두 대문자로 작성하며 밑줄 _ 로 각 단어를 구분하는 방법
    • Constant (상수) : 고정된 값을 나타내는 변수. (final 키워드를 사용한다.)

✏️ 6.2 Caught exceptions : 무시되지 않음

  • try / catch 의 catch 블록에서 아무 조치도 취하지 않으면 안된다.
    • 만약 정말 아무 작업도 취하지 않아야 할 때에는 주석으로 설명이 동반되어야 한다.
    • 테스트 코드의 catch 블록은 작업, 주석이 생략될 수 있다.
profile
잘못된 내용 PR 환영

0개의 댓글