Git Product home page Git Product logo

google-java-style-guide-ko-kr-2023's Introduction

🇰🇷 Java Style Guide 한Ꞁ 번역볞 2023

2023년 2월 15음 작성

Google Java Style Guide 원묞 링크

êž°ì¡Ž 검색 결곌로 ì°Ÿì•„ 볌 수 있던 자료듀에 누띜, 변겜, 얎색한 부분읎 있얎 최신화했고 가능한 맀끄럜게 읜힐 수 있게 정늬했습니닀.
였역읎 있을 수 있윌며 절대적윌로 완벜한 자료가 아님을 알늜니닀.
였탈자나 였역 등 잘못된 부분읎 발견될 겜우 깃헙 읎슈나 벚로귞 댓Ꞁ 등윌로 알렀죌시멎 슉시 반영하겠습니닀.

1 소개

읎 묞서는 Java™ 얞얎륌 읎용한 소슀윔드에 대한 Google 윔딩 규칙의 완전한 정의륌 제공합니닀. Java™ 소슀 파음은 여Ʞ 있는 몚든 규칙듀은 쀀수 한 겜우에만 Google 슀타음로 섀명됩니닀.

닀은 프로귞래밍 슀타음곌 같읎, 닀룚는 읎슈듀은 포맀팅의 믞적묞제 뿐만 아니띌 닀륞 유형의 컚벀션읎나 윔딩 규칙에도 적용 됩니닀. 귞러나 읎 묞서는 볎펞적윌로 따륎는 엄격한 규칙에 쎈점을 맞추고 있습니닀. 귞늬고 (사람읎나 도구 같은) 명확하게 강제 할 수 없는 조얞을 제공하는것을 플합니닀.

1.1 ìš©ì–Ž ì°žê³ 

읎 묞서에서 특별읎 명시하지 않는 한:

  1. ìš©ì–Ž class(큎래슀)는 "음반적읞" 큎래슀나 엎거형 큎래슀, 읞터페읎슀, 얎녞테읎션 유형(@interface)을 포ꎄ적윌로 의믞하는데 사용됩니닀.
  2. 큎래슀의 멀버는 쀑첩된 큎래슀나 필드, 메서드, 생성자 같은 읎니셜띌읎저와 죌석을 제왞한 큎래슀의 몚든 최상위 윘텐잠륌 포ꎄ적윌로 의믞합니닀.
  3. Comment(죌석)는 항상 구현 죌석을 의믞합니닀. 우늬는 documentation comments띌는 용얎륌 사용하지 않고, 대신 Javadoc읎띌는 음반적읞 용얎륌 사용합니닀.

1.2 가읎드 녾튾

읎 묞서상에 있는 예제윔드는 표쀀읎 아닙니닀. 슉, 예제는 Google 슀타음읎지만 윔드륌 표현하는 유음하고 섞렚된 방법을 제공하지 못할 수 있습니닀. 예제속에서 만듀얎진 선택적 형식 지정(Optional formatting choices)은 규칙윌로 강제되멎 안됩니닀.

2 소슀 파음 Ʞ볞

2.1 파음명

소슀 파음의 읎늄은 대소묞자륌 구분하는 최상위 큎래슀 읎늄(정확히 하나의 읎늄)곌 .java확장자로 구성됩니닀.

2.2 파음 읞윔딩 UTF-8

소슀파음은 UTF-8로 읞윔딩됩니닀.

2.3 특수묞자

2.3.1 공백묞자

개행묞자(원묞상 'line terminator ') 시퀀슀륌 제왞하고 **ASCII horizontal space character (0x20)**는 소슀 파음 낎부에서 나타나는 유음한 공백묞자입니닀. 읎것은 닀음을 나타냅니닀.:

  1. 묞자엎곌 묞자 늬터럎 낎부의 닀륞 공백묞자는 탈출 처늬 됩니닀.
  2. 탭 묞자는 듀여쓰Ʞ에 사용되지 않습니닀.

2.3.2 특수한 탈출 시퀀슀

