Google Java Style Guide

·2023년 10월 23일
0

🎯개발지식

목록 보기
1/7

JAVA의 코드 컨벤션의 종류

자바코드의 컨벤션의 필요성을 알게 되어 내용을 정리하고자 글을 쓰게 되었습니다.
Google Java Style Guide 번역본이 잘 되어있기 때문에 모든 내용을 정리하기 보다는 필요한 부분들을 추가하는 방식으로 복습하며 익히고자 합니다.

1.1 용어 노트

  1. '클래스'라는 용어는 "일반 "클래스, enum 클래스, 인터페이스, 어노테이션(@interface)을 모두 지칭한다.

  2. 멤버(클래스의)라는 용어는 중첩클래스, 필드, 메소드, 생성자를 포함한다. 즉. 생성자와 주석을 제외한 클래스의 최상위 내용들을 말한다.

  3. 주석은 항상 구현한 주석을 말한다. 우리는 "documentation comments" 대신에 "Javadoc"이라는 용어를 사용한다.



3.3 Import 문

3.3.1 와일드카드를 이용한 임포트는 불가

static이든 아니든, 와일드카드(*)를 이용한 임포트는 사용하지 않는다.


3.3.3 순서 및 간격(블록나누기)

임포트 구문은 다음과 같이 표현된다.

  1. 한 블럭에 static 임포트를 포함

  2. 한 블럭에 non-static 임포트를 포함

static import, non-static import가 둘 다 있는 경우 한개의 빈 줄로 두 블록을 구분한다.

import문들 사이에서 위의 경우 이외의 빈 줄은 없다.


3.3.4 클래스에 대한 정적 가져 오기 없음

static 중첩 클래스에서는 static import가 사용되지 않는다.

일반적 import로 사용된다.


3.4 클래스 선언

3.4.2.1 오버로드 : 분리 시키지 말 것

클래스가 여러개의 생성자를 가지거나, 같은 이름의 여러개의 메소드를 가진다면, 이들은 순차적으로 작성되어야 한다.

