Skip to content

Nangman-corp/Java-Style-Guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

16 Commits
ย 
ย 
ย 
ย 

Repository files navigation

Java Style Guide

๐Ÿ’ก ๋ณธ๋ฌธ์€ ๋‚ญ๋งŒ(Nangman)์˜ Java ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ ์ž…๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ Java ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ



1. ์†Œ๊ฐœ(Intro)


๋ณธ ๋ฌธ์„œ๋Š” Nangman์˜ Java code ์Šคํƒ€์ผ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๋ฌธ์„œ์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ดํ•ดํ•˜์‹  ํ›„ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ธฐ์ˆ  ๋ฌธ์„œ(Spring, Android)๋กœ ์ด๋™ํ•˜์—ฌ ๊ธฐ์ˆ ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ€์ด๋“œ๋ฅผ ์ˆ™์ง€ํ•˜์„ธ์š”!

1.1 ์šฉ์–ด(term)


  1. ํด๋ž˜์Šค(Class) ์šฉ์–ด๋Š” ์•„๋ž˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค
    • ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค - Enum Class
    • ์ธํ„ฐํŽ˜์ด์Šค - Interface
    • ์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž… - Annotation type( @interface )
  2. ํด๋ž˜์Šค ๋ฉค๋ฒ„( Class Member ) ์šฉ์–ด๋Š” ์•„๋ž˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘์ฒฉ๋œ ํด๋ž˜์Šค - Nested Class
    • ํ•„๋“œ - Field
    • ๋ฉ”์„œ๋“œ - Method
    • ์ƒ์„ฑ์ž - Constructor
  3. ์ฃผ์„(Comments) ์šฉ์–ด๋Š” ์•„๋ž˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์ฃผ์„ - Comment(s) : ์†Œ์Šค์ฝ”๋“œ ๋‚ด ๊ตฌํ˜„ ์ฃผ์„
๐Ÿ’ก ๋ฌธ์„œํ˜• ์ฃผ์„์„ ์„ค๋ช…ํ•  ๋•Œ๋Š” Document Comments ๋ผ๋Š” ์šฉ์–ด๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Javadoc์ด ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. ์ด๋ฆ„(Name)

2.1 ๊ณตํ†ต ๊ทœ์น™(common rules)


  • ๋ชจ๋“  ์‹๋ณ„์ž๋Š” ASCII์™€ ์ˆซ์ž๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์‹๋ณ„์ž์— ์ ‘๋ฏธ์‚ฌ์™€ ์ ‘๋‘์‚ฌ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(์˜ˆ์‹œ)
(X) name_ 
(X) mName 
(X) s_name 
(X) kName 

2.2 ํŒŒ์ผ(File)


  • ์ตœ์ƒ์œ„ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๊ฒŒ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์—ฌ ์ž‘์„ฑ(๋‹ค๋ฅธ ํŒŒ์ผ๊ณผ ์ค‘๋ณต๋œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํด๋ž˜์Šค ํŒŒ์ผ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
  • .javaํŒŒ์ผ ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์ŠคํŒŒ์ผ์€ UTF-8 ์ธ์ฝ”๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์œ ๋‹ˆ์ฝ”๋“œ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.3 ํŒจํ‚ค์ง€(Package)


  • ์†Œ๋ฌธ์ž์™€ ์ˆซ์ž๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
(์˜ˆ์‹œ)
(O) com.example.deepspace 
(X) com.example.deepSpace 
(X) com.example.deep_space 

2.4 ํด๋ž˜์Šค(Class)


  • ํด๋ž˜์Šค ์ด๋ฆ„์€ UpperCamelCase ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ์ด๋ฆ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ช…์‚ฌ, ๋ช…์‚ฌ๊ตฌ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
(ํด๋ž˜์Šค ์˜ˆ์‹œ)
(O) CompanyList
(X) Companylist
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ ์ผ๋ถ€ ํ˜•์šฉ์‚ฌ, ํ˜•์šฉ์‚ฌ ๊ตฌ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์‹œ)
(O) CompanyReliableRate
(O) CompanyTrustRate
(X) CompanyLiability
  • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํด๋ž˜์Šค ์ด๋ฆ„ ๋’ค์— Test๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค
(์˜ˆ์‹œ)
(O) CompanyListTest