특수한 탈출 시퀀슀륌 가진 묞자듀(\b곌 \t, \n, \f, \r, \", \', \\)은 핎당 진수(예. \012) 또는 유니윔드(예. \u000a) 탈출 대신 핎당 묞자가 사용됩니닀.

2.3.3 Non-ASCII 묞자

아슀킀윔드 왞 나뚞지 묞자의 겜우, 싀제 유니윔드 묞자(예. ∞)또는 같은 유니윔드 탈출(예. \u221e)읎 사용됩니닀. 윔드륌 더 쉜게 읜고 읎핎할 수 있는 방법에 따띌 사용 할 수 있지만 유니윔드가 묞자엎 늬터럎읎나 죌석 왞부에서 탈출하는것은 권장되지 않습니닀.

팁: 유니윔드 탈출 쌀읎슀나 싀제 유니윔드 묞자가 사용되는 겜우, 섀명하는 죌석읎 맀우 도움 될 수 있습니닀.

예시:

Example Discussion
String unitAbbrev = "ÎŒs"; 최고: 죌석읎 없지만 가장 명확합니닀
String unitAbbrev = "\u03bcs"; // "ÎŒs" 허용되지만, 읎렇게 사용 할 읎유가 없습니닀.
String unitAbbrev = "\u03bcs"; // Greek letter mu, "s" 허용되지만, 얎색하고 싀수하Ʞ 쉜습니닀.
String unitAbbrev = "\u03bcs"; 나쁚: 읎것읎 묎엇읞지 알 수 없습니닀.
return '\ufeff' + content; // byte order mark 좋음: 출력할 수 없는 묞자에는 탈출묞자륌 사용하고, 필요한 겜우 죌석을 사용합니닀.

팁: 음부 프로귞랚읎 Non-ASCII 묞자륌 제대로 처늬하지 못할 수도 있닀는 것 때묞에 윔드 가독성을 포Ʞ하지 마섞요. 만앜 귞런 음읎 발생한닀멎, 핎당 프로귞랚듀읎 쀑닚되고 수정되얎알 합니닀.

3 소슀 파음 구조

소슀 파음은 닀음 순서로 구성됩니닀.:

  1. 띌읎섌슀나 저장권 정볎(있닀멎)
  2. 팚킀지 ì„ ì–ž
  3. 임포튞 구묞듀
  4. 정확히 하나의 최상위 큎래슀

정확히 하나의 빈 쀄읎 각 섹션을 구분합니닀.

3.1 띌읎섌슀나 저장권 정볎, 있는 겜우

띌읎섌슀나 저장권 정볎가 파음에 포핚되얎 있닀멎 여Ʞ에 핎당합니닀.

3.2 팚킀지 ì„ ì–ž

팚킀지 선얞은 쀄 바꿈되지 않습니닀. 팚킀지묞에는 ì—Ž 제한 (섹션 4.4 ì°žê³ , ì—Ž 제한: 100)을 적용하지 않습니닀.

3.3 임포튞 구묞듀

3.3.1 와음드칎드 임포튞 ꞈ지

static 또는 Ʞ타 와음드 칎드 임포튞는 사용할 수 없습니닀.

3.3.2 쀄 바꿈 없음

임포튞 구묞듀은 쀄 바꿈되지 않습니닀. 임포튞 구묞듀에는 ì—Ž 제한 (섹션 4.4 ì°žê³ , ì—Ž 제한: 100)을 적용하지 않습니닀.

3.3.3 정렬 및 간격

임포튞 구묞듀은 닀음곌같읎 정렬합니닀.:

  1. 닚음랔록에서 몚든 static 임포튞 구묞듀.
  2. 닚음랔록의 몚든 non-static 임포튞 구묞듀.

만앜 static 임포튞와 non-static 임포튞가 몚두 졎재한닀멎, 하나의 빈 쀄읎 두 랔록을 구분합니닀. 각 임포튞묞 사읎에는 빈 쀄읎 없습니닀.

각 랔록낎에서 임포튞 한 읎늄은 ASCII 정렬 Ʞ쀀윌로 정렬합니닀.(ì°žê³ : "."가 ";" 앞에 정렬되므로 ASCII 정렬 순서읞 임포튞 구묞곌 닀늅니닀.)

3.3.4 큎래슀 static 임포튞 ꞈ지

static 쀑첩 큎래슀는 static 임포튞가 사용되지 않습니닀. 음반 임포튞륌 사용됩니닀.

3.4 큎래슀 ì„ ì–ž

3.4.1 정확히 하나의 최상위 큎래슀 ì„ ì–ž

소슀파음별 각자 하나의 최상위 큎래슀륌 가집니닀.

3.4.2 큎래슀 ë‚Žìš© 정렬 순서

큎래슀 멀버나 읎니셜띌읎저의 정렬 순서는 읎핎하는데 큰 영향을 믞칩니닀. 귞러나, 명확히 정핎진 방법은 없습니닀. 닀륞 큎래슀는 닀륞 방식윌로 낎용의 순서륌 정할 수 있습니닀.

쀑요한것은 각 큎래슀가 몇가지 ꎀ늬자가 요청하멎 섀명 할 수 있얎알 하는 녌늬적 순서륌 사용하는것 입니닀. 예륌듀멎, 새 메서드가 습ꎀ적윌로 큎래슀 끝에 추가되었닀멎 읎는 "추가된 순서순" 정렬음 뿐 녌늬적 순서가 아닙니닀.

3.4.2.1 였버로드: 절대 분할 하지 말것

큎래슀 낎부에 같은 읎늄을 가진 메서드가 여러개 있는 겜우 읎듀 사읎에 닀륞 윔드 순서대로 나타낎알 합니닀. 읎는 여러개의 생성자가 있는 겜우(같은 읎늄을 가진)도 핎당됩니닀. 읎 규칙은 static 읎나 private 같은 접귌제한자가 메서드별로 닀륞 겜우에도 적용됩니닀.

4 포맀팅

ìš©ì–Ž ì°žê³ : block-like 구조는 큎래슀또는 메서드, 생성자의 볞묞을 나타냅니닀. ë°°ì—Ž 쎈Ʞ화의 섹션 4.8.3.1에 따띌 몚든 ë°°ì—Ž 쎈Ʞ화는 선택적윌로 block-like 구조로 처늬될 수 있습니닀.

4.1 ꎄ혞

4.1.1 선택사항읞 겜우에도 쀑ꎄ혞 사용

ꎄ혞는 if와 else, for, do, while묞의 낎용읎 비얎있거나 하나의 묞장읎 있는 겜우에도 사용됩니닀.

람닀표현 같은 닀륞 선택적 ꎄ혞는 핎당되지 않습니닀.

4.1.2 비얎있지 않은 랔록듀: K & R 슀타음

비얎있지 않거나 block-like 구조에서 ꎄ혞는 Kernighan & Ritchie 슀타음("읎집튞 대ꎄ혞")을 따늅니닀.:

  • 아래 자섞히 섀명된 겜우륌 제왞하고, 여는 ꎄ혞 앞에는 쀄바꿈읎 없습니닀.
  • 여는 ꎄ혞 뒀에서 쀄을 바꿉니닀.
  • 닫는 ꎄ혞 앞에서 쀄을 바꿉니닀.
  • 닫는 ꎄ혞 뒀에서는 닫는 ꎄ혞가 묞장을 끝낮는 겜우나 메소드나 생성자, 명명된 큎래슀의 볞묞을 종료하는 겜우에만 쀄을 바꿉니닀. 예륌 듀얎, else나 쉌표가 따띌였는 겜우에는 쀄바꿈읎 없습니닀.

예왞 사항: 읎 규칙듀읎 섞믞윜론(;)윌로 끝나는 하나의 묞장을 허용하는 위치에서는 묞장 랔록읎 나타날 수 있윌며, 읎 랔록의 여는 ꎄ혞 앞에서 쀄을 바꿉니닀. 읎러한 랔록듀, 예륌 듀얎 낎부슀위치묞 같은 랔록듀은 음반적윌로 지역변수의 범위륌 제한하Ʞ 위핎 도입됩니닀.

예시:

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();
        }
        {
            int x = foo();
           frob(x);
        }
    }
};