중간에 다른 코드가 끼어 있으면 안된다.(private 로 선언된 멤버라도



4.2 블럭 들여쓰기 : +2 스페이스 -> +4 스페이스(우테코)

새 블록이나 block-like construct가 열릴 때 마다 두번의 스페이스가 들여쓰기된다. 블록이 끝나면 이전의 들여쓰기 레벨로 돌아간다.


4.5.2 들여쓰기는 계속적으로 적어도 +4의 스페이스를 한다 -> +8 스페이스(우테코)

줄 바꿈을 할 때, 적어도 원래 줄에서 +4의 스페이스만큼 들여쓰기를 한다.


4.7 그룹을 짓는 괄호 : 추천

선택적 그룹핑 괄호는 코드 작성자와 리뷰어가 괄호를 생략해도 잘못 해석될 가능성이 없고, 더 쉽게 읽을 수 있다고 동의할 때 생략가능하다. 모든 독자가 자바의 연산자 우선순위 테이블을 모두 알고 있다고 가정하는 것은 합리적이지 않다.

따라서 연산자 우선순위가 명확하더라도 그룹을 짓는 괄호를 하는 것을 추천한다.

public class MyClass {
  // 수직공백
  public void run() {
    int a = 0;
    int b = 0;
    // 그룹화
    {
      a += 10;
      a -= 5;
      System.out.println(a);
    }
    // 그룹화
    {
      b += 62;
      b -= 3;
      System.out.println(b);
    }
  }
}

4.8.3.2 C-style의 배열 선언은 하지 말 것

대괄호는 변수형에 붙인다. C처럼 변수명에 붙이지 않는다.

String[] args // 허용
String args[] // 안됨

4.8.8 숫자형 리터럴

long 형 변수는 대문자 L을 접미어로 사용한다. 숫자 자릿수 1과 혼동되지 않게 하기 위해 소문자는 절대로 사용하지 않는다.

3000000000L // 허용
3000000000l //안됨


5 네이밍(이름 짓기)

5.2 식별자 타입에 따른 규칙

5.2.1 패키지 이름

패키지 이름은 모두 소문자로 이루어진다.

_를 쓰지 않으며, 단순히 단어들이 연속으로 쓰여진 형태이다.

com.example.deepspace // 가능
com.example.deepSpace // 불가
com.example.deep_space // 불가

5.2.2 클래스 이름

클래스 이름은 UpperCamelCase로 작성된다.

클래스 이름은 명사 또는 명사구 이다. (예를 들어 Character, ImmutableList)

인터페이스 이름도 명사 또는 명사구이다. 하지만 간혹 형용사 또는 형용사구가 대신할 수 있다.(예를 들어 Readable)

어노테이션 타입은 특별한 규칙이나 널리 알려진 규칙은 없다.

테스트 클래스는 테스트하는 클래스의 이름이 앞에 오고, 뒤에 Test로 마무리한다. (예를 들어 HashTest, HashIntegerationTest)


5.2.3 메소드 이름(동사+명사)

메소드 이름은 lowerCamelCase로 작성된다.

메소드는 동사 또는 동사구이다. (sendMessage, stop)

JUnit의 테스트에서는 논리적인 컴포넌트로 분리시키기 위해 밑줄(_)이 나올 수 있다. 각 컴포넌트의 이름은 lowerCamelCase여야 한다.

하나의 전형적인 패턴은 _이다. (예를 들어 pop_emptyStack)

테스트 메소드의 이름을 짓는 정해진 답은 없다.


5.2.4 상수 이름

상수는 모두 대문자이다. 각 단어는 밑줄(_)로 구분된다.(SEND_MESSAGE)

상수란 정확히 무엇인가?

상수는 static final 키워드로 정의된 필드이다. 이 필드의 내용은 불변하며, 메소드는 부작용이 있으면 안된다. 이는 원시 자료형, String, 불변 타입, 불변 타입의 불변 collection을 포함한다. 만약 어떤 인스튼스의 상태가 바뀔 수 있다면 이는 상수가 아니다.

그렇지만 단지 절대 변하지 않는 객체로 표현하는 것은 충분하지 않다.

// 상수
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);
static final Joiner COMMA_JOINER = Joiner.on(','); // Joiner가 불변이기 때문
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// 상수 아님
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final ImmutableMap<String, SomeMutableType> mutableValues =
    ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};

5.2.5 상수가 아닌 필드 이름

상수가 아닌 필드는 (static이던 아니던) lowerCamelCase로 작성한다.
상수가 아닌 필드는 명사 또는 명사구이다. (예를 들면 computedValues, index)


5.2.6 매개변수 이름

매개변수의 이름은 lowerCamelCase로 작성한다.
public 메소드에서 한 문자로 된 파라미터 네이밍은 피해야 한다.


5.2.7 지역변수 이름

지역변수는 lowerCamelCase로 작성한다.
final이나 불변인 지역변수는 상수로 생각되어선 안된다. 따라서 상수 스타일로 네이밍하면 안된다.


5.2.8 타입변수 이름

각 타입 변수는 아래 둘 중 하나의 방법으로 이름을 짓는다.

  • 하나의 대문자, 선택적으로 하나의 숫자 추가가능 (예를 들면 E, T, X, T2).
  • 클래스를 위한 이름형식(5.2.2 클래스 이름 참고) 에 대문자 추가 (예를 들면, RequestT, FooBarT)


6 프로그래밍 연습

6.1 @override : 항상 명시

@Override 어노테이션을 사용할 수 있는 메소드 마다 붙인다. 이는 슈퍼클래스의 메소드를 오버라이딩하고 있음을 표현하거나, 클래스 메소드가 인터페이스 메소드를 구현하고 있음을 표현하거나, 인터페이스 메소드가 슈퍼인터페이스 메소드를 재구현하고 있음을 표현한다.


6.3 Static 멤버 : 클래스를 사용할 수 있다.

static 클래스 멤버로의 참조는 사용 할 수 있다는 자격이 있어야 하는데, 클래스의 이름으로 자격을 증명한다. 클래스 타입이나 인스턴스 참조가 아니다.



참조

0개의 댓글