2.5 ์ƒ์ˆ˜(Constant)


  • ๋Œ€๋ฌธ์ž์™€ ์–ธ๋”๋ฐ”๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” UPPER_SNAKE_CASE๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…์‚ฌ, ๋ช…์‚ฌ๊ตฌ๋กœ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
(์˜ˆ์‹œ)
(O) MAX_MONEY

2.6 ๋ฉ”์†Œ๋“œ(Method)


  • lowerCamelCase๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋™์‚ฌ ๋˜๋Š” ๋™์‚ฌ๊ตฌ ์ž…๋‹ˆ๋‹ค.
(์˜ˆ์‹œ)
(O) sendMessage
(O) stop
(X) companyList
(O) editCompanyList

2.7 ๋ณ€์ˆ˜(Variable)


๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ์œ ํ˜• ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • lowerCamelCase๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ช…์‚ฌ ๋˜๋Š” ๋ช…์‚ฌ๊ตฌ ์ž…๋‹ˆ๋‹ค.
  • ๊ณต์šฉ ๋ฉ”์†Œ๋“œ์—์„œ ํ•œ ๋ฌธ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์ตœ์ข…์ ์ด๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ƒ์ˆ˜๋กœ ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ์œ ํ˜•(Generic) ๋ณ€์ˆ˜๋Š” ๋‹จ์ผ ๋Œ€๋ฌธ์ž, ์„ ํƒ์ ์œผ๋กœ ๋‹จ์ผ ์ˆซ์ž(์˜ˆ:ย E,ย T,ย X,ย T2)๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
(์˜ˆ์‹œ)
(O) maxAge
(O) Request

3. ํฌ๋งท(Format)

3.1 ์†Œ์Šค์ฝ”๋“œ ๊ตฌ์กฐ(Source code Structure)


  1. ๋ผ์ด์„ผ์Šค
  2. Package ๋ฌธ
  3. Import ๋ฌธ
  4. ์†Œ์Šค์ฝ”๋“œ ๊ฐœ์š” ๋“ฑ ์ฝ”๋ฉ˜ํŠธ
  5. Class ์„ ์–ธ
๐Ÿ’ก ๊ฐ ์„น์…˜ ์‚ฌ์ด์—๋Š” ๊ณต๋ฐฑ ๋ผ์ธ์ด ํ•˜๋‚˜ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

3.2 ์ค‘๊ด„ํ˜ธ(Braces)


Kernighan & Ritchie Style์—์„œ ๋ณ€ํ˜•๋œ one true brace style (**OTBS) ๋ฐฉ์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

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);
  }
};
  • if ์ ˆ์˜ ๊ฒฝ์šฐ ๋‹จ ํ•œ์ค„์ด์–ด๋„ ์ค‘๊ด„ํ˜ธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ, ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ”๋กœ ๋‹ซ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
(์˜ˆ์‹œ)
...
void method(){}
...

3.3 ์ค„(Line)


  • ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ์ŠคํŽ˜์ด์Šค 4๊ฐœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค„ ๊ธธ์ด๋Š” 100๊ฐœ์˜ ๋ฌธ์ž๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • ์ค„ ๋ฐ”๊ฟˆ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ์‹ฌ๋ณผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‹ฌ๋ณผ ์•ž์—์„œ ์ค„ ๋ฐ”๊ฟˆํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๋ฌธ์žฅ์ด ๋‚ด๋ ค์˜จ ๊ฒฝ์šฐ ์ฒซ๋ฒˆ์งธ ๋‚ด๋ ค์˜จ ๋ฌธ์žฅ๊ณผ ๋™์ผํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
(์˜ˆ์ œ)
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2);
    numbers.stream()
        .filter(i -> i % 2 == 0)
        .distinct()
        .forEach(System.out::println);

AnnotationConfigApplicationContext ac = 
            new AnnotationConfigApplicationContext(SameBeanConfig.class);

3.4 ๊ณต๋ฐฑ ๋ฌธ์ž(Blank)


  • if, for, catch ์™€ ( ์‚ฌ์ด์— ๊ณต๋ฐฑ๋ฌธ์ž ์‚ฝ์ž….
  • else์™€ catch โ€˜}โ€™์‚ฌ์ด์— ๊ณต๋ฐฑ๋ฌธ์ž ์‚ฝ์ž….
  • , ๋‹ค์Œ์— ๊ณต๋ฐฑ๋ฌธ์ž ์‚ฝ์ž….
  • ์˜ˆ์•ฝ์–ด ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ; ๋’ค์—๋Š” ๊ณต๋ฐฑ๋ฌธ์ž ์‚ฝ์ž….
  • infix ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ ์•ž, ๋’ค๋กœ ๊ณต๋ฐฑ๋ฌธ์ž ์‚ฝ์ž….