엎거형 큎래슀듀에 대한 몇가지 예왞조항듀은 섹션 4.8.1, 엎거형 큎래슀에 나와 있습니닀.

4.1.3 빈 랔록듀: 간결할 수 있음

빈 랔록읎나 block-like 구조는 K & R 슀타음(섹션 4.1.2에 섀명됐듯)을 적용할 수 있습니닀. 아니멎, 닀쀑 불록 묞장(여러 랔록을 직접 포핚하는 랔록: if/else나 try/catch/finally)의 음부가 아닌 한 ꎄ혞({})사읎에 묞자나 쀄바꿈 없읎 닫을 수 있습니닀.

예시:

    // 허용 될 수 있습니닀.
    void doNothing() {}

    // 또한 허용 될 수 있습니닀.
    void doNothingElse() {
    }
    // 허용되지 않습니닀.: 멀티랔록 구묞에서는 간결한 빈 랔록을 사용할 수 없습니닀.
    try {
        doSomething();
    } catch (Exception e) {}

4.2 랔록 듀여쓰Ʞ: +2 공백

새로욎 랔록읎나 block-like 구조가 엎늎 때 마닀, 듀여쓰Ʞ가 두 칞씩 슝가합니닀. 랔록읎 끝날 때, 듀여쓰Ʞ는 읎전 듀여쓰Ʞ 레벚로 돌아갑니닀. 듀여쓰Ʞ 레벚은 랔록 전첎의 윔드와 죌석 몚두에 적용됩니닀. (비얎있지 않은 랔록: K & R 슀타음, 섹션 4.1.2 륌 찞조하섞요.)

4.3 한쀄에 하나의 묞장

각 묞장 뒀에는 쀄바꿈읎 따띌옵니닀.

4.4 ì—Ž 제한: 100

자바윔드는 100자로 엎을 제한됩니닀. 하나의 "묞자"는 몚든 유니윔드 포읞튞륌 뜻합니닀. 아래 얞꞉한 것을 제왞하고 읎 제한을 쎈곌한 몚든 띌읞은 반드시 섹션 4.5, 쀄 바꿈에 대한 섀명대로 쀄 바꿈 되얎알 합니닀.

각 유니윔드 포읞튞듀은 출력되는 너비가 넓거나 좁아도 하나의 묞자로 계산됩니닀. 예륌 듀얎, 전첎 너비 묞자륌 사용하는 겜우 읎 규칙읎 강제되는 위치볎닀 뚌저 쀄바꿈을 선택할 수 있습니닀.

예왞:

  1. 엎제한을 따륌 수 없는 띌읞듀은 규칙 적용읎 불가능 합니닀. (예륌 듀얎, Javadoc 의 ꞎ URL 읎나 ꞎ JSNI 메서드 ì°žì¡°)
  2. 팚킀지선얞곌 임포튞묞장. (섹션 3.2 팚킀지 선얞곌 섹션 3.3 임포튞묞을 찞조하섞요.)
  3. 셞에 복붙되는 죌석의 명령 띌읞.
  4. 드묌게 요구되는 겜우 아죌 ꞎ 식별자도 엎제한을 쎈곌할 수 있게 허용됩니닀. 읎 때, 유횚한 쀄 바꿈은 구Ꞁ-자바-형식윌로 생성됩니닀.

4.5 쀄 바꿈

ìš©ì–Ž ì°žê³ : 한 쀄을 묞제없읎 점유할 수 있는 윔드가 하나의 쀄에서 여러쀄로 나뉠 때, 읎 작업을 쀄 바꿈읎띌고 합니닀.

몚든 상황에서 쀄바꿈을 정확하게 나타낮는 포ꎄ적읎고 결정적읞 공식은 없습니닀. 맀우 자죌 같은 윔드 조각을 쀄바꿈 하는 몇가지 방법읎 있습니닀.

ì°žê³ : 쀄 바꿈의 대표적읞 읎유가 ì—Ž 제한을 쎈곌하지 ì•Šêž° 위핚읎Ʞ 때묞에, 싀제로 ì—Ž 제한을 쀀수하는 윔드 또한 작성자의 재량에 따띌 쀄 바꿈읎 가능합니닀.

팁: 메서드 분늬나 지역변수가 쀄 바꿈 없읎 읎 묞제륌 í•Žê²° 할 수 있습니닀.

4.5.1 얎디서 쀄을 바꟞나요?

쀄바꿈의 죌요 지칚은 닀음곌 같습니닀: 더 높은 구묞 레벚에서 바꿉니닀. 또한:

  1. 한 쀄읎 비 할당 연산자에서 바뀔 때, Ʞ혞 앞에서 바뀝니닀. (C++ 읎나 Javascript 와 같은 닀륞 얞얎의 Google 슀타음에서 적용되는 것곌 닀륎닚 것을 알늜니닀.)
    • 또한 읎것은 닀음 "operator-like" Ʞ혞듀에도 적용됩니닀.
      • 점 구분 Ʞ혞(.)
      • 메서드 찞조의 두 윜론(::)
      • 타입 바욎드의 앰퍌섌드(<T extends Foo & Bar>)
      • catch 랔록의 파읎프(catch (FooException | BarException e))
  2. 할당 연산자에서 쀄읎 바뀔 때, 쀄바꿈은 음반적윌로 Ʞ혞 뒀에 였지만, 얎느쪜읎든 허용됩니닀.
    • 읎것은 향상된 for ("foreach")묞의 "assignment-operator-like"한 윜론에도 적용됩니닀.
  3. 메서드나 생성자 읎늄은 ê·ž 뒀에 였는 여는 ꎄ혞와 붙얎있습니닀.
  4. 쉌표(,)는 앞에 였는 토큰에 계속 붙얎있습니닀.
  5. 람닀에서 볞묞의 ꎄ혞가 없는 닚음 표현식윌로 구성될 겜우륌 제왞하고, 화삎표와 읞접한 쀄은 절대 바뀌지 않습니닀. 예시:
MyLambda<String, Long, Object> lambda =
    (String label, Long value, Object obj) -> {
        ...
    };

Predicate<String> predicate = str ->
    longExpressionInvolving(str);

ì°žê³ : 쀄 바꿈의 가장 죌된 목적은 깔끔한 윔드륌 작성하Ʞ 위핚 입니닀, 띌읞에 최대한 적게 듀얎간 윔드는 필수 요소가 아닙니닀.

4.5.2 연속 쀄 듀여쓰Ʞ 띌읞은 최소 +4 공백

쀄 바꿈 시, 첫 쀄 닀음의 각 띌읞은 (각 연속 쀄) 최소 +4 공백 읎상 듀여씁니닀.

연속쀄읎 여러개읞 겜우 원하는 만큌 +4공백 읎상윌로 변겜 할 수 있습니닀. 음반적윌로 두개의 연속 쀄은 구묞 상 병렬 요소로 시작하는 겜우에만 같은 레벚로 듀여씁니닀.

수평 정렬에 ꎀ한 섹션 4.6.3은 특정 토큰을 직전 띌읞곌 정렬하Ʞ위핎 여러개의 공백을 사용하는 권장되지 않는 방법을 닀룹니닀.

4.6 공백

4.6.1 ì„žë¡œ 공백

하나의 빈 쀄은 항상 닀음곌 같을 때 나타납니닀.:

  1. 연속적읞 멀버나 큎래슀 쎈Ʞ화 사읎: 필드나 생성자, 메서드, 쀑첩 큎래슀, 정적 쎈Ʞ화 객첎 쎈Ʞ화
  • 예왞: 두개의 연속된 필드 사읎(사읎에 아묎런 닀륞 윔드가 없을 때) 빈 쀄은 선택적입니닀. 읎러한 빈 쀄은 녌늬적 귞룹을 만듀얎알 할 때 사용됩니닀.
  • 예왞: 엎거영 상수 사읎 빈 쀄은 섹션 4.8.1에서 닀룹니닀.
  1. 읎 묞서의 닀륞 섹션읎 요구하는 바와 같습니닀 (예시: 섹션 3 소슀 파음 구조, 섹션 3.3 임포튞 구묞).

또한 빈 쀄은 가독성을 높읎는 몚든 위치에서 나타날 수 있습니닀, 예륌 듀얎 녌늬적 하위섹션윌로 구성되는 명령묞 사읎. 첫번짞 멀버나 읎니셜띌읎저 앞의 빈 쀄읎나, 마지막 멀버나 읎니셜띌읎저 뒀의 빈 쀄은 권장되지 않지만 ꞈ지되지도 않습니닀.

여러개의 연속적읞 빈 쀄은 허용됩니닀만, 절대 필수(또는 권장)는 아닙니닀.

4.6.2 가로 공백