Boolean test = true;
if (test) {
	//...
} else {
	//...
}
int testNum = 2 + 1 * (4 / 2) - 25;

for (int i = 0; i < 3; i++) {
	//        
}

3.5 ์–ด๋…ธํ…Œ์ด์…˜(Annotation)


  • ๋“ค์—ฌ์“ฐ๊ธฐ ์ ์šฉํ•˜์ง€ ์•Š์Œ
  • ์œ ํ˜•-์‚ฌ์šฉ ์–ด๋…ธํ…Œ์ด์…˜(Type-use annotations)
  • ์‚ฌ์šฉํ•  ์‹๋ณ„์ž ์•ž์—์„œ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์ธ ๊ฒฝ์šฐ ์œ ํ˜•-์‚ฌ์šฉ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ„์ฃผํ•จ.
  • ex : @Target(ElementType.TYPE_USE)
final @Nullable String name;

public @Nullable Person getPersonByName(String name);

@NotNull
public Person person
  • ํด๋ž˜์Šค ์–ด๋…ธํ…Œ์ด์…˜(Class annotations)
  • ํด๋ž˜์Šค ์„ ์–ธ ์œ— ์ค„ ํ˜น์€ ๋ผ์ธ์•ž์— ์‚ฌ์šฉ๊ฐ€๋Šฅ
@Override
@Nullable
public String getNameIfPresent() { ... }

@Partial @Mock DataLoader loader;

3.6 ์ œ์–ด์ž ์ˆœ์„œ(Modifier Ordinary)


  • ๊ฐ ์ œ์–ด์ž๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜ ์ˆœ์„œ์— ๋”ฐ๋ฆ„
public protected private abstract default static final transient volatile synchronized native strictfp

3.7 ๋ฆฌํ„ฐ๋Ÿด(Literal)


  • ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ
(์˜ˆ์‹œ)
(O) 30000000L
(X) 30000000l

4. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ก€(Programming Practices)

4.1 @Override๋Š” ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉ(@Override : always used)


  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋œ ๋ชจ๋“  ๊ฒฝ์šฐ์—๋Š” ํ•„์ˆ˜ ๊ธฐ์ž…ํ•จ
  • ๋ถ€๋ชจ ์ชฝ์—์„œ @Deprecated๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ ์ž์‹ ์ชฝ ์ƒ๋žต ๊ฐ€๋Šฅ

4.2 ๋ชจ๋“  ์˜ˆ์™ธ๋Š” ์ฒ˜๋ฆฌ(Caught exceptions : not ignored)


  • ๋ชจ๋“  ์˜ˆ์™ธ๋Š” ํ•„์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค
  • ๋งŒ์•ฝ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ๋ช…ํ™•ํžˆ ์ฃผ์„์„ ์ฒจ๋ถ€ํ•จ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” ํ•„์š” ์‹œ ๋ฌด์‹œ ๊ฐ€๋Šฅ

4.3 Static ๋ฉค๋ฒ„๋Š” ํด๋ž˜์Šค๋กœ ์ ‘๊ทผ(Static members : Qualified using class)


  • ํด๋ž˜์Šค ๋ช…์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.
Foo aFoo = ...;
Foo.aStaticMethod(); // good
aFoo.aStaticMethod(); // bad
somethingThatYieldsAFoo().aStaticMethod(); // very bad
๐Ÿ’ก ๋ณธ๋ฌธ์€ [๊ตฌ๊ธ€ Java ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ](https://google.github.io/styleguide/javaguide.html#s6-programming-practices)๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์œผ๋ฉฐ, ์ดํ›„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ  ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€๋กœ ํ™•์ธํ•ด์ฃผ์„ธ์š” ๐Ÿ™‚

Contributors


๊ฐ•๋ฏผ์ค€์ด ์ž‘์„ฑํ•˜๊ณ  ๋ฐ•ํ›ˆ์„ฑ์ด ๊ฒ€์ˆ˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹  ๋ฐ•ํ›ˆ์„ฑ์—๊ฒŒ ๊ฐ์‚ฌ ์ธ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Releases

No releases published

Packages

No packages published