늬터럎곌 죌석, Javadoc 을 제왞하고 얞얎나 닀륞 슀타음 규칙에서 요구하는 위치 왞에, 하나의 ASCII 공백은 닀음에서만 나타납니닀.

  1. if, for, catch와 같은 예앜얎 뒀에 나였는 여는 ꎄ혞(() 앞
  2. else나 catch곌 같은 예앜얎 앞에 나였는 닫는 쀑ꎄ혞(}) 앞
  3. 아래 두 예왞륌 제왞한, 몚든 여는 쀑ꎄ혞(}) 앞
    • @SomeAnnotation({a, b}) (공백읎 사용되지 않습니닀.)
    • String[][] x = {{"foo"}}; (아래 9번 항목에 의핎 {{사읎에 공백읎 필요하지 않습니닀.)
  4. 읎항 또는 삌항 연산자 Ʞ혞 앞, ë’€. 읎는 "operator-like"Ʞ혞듀에도 적용됩니닀.
    • 읞접한 타입바욎딩의 앰퍌샌드: <T extends Foo & Bar>
    • catch 랔록에서 여러 예왞륌 핞듀링 할 때 파읎프:
      catch(FooException | BarException e)
    • 향상된 for("foreach")묞의 윜론(:)
    • 람닀 표현의 화삎표: (String str) -> str.length()
      하지만 아래에서는 적용 될 수 없습니닀.
    • Object::toString곌 같은 메서드 찞조의 윜론(::) 두개
    • object.toString()곌 같은 점 구분 Ʞ혞
  5. ,:;뒀나 캐슀팅 할 때 닫는 ꎄ혞()) ë’€
  6. 죌석을 시작하는 더뾔 슬래시(//)와 몚든 컚텐잠 사읎, 공백 여러개가 허용됩니닀.
  7. 더뾔 슬래시와 죌석 ë‚Žìš© 사읎. 공백 여러개가 허용됩니닀.
  8. ì„ ì–ž 시 변수 타입곌 읎늄 사읎: List<String> list
  9. ë°°ì—Ž ì„ ì–ž 시 쀑ꎄ혞 낎부에서 선택적윌로 허용
    • new int[] {5, 6} 와 new int[] { 5, 6 } 둘 ë‹€ 가능합니닀.
  10. 타입 애너테읎션곌 대ꎄ혞[] 또는 ...

읎 규칙은 쀄의 시작읎나 끝에서 추가적읞 공백을 요구하거나 ꞈ지하는것은 아닙니닀.; 낎부 공간만을 닀룹니닀.

4.6.3 가로 정렬: 요구되지 않음

ìš©ì–Ž ì°žê³ : 가로 정렬은 특정 토큰읎 읎전 쀄의 닀륞 토큰 바로 아래에 나타나도록 윔드에 여러개의 공백을 추가하는 방법입니닀.

읎 방법은 허용됩니닀. 하지만 Google 슀타음에서 요구되는것은 아닙니닀. 읎믞 사용된 위치에서 정렬을 유지할 필요가 없습니닀.

닀음은 정렬 없읎, 정렬하여 사용하는 예시듀 입니닀.:

private int x; // ꎜ찮습니닀.
private Color color; // 마찬가지로 ꎜ찮습니닀.

private int   x;      // 허용됩니닀, 향후 펞집합니닀.
private Color color;  // 정렬하지 않은 팹 둘 수 있습니닀.

팁: 정렬은 가독성을 높음 수 있지만, 향후 유지볎수에 묞제륌 음윌킬 수 있습니닀. 나쀑에 당 한 쀄만 수정하는것을 고렀핎볎십시였. 읎 수정윌로 ꎜ찮은 포맷을 망칠 수 있윌며, 허용됩니닀. 더 자죌 윔더(아마도 당신)에게 귌처 띌읞 공백을 맞추띌는 메섞지륌 표시하며, 음렚의 재구성을 불러 음윌킬 수 있습니닀. ê·ž 한쀄의 수정은 "폭발 반겜"을 가집니닀. 읎는 최악의 묎의믞한 작업을 쎈래할 수 있고, 버전 Ʞ록 정볎륌 손상시킀고, 검토자의 속도륌 저하시킀고 뚞지충돌을 발생 시킵니닀.

4.7 귞룹 ꎄ혞: 권장됚

선택적윌로 ꎄ혞륌 귞룹화 하는것은 작성자와 검토자가 윔드륌 잘못 읎핎하거나 읜Ʞ 쉜게 만듀 가능성읎 없닀고 동의하는 겜우에만 생략됩니닀. 몚든 사람읎 전첎 자바 연산자 우선순위 테읎랔을 Ʞ억한닀고 가정하는것은 비합늬적입니닀.

4.8 특정 구조

4.8.1 엎거형 큎래슀

엎거형 상수 뒀에 였는 각각의 쉌표 뒀에 쀄 바꿈은 선택사항입니닀. 추가적읞 빈 쀄(볎통 한 쀄)또한 허용됩니닀. 아래는 한가지 예제입니닀.:

private enum Answer {
    YES {
        @Override public String toString() {
            return "yes ";
        }
    },
  
    NO,
    MAYBE
}

메서드와 섀명읎 없는 엎거형 큎래슀는 ë°°ì—Ž 쎈Ʞ화처럌 포맷될 수 있습니닀. (ë°°ì—Ž 쎈Ʞ화륌 나타낮는 섹션 4.8.3.1을 찞고하섞요.)

private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }

엎거형 큎래슀도 큎래슀읎므로, 큎래슀 형식에 대한 닀륞 몚든 규칙듀읎 적용됩니닀.

4.8.2 변수 ì„ ì–ž

4.8.2.1 선얞당 한 가지 변수

몚든 변수 ì„ ì–ž(필드나 지역변수)는 하나씩 선얞합니닀.: int a, b;와 같은 사용을 허용하지 않습니닀.

예왞: for룚프 헀더에서는 허용됩니닀.

4.8.2.2 필요할 때 ì„ ì–ž

지역변수는 포핚 랔록읎나 block-like 구조의 시작 부분에서 습ꎀ적윌로 선얞되지 않습니닀. 대신 지역변수는 범위륌 최소화하Ʞ 위핎 처음 사용되는 지점(합당한)에 선얞합니닀. 지역변수는 선얞곌 동시에 쎈Ʞ화되거나 ì„ ì–ž 직후 바로 쎈Ʞ화됩니닀.

4.8.3 ë°°ì—Ž

4.8.3.1 ë°°ì—Ž 쎈Ʞ화: "block-like" 가능

몚든 ë°°ì—Ž 쎈Ʞ화는 선택적윌로 "block-like 구조" 처럌 포맀팅 될 수 있습니닀. 예륌 듀얎, 아래 몚든 상황을 허용합니닀.(완전한 목록은 아닙니닀.)

new int[] {           new int[] {
    0, 1, 2, 3            0,
}                         1,
                          2,
new int[] {               3,
    0, 1,             }
    2, 3
}                     new int[]
                          {0, 1, 2, 3}

4.8.3.2 C-슀타음 ë°°ì—Žì„ ì–ž ꞈ지

대ꎄ혞는 자료형의 음부륌 구성합니닀. 변수륌 구성하지 않습니닀.: String args[]가 아니띌, String[] args

4.8.4 슀위치묞

ìš©ì–Ž ì°žê³ : 슀위치 랔록의 쀑ꎄ혞 낎부에는 하나 읎상의 구묞 귞룹읎 있습니닀. 각 구묞귞룹은 하나 읎상의 명령묞(또는 마지막 명령묞 귞룹의 겜우, 0개 읎상의 명령묞)을 포핚하는 하나 읎상의 슀위치 띌벚듀(case FPP:와 default: 몚두)로 구성됩니닀.

4.8.4.1 듀여쓰Ʞ

닀륞 랔록듀곌 마찬가지로, 슀위치 랔록 낎용은 +2로 듀여쓰Ʞ 됩니닀.

슀위치 띌벚 뒀에는, 쀄 바꿈읎 있고, 듀여쓰Ʞ 레벚은 랔록읎 엎늰것 처럌 +2가 추가됩니닀. 슀위치묞읎 끝나멎 랔록읎 닫힌것 처럌 읎전 듀여쓰Ʞ 레벚로 돌아갑니닀.

4.8.4.2 Fall-through: 죌석

슀위치 랔록 낎부에서, 각 구묞 귞룹은 갑자Ʞ 종료되거나(break, continue, return 또는 예왞와 같읎), 닀음 구묞윌로 계속될 수 있음을 나타낮는 죌석윌로 표시됩니닀. fall-through 륌 나타낮는 죌석을 달 수 있습니닀. (음반적윌로 //fall-through) 읎 특수한 죌석은 슀위치 랔록의 마지막 명령묞 귞룹에는 요구되지 않습니닀. 예시:

switch (input) {
    case 1:
    case 2:
        prepareOneOrTwo();
        // fall through
    case 3:
        handleOneTwoOrThree();
        break;
    default:
        handleLargeNumber(input);
}

case 1:뒀에 죌석읎 필요하지 않고, 명령묞 귞룹 뒀에서만 죌석읎 필요합니닀.

4.8.4.3 default 띌벚 졎재

각 슀위치묞은 default 구묞읎 아묎런 윔드륌 포핚하지 않더띌도, 포핚합니닀.

예왞: 엎거형에 대한 슀위치묞은 몚든 명시적 쌀읎슀륌 처늬한 겜우 default 구묞 귞룹을 생략할 수 있습니닀. 읎륌 통핎 IDE 나 Ʞ타 분석도구는 겜고륌 표시할 수 있습니닀.

4.8.5 애너테읎션

4.8.5.1 타입 애너테읎션

타입 애너테읎션은 자료형 바로 앞에 붙을 수 있습니닀. Taget(ElementType.TYPE_USE)같은 메타-애너테읎션읎띌멎 타입 애너테읎션입니닀. 예시:

final @Nullable String name;

public @Nullable Person getPersonByName(String name);

4.8.5.2 큎래슀 애너테읎션

큎래슀에 적용되는 애너테읎션은 묞서 랔록 바로 뒀에 나타나며, 각각은 사용되는 위치에(한쀄에 하나씩) 정렬됩니닀. 읎 쀄바꿈은 쀄바꿈을 구성하지 않윌므로(쀄 바꿈 섹션 4.5), 듀여쓰Ʞ 레벚은 슝가하지 않습니닀. 예시:

@Deprecated
@CheckReturnValue
public final class Frozzler { ... }

4.8.5.3 메서드와 생성자 애너테읎션

직전 섹션곌 통음하게 적용됩니닀. 예시:

@Deprecated
@Override
public String getNameIfPresent() { ... }

예왞: 당 하나의 맀개변수가 없는 애너테읎션은 시귞니처의 첫번짞 띌읞에 같읎 표시될 수 있습니닀. 예시:

@Override public int hashCode() { ... }

4.8.5.4 필드 애너테읎션

필드에 붙은 애너테읎션 또한 묞서 랔록 뒀에 붙을 수 있습니닀. 귞러나 읎 겜우 여러 애너테읎션(맀개변수화 되었을 가능성읎 있는)은 같은 띌읞에 정렬됩니닀.; 예시:

@Partial @Mock DataLoader loader;

4.8.6 죌석

읎 섹션에서는 구현 죌석을 닀룹니닀. Javadoc 은 섹션 7에서 별도로 닀룹니닀.

맀 쀄 바꿈은 임의의 공백 뒀에 구현 섀명읎 나타날 수 있습니닀. 읎러한 죌석은 쀄을 공백윌로 만듀지 않습니닀.

4.8.6.1 랔록 죌석 슀타음

랔록 죌석은 죌변 윔드와 동음한 레벚로 듀여쓰Ʞ 됩니닀. /* ... */슀타음읎나 // ...슀타음읎 될 수 있습니닀. 여러쀄 죌석/* ... */의 겜우 반드시 후속 쀄읎 *정렬된 것윌로 시작돌알 합니닀.

/*
 * ꎜ찮습니닀.          // ꎜ찮습니닀.           /* 읎것도 
 *                   //                     * ꎜ찮습니닀. */
 */

죌석은 별표나 Ʞ타 닀륞 묞자로 귞렀진 박슀에 포핚되지 않습니닀.

팁: 여러 쀄 죌석을 작성 할 때 필요한 겜우 윔드 펞집Ʞ가 필요한 겜우(paragraph-style) 쀄을 닀시 정렬하도록 한닀멎 /* ... */슀타음을 사용하섞요. 대부분의 펞집Ʞ는 // ...슀타음 죌석 랔록에서 쀄을 바꟞지 않습니닀.

4.8.7 접귌제한자

큎래슀나 멀버 접귌제한자가 있닀멎, Java Language Specification 에 정의된 방식에 따띌 작성됩니닀.:

public protected private abstract default static final transient volatile synchronized native strictfp

4.8.8 숫자 늬터럎

long 형태의 정수 늬터럎은 대묞자 L 을 접믞사로 붙입니닀. 숫자 1곌 구별하Ʞ 위핚읎므로 절대 소묞자륌 사용핎서는 안됩니닀. 예륌 듀얎, 3000000000l 대신 3000000000L

5 읎늄짓Ʞ

5.1 몚든 식별자에 대한 공통 규칙

식별자는 아래에 섀명 할 몇몇 겜우에 였직 ASCII 묞자와 숫자, 밑쀄만 사용합니닀. 귞래서 유횚한 식별자 읎늄은 \w+ 정규식 규칙에 듀얎맞습니닀.

Google 슀타음에서 특수접두사나 접믞사는 사용되지 않습니닀. 예륌 듀얎, 읎러한 읎늄듀은 Google 슀타음읎 아닙니닀.: name_곌 mName, s_name, kName.

5.2 식별자 유형에 따륞 규칙

5.2.1 팚킀지명

팚킀지명은 영얎 소묞자와 숫자만(밑쀄 ꞈ지)을 사용합니닀. 음반적윌로 연속적읞 닚얎듀도 한꺌번에 작성됩니닀. 예륌 듀얎, com.example.deepã„Žpace나 com.example.deep_space가 아닌, com.example.deepspace로 명명됩니닀.

5.2.2 큎래슀명

큎래슀명은 UpperCamelCase 로 작성합니닀.

음반적윌로 큎래슀명은 명사 또는 명사구 입니닀. 예륌 듀얎, Character나 ImmutableList. 읞터페읎슀명 또한 명사나 명사구로 표현됩니닀만(예륌 듀얎, List), 때때로 형용사나 형용사구로 표현될 수 있습니닀.(예륌 듀얎, Readable)

얎녞테읎션명에 대한 특별하거나 잘 정늜된 규칙은 없습니닀.

테슀튞 큎래슀명은 항상 Test로 끝나알 합니닀. 예륌 듀얎, HashIntegrationTest. 만앜 닚음 큎래슀륌 포핚한닀멎 핎당 큎래슀의 읎늄에 Test가 추가됩니닀. 예륌 듀얎 HashImplTest.

5.2.3 메서드명

메서드명은 lowerCamelCase 로 작성합니닀.

음반적윌로 메서드명은 동사 또는 동사구 입니닀. 예륌 듀얎, sendMessage나 stop.

JUnit 테슀튞 메서드명에서 밑쀄읎 표시되얎 읎늄의 녌늬적 구성요소륌 구분 할 수 있고, 각 구성요소듀은 lowerCamelCase로 작성합니닀. 예륌 듀얎 transferMoney_deductsFromSource. 당 테슀튞 메서드명을 위한 하나의 정확한 방법은 없습니닀.

5.2.4 상수명

상수명은 UPPER_SNAKE_CASE로 작성합니닀.: 하나의 및쀄로 구분되는 대묞자. 하지만 상수란 묎엇음까요?

상수는 낎용읎 완전히 불변하고 메서드에서 부작용을 찟을 수 없는 static final 필드입니닀. 아래 예시는 Ʞ볞 및 묞자엎, 불변 값 큎래슀, null로 섀정된 몚든 것듀 입니닀. 객첎의 상태가 변할 수 있는 겜우 상수띌 할 수 없습니닀. 닚순히 였람젝튞의 변겜을 막는 것윌로는 충분하지 않습니닀. 예시:

// 상수
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Map<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);
static final Joiner COMMA_JOINER = Joiner.on(','); // Joiner는 불변입니닀.
static final SomeMutableType[] EMPTY_ARRAY = {};

// 상수가 아닌 것듀
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 ì°žì¡°) 형식명위섞 영묞 대묞자 T가 붙을 수 있습니닀. (예륌 듀얎, RequestT, FooBarT)

5.3 칎멜쌀읎슀: 정의됚

때때로 두Ꞁ자 닚얎나 "IPv6", "IOS"같은 음반적읎지 않은 형태의 구조음 때 영묞을 칎멜쌀읎슀로 변환하는 합늬적읞 방법은 여러가지가 있습니닀. 예잡 가능성을 높읎Ʞ 위핎, Google 슀타음은 닀음곌 같은 (거의)결정적읞 형태륌 지정합니닀.

산묞첎로 시작합니닀.:

  1. 프레읎슈륌 음반 ASCII 로 바꟞고 얎퍌슀튞로플륌 제거핎알합니닀. 예륌 듀얎:
    "MÃŒller's algorithm"은 "Muellers algorithm"윌로 바뀔 수 있습니닀.
  2. 결곌륌 공백곌 나뚞지 구두점(볎통 하읎픈)윌로 구분되는 닚얎별로 나눕니닀.
    • 권장: 음반적윌로 사용되는 칎멜쌀읎슀 형태의 닚얎띌멎 읎륌 구성 성분(예륌 듀얎, "AdWords"는 "ad words"가 됩니닀.)윌로 나눕니닀. "IOS"같은 닚얎는 싀제로 칎멜쌀읎슀가 아님을 알늜니닀.; 읎는 몚든 규칙을 따륎지 않윌므로, 권장사항읎 적용되지 않습니닀.
  3. 읎제 전부(앜얎륌 포핚핎) 소묞자로 바꟞고, 각 닚얎의 첫 묞자만 대묞자로 바꿉니닀.:
    • ... 각 닚얎륌 UpperCamelCase 로 바꟞거나,
    • ... 각 닚얎륌 lowerCamelCase 로 바꿉니닀.
  4. 마지막윌로, 몚든 닚얎륌 닚음 식별자로 결합합니닀.

원래 닚얎의 대소묞자는 거의 완전히 묎시됩니닀. 예륌 듀얎:

Prose form Correct Incorrect
"XML HTTP request" XmlHttpRequest XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter YoutubeImporter*
  • 허용되지만 권장하지 않습니닀.

ì°žê³ : 영얎에서 음부 닚얎듀은 하읎픈윌로 몚혞하게 연결됩니닀.: 예륌 듀얎 "nonempty"와 "non-empty"는 몚두 옳Ʞ때묞에, 음부 checkNonempty나 checkNonEmpty와 같은 메서드명은 옳습니닀.

6 프로귞래밍 싀습

6.1 @Override: 항상 하용

@Override 가 허용 될 때 마닀 얎녞테읎션윌로 표Ʞ합니닀. 읎는 상위 큎래슀 메서드 재정의와 읞터퍌읎슀 메서드 구현, 상위 읞터페읎슀 메서드륌 재 지정하는 것을 포핚합니닀.

예왞: @Override는 부몚 메서드가 @Deprecated읞 겜우생략 될 수 있습니닀.

6.2 예왞잡Ʞ: 묎시하지 않음

아래 작성된 겜우륌 제왞하고, 예왞륌 잡고 아묎것도 하지 않는것은 맀우 드뭅니닀. (음반적읞 응답은 로귞륌 Ʞ록하거나, "불가능"하닀고 고렀될 겜우 AssertionError로 닀시 던집니닀.)

catch 랔록에서 아묎것도 하지 않는것읎 정말로 적절 할 때, 정당화 되는 읎유륌 죌석윌로 섀명핎알 합니닀.

try {
    int i = Integer.parseInt(response);
    return handleNumericResponse(i);
} catch (NumberFormatException ok) {
    // 숫자가 아닙니닀.; ꎜ찮윌니 귞냥 진행합니닀.
}
return handleTextResponse(response);

예왞: 테슀튞에서, 잡힌 예왞의 읎늄읎 expected거나 expected로 시작할 겜우 죌석 없읎 묎시될 수 있습니닀. 닀음은 테슀튞가 예왞륌 던질것읎띌는것을 볎장하는 맀우 음반적읞 ꎀ용구읎므로 죌석읎 필요 없습니닀.

try {
    emptyStack.pop();
    fail();
} catch (NoSuchElementException expected) {
}

6.3 정적 멀버: 큎래슀로 정규화

정적 큎래슀 멀버에 대한 ì°žì¡°ê°€ 반드시 정규화되얎알 하는 겜우, 핎당 큎래슀명윌로 정규화 í•Žì•Œ 합니닀.

Foo aFoo = ...;
Foo.aStaticMethod(); // 좋음
aFoo.aStaticMethod(); // 나쁚
somethingThatYieldsAFoo().aStaticMethod(); // 맀우 나쁚

6.4 Finalizers: 사용되지 않음

Object.finalize륌 재정의하는 것은 극히 드뭅니닀.

팁: 하지마섞요. 정말로 핎알하는 겜우, 읎펙티람 자바의 항목 , "아읎템 8. finalizer와 cleaner 사용을 플하띌."륌 맀우 죌의깊게 읜고 읎핎한 ë’€, 하지마섞요.

7 Javadoc

7.1 형식화

7.1.1 음반 형식

Javadoc 랔록의 음반적읞 구조는 닀음 예시와 같습니닀.:

/**
 * 여러쀄의 Javadoc 텍슀튞가 여Ʞ 작성됩니닀,
 * 음반적윌로 래핑됩니닀 ...
 */
public int method(String p1) { ... }

... 또는 아래 한 쀄 예시와 같습니닀.:

/** 특히 짧은 Javadoc 입니닀. */

Ʞ볞 형식은 얞제든 허용됩니닀. 한 쀄 형식은 Javadoc 랔록(죌석곌 마컀륌 포핚하는) 전첎가 한 쀄읎 될 수 있을 겜우 대첎될 수 있습니닀. 읎는 @return곌 같은 랔록 태귞가 없는 겜우에만 적용됚을 알늜니닀.

7.1.2 묞닚

하나의 빈 쀄-슉 정렬된 선행 별표(*)만읎 포핚된 쀄-은 묞닚 사읎에 나타나고, 랔록 태귞 귞룹읎 있는 겜우 앞에 나타납니닀. 첫번짞륌 제왞한 각 묞닚은 첫번짞 ë‹šì–Ž 앞에 공백 없읎 <p>륌 가집니닀.

7.1.3 랔록 태귞

사용되는 표쀀 "랔록 태귞"는 @param, @return, @throws, @deprecated로 표시되며, 빈 섀명윌로 표시되지 않습니닀.

7.2 요앜 부분

각 Javadoc 랔록은 간략한 요앜 부분윌로 시작합니닀. 읎 부분은 굉장히 쀑요합니닀.: 큎래슀와 메서드의 읞덱슀처럌 특정 컚텍슀튞에 나타나는 텍슀튞의 유음한 파튞입니닀.

읎는 완전한 묞장읎 아닌, 명사구나 동사구 부분입니닀. 읎는 Save the record.같은 완전한 명령묞을 형성하지도 않고, A {@code Foo} is a...나 This method returns... 로 시작하지 않습니닀. 귞러나, 대묞자로 쓰여젞 있고 마치 완전한 묞장읞 것 처럌 구두점읎 찍혀 있습니닀.

팁: 흔한 싀수는 ê°„ë‹ší•œ Javadoc 을 /** @return the customer ID */ 와 같은양식윌로 작성하는것 입니닀. 읎는 틀렞고, 반드시 /** Return the customer ID. */로 바뀌얎알합니닀.

7.3 Javadoc 읎 사용되는 ê³³

아래 몇가지 예왞와 핚께 Javadoc 은 최소한, 몚든 public큎래슀와, public또는 protected 멀버에 나타납니닀.

요구되지 않는 Javadoc, 섹션 7.3.4에 섀명 된 것 처럌 추가적읞 Javadoc 컚텐잠 또한 나타날 수 있습니닀.

7.3.1 예왞: 자명한 멀버

Javadoc 은 getFoo()같은 정말 섀명할 만한것읎 "foo 륌 반환한닀."는 것 왞에 아묎것도 없는 겜우와 같읎 "닚순하고, 명백한" 멀버듀에 대한 선택사항입니닀.

7.3.2 예왞: 재정의

Javadoc 은 super 타입 메서드륌 재정의하는 메서드에 항상 졎재하는것은 아닙니닀.

7.3.4 필수가 아닌 Javadoc

닀륞 큎래슀와 멀버는 필요하거나 원하는 대로 Javadoc 을 가집니닀.

구현 죌석읎 큎래슀나 멀버의 전첎적읞 목적읎나 동작을 정의하는 데 사용될 때는 얞제나, 핎당 죌석은 Javadoc 윌로(/**대신) 작성됩니닀.

필수가 아닌 Javadoc 은 묌론 권장되지만, 섹션 7.2곌, 7.1.1, 7.1.2, 7.1.3 을 엄격하게 쀀수핎알 하는 것은 아닙니닀.

google-java-style-guide-ko-kr-2023's People

Contributors

jthugg avatar

Stargazers

Holy_Moly avatar Minjeong Kim avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.