Skip to content

Commit

Permalink
Merge pull request #316 from SeokRae/item_56
Browse files Browse the repository at this point in the history
[#56][2κΈ°] 곡개된 API μš”μ†Œμ—λŠ” 항상 λ¬Έμ„œν™” 주석을 μž‘μ„±ν•˜λΌ
  • Loading branch information
ksy90101 authored Oct 30, 2021
2 parents 5b012a8 + e7b7e94 commit 08ba4f9
Showing 1 changed file with 303 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,303 @@
---
description: 곡개된 API μš”μ†Œμ—λŠ” 항상 λ¬Έμ„œν™” 주석을 μž‘μ„±ν•˜λΌ
---

# Item 56

- APIλ₯Ό μ“Έλͺ¨ 있게 ν•˜λ €λ©΄ 잘 μž‘μ„±λœ λ¬Έμ„œλ„ 곁듀여야 ν•œλ‹€.
- μžλ°”μ—μ„œλŠ” μžλ°”λ…(Javadoc)μ΄λΌλŠ” μœ ν‹Έλ¦¬ν‹°κ°€ 이λ₯Ό λ•λŠ”λ‹€.

- [Presentation](https://github.com/SeokRae/TIL/blob/master/java/effactive/item56/item56.pdf)

## Intro

- μžλ°”λ…μ€ μ†ŒμŠ€μ½”λ“œ νŒŒμΌμ—μ„œ λ¬Έμ„œν™” 주석(doc comment: μžλ°”λ… 주석)μ΄λΌλŠ” νŠΉμˆ˜ν•œ ν˜•νƒœλ‘œ 기술된 μ„€λͺ…을 μΆ”λ € API λ¬Έμ„œλ‘œ λ³€ν™˜ν•΄μ€€λ‹€.
- μžλ°” 버전이 μ˜¬λΌκ°€λ©° μΆ”κ°€λœ μ€‘μš”ν•œ μžλ°”λ… νƒœκ·Έ
- μžλ°” 5의 `@literal`, `@code`
- μžλ°” 8의 `@implSpec`
- μžλ°” 9의 `@index`

> APIλ₯Ό μ˜¬λ°”λ‘œ λ¬Έμ„œν™” ν•˜λ €λ©΄ 곡개된 λͺ¨λ“  클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ, ν•„λ“œ 선언에 λ¬Έμ„œν™” 주석을 달아야 ν•œλ‹€.
- 직렬화할 수 μžˆλŠ” 클래슀의 경우 직렬화 ν˜•νƒœμ— κ΄€ν•΄μ„œλ„ 적어야 ν•œλ‹€.[μ•„μ΄ν…œ 87]()
- λ¬Έμ„œν™” 주석이 μ—†λ‹€λ©΄ μžλ°”λ…λ„ κ·Έμ € 곡개 APIμš”μ†Œλ“€μ˜ 'μ„ μ–Έ'만 λ‚˜μ—΄ν•΄μ£ΌλŠ”κ²Œ 전뢀이닀.
- λ¬Έμ„œκ°€ 잘 갖좰지지 μ•Šμ€ APIλŠ” μ“°κΈ° ν—·κ°ˆλ €μ„œ 였λ₯˜μ˜ 원인이 되기 쉽닀.

- κΈ°λ³Έ μƒμ„±μžμ—λŠ” λ¬Έμ„œν™” 주석을 달 방법이 μ—†μœΌλ‹ˆ 곡개 ν΄λž˜μŠ€λŠ” μ ˆλŒ€ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€.
- μœ μ§€λ³΄μˆ˜κΉŒμ§€ κ³ λ €ν•œλ‹€λ©΄ λŒ€λ‹€μˆ˜μ˜ κ³΅κ°œλ˜μ§€ μ•Šμ€ `클래슀`, `μΈν„°νŽ˜μ΄μŠ€`, `μƒμ„±μž`, `λ©”μ„œλ“œ`, `ν•„λ“œ`에도 λ¬Έμ„œν™” 주석을 달아야 ν•œλ‹€.

## λ©”μ„œλ“œμš© λ¬Έμ„œν™” 주석

- ν•΄λ‹Ή λ©”μ„œλ“œμ™€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ˜ κ·œμ•½μ„ λͺ…λ£Œν•˜κ²Œ κΈ°μˆ ν•΄μ•Ό ν•œλ‹€.
- μƒμ†μš©μœΌλ‘œ μ„€κ³„λœ 클래슀의 λ©”μ„œλ“œκ°€ μ•„λ‹ˆλΌλ©΄ 무엇을 ν•˜λŠ”μ§€ κΈ°μˆ ν•΄μ•Ό ν•œλ‹€. [μ•„μ΄ν…œ 19]()
- 즉, howκ°€ μ•„λ‹Œ what을 κΈ°μˆ ν•΄μ•Όν•œλ‹€.

- λ¬Έμ„œν™” μ£Όμ„μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•œ μ „μ œμ‘°κ±΄μ„ λͺ¨λ‘ λ‚˜μ—΄ν•΄μ•Ό ν•œλ‹€.
- λ©”μ„œλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ 후에 λ§Œμ‘±ν•΄μ•Ό ν•˜λŠ” 사후쑰건(postcondition)도 λͺ¨λ‘ λ‚˜μ—΄ν•΄μ•Ό ν•œλ‹€.

### λ¬Έμ„œν™” 주석 정보

- 일반적으둜 μ „μ œ 쑰건은 `@throws` νƒœκ·Έλ‘œ 비검사 μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•˜μ—¬ μ•”μ‹œμ μœΌλ‘œ κΈ°μˆ ν•œλ‹€.
- 비검사 μ˜ˆμ™Έ ν•˜λ‚˜κ°€ μ „μ œμ‘°κ±΄ ν•˜λ‚˜μ™€ μ—°κ²°λ˜λŠ” 것이닀.
- λ˜ν•œ, `@param` νƒœκ·Έλ₯Ό μ΄μš©ν•΄ κ·Έ 쑰건에 영ν–₯ λ°›λŠ” λ§€κ°œλ³€μˆ˜μ— κΈ°μˆ ν•  μˆ˜λ„ μžˆλ‹€.

### λΆ€μž‘μš©

- μ „μ œμ‘°κ±΄κ³Ό μ‚¬ν›„μ‘°κ±΄λΏλ§Œ μ•„λ‹ˆλΌ λΆ€μž‘μš©λ„ λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€.
- λΆ€μž‘μš©μ΄λž€ μ‚¬ν›„μ‘°κ±΄μœΌλ‘œ λͺ…ν™•νžˆ λ‚˜νƒ€λ‚˜μ§€λŠ” μ•Šμ§€λ§Œ μ‹œμŠ€ν…œμ˜ μƒνƒœμ— μ–΄λ– ν•œ λ³€ν™”λ₯Ό κ°€μ Έμ˜€λŠ” 것을 λœ»ν•œλ‹€.
- 예둜 λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘μ‹œν‚€λŠ” λ©”μ„œλ“œλΌλ©΄ κ·Έ 사싀을 λ¬Έμ„œμ— λ°ν˜€μ•Ό ν•œλ‹€.

### λ©”μ„œλ“œμ˜ 계약(contract)

- 이λ₯Ό μ™„λ²½νžˆ κΈ°μˆ ν•˜λ €λ©΄ λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ— `@param` νƒœκ·Έλ₯Ό 달아야 ν•œλ‹€.
- λ°˜ν™˜ νƒ€μž…μ΄ voidκ°€ μ•„λ‹ˆλΌλ©΄ `@return` νƒœκ·Έλ₯Ό 달아야 ν•œλ‹€.
- λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” λͺ¨λ“  μ˜ˆμ™Έμ— `@throws` νƒœκ·Έλ₯Ό 달아야 ν•œλ‹€.[μ•„μ΄ν…œ 74]()

### νƒœκ·Έ μ»¨λ²€μ…˜

- `@param` νƒœκ·Έμ™€ `@return` νƒœκ·Έμ˜ μ„€λͺ…은 ν•΄λ‹Ή **λ§€κ°œλ³€μˆ˜κ°€ λœ»ν•˜λŠ” κ°’**μ΄λ‚˜ **λ°˜ν™˜κ°’μ„ μ„€λͺ…ν•˜λŠ” λͺ…사ꡬ** λ˜λŠ” **μ‚°μˆ  ν‘œν˜„μ‹**을 쓰기도 ν•œλ‹€.
- μ˜ˆμ‹œ
- BigInteger API
- @throws νƒœκ·Έμ˜ μ„€λͺ…은 if둜 μ‹œμž‘ν•΄ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 쑰건을 μ„€λͺ…ν•˜λŠ” 절이 λ’€λ”°λ₯Έλ‹€.
- μ—­μ‹œ 관둀상 @param, @return, @throws νƒœκ·Έμ˜ μ„€λͺ…μ—λŠ” λ§ˆμΉ¨ν‘œλ₯Ό 뢙이지 μ•ŠλŠ”λ‹€.

```java
public interface List<E> extends Collection<E> {
// Positional Access Operations

/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index >= size()})
*/
E get(int index);

}
```

- λ¬Έμ„œν™” 주석 μ•ˆμ˜ HTML μš”μ†Œλ“€μ΄ μ΅œμ’… HTML λ¬Έμ„œμ— λ°˜μ˜λœλ‹€.
- μžλ°”λ… μ„€λͺ…에 HTML table을 λ„£λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

- `{@code}` νƒœκ·Έ
- νƒœκ·Έλ‘œ 감산 λ‚΄μš©μ„ μ½”λ“œμš© 폰트둜 λ Œλ”λ§ν•œλ‹€.
- νƒœκ·Έλ‘œ 감싼 λ‚΄μš©μ— ν¬ν•¨λœ HTML μš”μ†Œλ‚˜ λ‹€λ₯Έ μžλ°”λ… νƒœκ·Έλ₯Ό λ¬΄μ‹œν•œλ‹€.
- HTML λ©”νƒ€λ¬ΈμžμΈ `<` 기호 등을 별닀λ₯Έ 처리 없이 λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
- λ¬Έμ„œν™” 주석에 μ—¬λŸ¬ μ€„λ‘œ 된 μ½”λ“œ μ˜ˆμ‹œλ₯Ό λ„£μœΌλ €λ©΄ `{@code}` νƒœκ·Έλ₯Ό λ‹€μ‹œ `<pre>` νƒœκ·Έλ‘œ 감싸면 λœλ‹€.
- `<pre></pre>`λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ μ€„λ°”κΏˆμ΄ κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.
- 단, @κΈ°ν˜Έμ—λŠ” 무쑰건 νƒˆμΆœλ¬Έμžλ₯Ό λΆ™μ—¬μ•Ό ν•˜λ‹ˆ λ¬Έμ„œν™” 주석 μ•ˆμ˜ μ½”λ“œμ—μ„œ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œλ‹€λ©΄ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

- 영문 λ¬Έμ„œν™” μ£Όμ„μ—μ„œ μ“΄ **`this list`** λŠ” 관둀상, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ λ¬Έμ„œν™” 주석에 쓰인 `this`λŠ” 호좜된 λ©”μ„œλ“œκ°€ μžλ¦¬ν•˜λŠ” 객체λ₯Ό 가리킨닀.

### 클래슀 μƒμ†μš©μœΌλ‘œ 섀계 μ‹œ λ¬Έμ„œν™” 주석

- μžκΈ°μ‚¬μš© νŒ¨ν„΄(self-use pattern)에 λŒ€ν•΄μ„œ λ¬Έμ„œμ— 남겨 λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ κ·Έ λ©”μ„œλ“œλ₯Ό μ˜¬λ°”λ‘œ μž¬μ •μ˜ν•˜λŠ” 방법을 μ•Œλ €μ€˜μ•Ό ν•œλ‹€.
- μžκΈ°μ‚¬μš© νŒ¨ν„΄μ„ μžλ°” 8에 μΆ”κ°€λœ `@implSpec` νƒœκ·Έλ‘œ λ¬Έμ„œν™”ν•œλ‹€.
- 일반적인 λ¬Έμ„œν™” 주석은 ν•΄λ‹Ή λ©”μ„œλ“œμ™€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ˜ 계약을 μ„€λͺ…ν•œλ‹€.

- 반면, `@implSpec` 주석은 ν•΄λ‹Ή λ©”μ„œλ“œμ™€ ν•˜μœ„ 클래슀 μ‚¬μ΄μ˜ 계약을 μ„€λͺ…ν•˜μ—¬, ν•˜μœ„ ν΄λž˜μŠ€λ“€μ΄ κ·Έ λ©”μ„œλ“œλ₯Ό μƒμ†ν•˜κ±°λ‚˜ super ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ ν˜ΈμΆœν•  λ•Œ κ·Έ λ©”μ„œλ“œκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό λͺ…ν™•νžˆ μΈμ§€ν•˜κ³  μ‚¬μš©ν•˜λ„λ‘ ν•΄μ€˜μ•Ό ν•œλ‹€.

```java
public interface List<E> extends Collection<E> {

/**
* Returns true< if this list contains no elements.
* @implSpec
* This implementation returns {@code this size ==0}.
*
* @return true if this list contains no elements
*/
boolean isEmpty();
}
```

- μžλ°” 11κΉŒμ§€λ„ μžλ°”λ… λͺ…λ Ήμ€„μ—μ„œ `-tag "implSpec:a:Implementation Requirements:"` μŠ€μœ„μΉ˜λ₯Ό μΌœμ£Όμ§€ μ•ŠμœΌλ©΄ `@implSpec` νƒœκ·Έλ₯Ό λ¬΄μ‹œν•΄ 버린닀.

### API μ„€λͺ…에 HTML 메타 문자λ₯Ό ν¬ν•¨ν•˜κΈ° μœ„ν•œ 처리

- `{@literal}` νƒœκ·Έλ‘œ 감싸면 HTML λ§ˆν¬μ—…μ΄λ‚˜ μžλ°”λ… νƒœκ·Έλ₯Ό λ¬΄μ‹œν•˜κ²Œ ν•΄μ€€λ‹€.
- `{@code}` νƒœκ·Έμ™€ λΉ„μŠ·ν•˜μ§€λ§Œ μ½”λ“œ 폰트둜 λ Œλ”λ§ν•˜μ§€ μ•ŠλŠ”λ‹€.

```text
* {@literal |r| < 1}
```

- λ¬Έμ„œν™” 주석은 μ½”λ“œμ—μ„œκ±΄ λ³€ν™˜λœ API λ¬Έμ„œμ—μ„œκ±΄ 읽기 μ‰¬μ›Œμ•Ό ν•œλ‹€λŠ”κ²Œ 일반 원칙이닀.

## API λ¬Έμ„œμ—μ„œμ˜ 가독성

- 각 λ¬Έμ„œν™” μ£Όμ„μ˜ 첫 번째 λ¬Έμž₯은 ν•΄λ‹Ή μš”μ†Œμ˜ μš”μ•½ μ„€λͺ…(summary description)으둜 κ°„μ£Όλœλ‹€.
- μš”μ•½ μ„€λͺ…은 λ°˜λ“œμ‹œ λŒ€μƒμ˜ κΈ°λŠ₯을 κ³ μœ ν•˜κ²Œ κΈ°μˆ ν•΄μ•Ό ν•œλ‹€.
- ν—·κ°ˆλ¦¬μ§€ μ•ŠμœΌλ €λ©΄ ν•œ 클래슀(ν˜Ήμ€ μΈν„°νŽ˜μ΄μŠ€) μ•ˆμ—μ„œ μš”μ•½ μ„€λͺ…이 λ˜‘κ°™μ€ 멀버(ν˜Ήμ€ μƒμ„±μž)κ°€ λ‘˜ 이상이면 μ•ˆλœλ‹€,

- λ‹€μ€‘μ •μ˜λœ λ©”μ„œλ“œκ°€ μžˆλŠ” 경우 각 λ©”μ„œλ“œλ“€μ˜ μ„€λͺ…은 같은 λ¬Έμž₯으둜 μ‹œμž‘ν•˜λŠ”κ²Œ μžμ—°μŠ€λŸ½κ² μ§€λ§Œ λ¬Έμ„œν™” μ£Όμ„μ—μ„œλŠ” ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.
- μš”μ•½ μ„€λͺ…μ—μ„œλŠ” λ§ˆμΉ¨ν‘œ(.)에 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.
- μš”μ•½ μ„€λͺ…이 λλ‚˜λŠ” νŒλ‹¨ 기쀀은 μ²˜μŒμ— λ°œκ²¬λ˜λŠ” {<λ§ˆμΉ¨ν‘œ><곡백><λ‹€μŒ λ¬Έμž₯ μ‹œμž‘>} νŒ¨ν„΄μ˜ <λ§ˆμΉ¨ν‘œ>κΉŒμ§€μ΄λ‹€.
- μ—¬κΈ°μ„œ <곡백>은 슀페이슀, νƒ­, μ€„λ°”κΏˆ(ν˜Ήμ€ 첫 번째 블둝 νƒœκ·Έ)이닀.
- <λ‹€μŒ λ¬Έμž₯ μ‹œμž‘>은 'μ†Œλ¬Έμžκ°€ μ•„λ‹Œ' λ¬Έμžμ΄λ‹€.
- κ°€μž₯ 쒋은 해결책은 μ˜λ„ν•˜μ§€ μ•Šμ€ λ§ˆμΉ¨ν‘œλ₯Ό ν¬ν•¨ν•œ ν…μŠ€νŠΈλ₯Ό {@literal}둜 κ°μ‹Έμ£ΌλŠ” 것이닀.

```java
/**
* A suspect, such as Colonel Mustard or {@literal Mrs. Peacock}
*/
public class Suspect {

}

/**
* λ¨ΈμŠ€νƒ€λ“œ λŒ€λ Ήμ΄λ‚˜ {@literal Mrs. 피콕} 같은 용의자.
*/
public class Suspect {

}
```

- μžλ°” 10λΆ€ν„° {@summary}λΌλŠ” μš”μ•½ μ „μš© νƒœκ·Έκ°€ μΆ”κ°€λ˜μ–΄ κΉ”λ”ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

```java
/**
* {@summary A suspect, such as Colonel Mustard or Mrs. Peacock.}
*/
public enum Suspect {

}
```

- 주석 μž‘μ„± κ·œμ•½μ— λ”°λ₯΄λ©΄ μš”μ•½ μ„€λͺ…은 μ™„μ „ν•œ λ¬Έμž₯이 λ˜λŠ” κ²½μš°κ°€ λ“œλ¬Όλ‹€.
- λ©”μ„œλ“œμ™€ μƒμ„±μžμ˜ μš”μ•½ μ„€λͺ…은 ν•΄λ‹Ή λ©”μ„œλ“œμ™€ μƒμ„±μžμ˜ λ™μž‘μ„ μ„€λͺ…ν•˜λŠ” (μ£Όμ–΄κ°€ μ—†λŠ”) 동사ꡬ여야 ν•œλ‹€.

```text
ArrayList(int initialCapacity): Constructs an empty list with the specified initial capacity.
Collection.size(): Returns the number of elements in this collection.
```

- 2인칭 λ¬Έμž₯(return the number) 이 μ•„λ‹Œ 3인칭 λ¬Έμž₯(returns the number)으둜 써야 ν•œλ‹€.

### 클래슀, μΈν„°νŽ˜μ΄μŠ€, ν•„λ“œμ˜ μš”μ•½ μ„€λͺ…은 λŒ€μƒμ„ μ„€λͺ…ν•˜λŠ” λͺ…μ‚¬μ ˆμ΄μ–΄μ•Ό ν•œλ‹€.

- ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ λŒ€μƒμ€ κ·Έ μΈμŠ€ν„΄μŠ€μ΄κ³ , ν•„λ“œμ˜ λŒ€μƒμ€ ν•„λ“œ μžμ‹ μ΄λ‹€.

```text
Instant:An instantaneous point on the time-line.
Math.PI: The double value that is closer than any other to pi, the ratio of
the circumference of a circle to its diameter.
```

- μžλ°” 9λΆ€ν„°λŠ” μžλ°”λ…μ΄ μƒμ„±ν•œ HTML λ¬Έμ„œμ— 검색(색인) κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄ κ΄‘λŒ€ν•œ API λ¬Έμ„œλ“€μ„ λˆ„λΉ„λŠ” 일이 ν•œκ²° μˆ˜μ›”ν•΄μ‘Œλ‹€.
- API λ¬Έμ„œ νŽ˜μ΄μ§€ 였λ₯Έμͺ½ μœ„μ— μžˆλŠ” 검색창에 ν‚€μ›Œλ“œλ₯Ό μž…λ ₯ν•˜λ©΄ κ΄€λ ¨ νŽ˜μ΄μ§€λ“€μ΄ λ“œλ‘­λ‹€μš΄ λ©”λ‰΄λ‘œ λ‚˜νƒ€λ‚œλ‹€.

- 클래슀, λ©”μ„œλ“œ, ν•„λ“œ 같은 API μš”μ†Œμ˜ 색인은 μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§€λ©°, μ›ν•œλ‹€λ©΄ {@index} νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄ μ—¬λŸ¬λΆ„μ˜ APIμ—μ„œ μ€‘μš”ν•œ μš©μ–΄λ₯Ό μΆ”κ°€λ‘œ 색인화할 수 μžˆλ‹€.

```java
/**
* This method complies with the {@index IEEE 754} standard.
*/
```

## μ œλ„€λ¦­, μ—΄κ±° νƒ€μž…, μ–΄λ…Έν…Œμ΄μ…˜μ—μ„œ λ¬Έμ„œν™” 주석

### μ œλ„€λ¦­ νƒ€μž…μ΄λ‚˜ μ œλ„€λ¦­ λ©”μ„œλ“œλ₯Ό λ¬Έμ„œν™”

- λͺ¨λ“  νƒ€μž… λ§€κ°œλ³€μˆ˜μ— 주석을 달아야 ν•œλ‹€.

```java
/**
* @param <K> the type of keys maintained by this map
* @param <V> the type of mapped values
*/
public interface Map<K, V> {

}
```

### μ—΄κ±° νƒ€μž…μ„ λ¬Έμ„œν™”

- μƒμˆ˜λ“€μ—λ„ 주석을 달아야 ν•œλ‹€.
- μ—΄κ±° νƒ€μž… μžμ²΄μ™€ κ·Έ μ—΄κ±° νƒ€μž…μ˜ public λ©”μ„œλ“œλ„ 주석을 달아야 ν•œλ‹€.

```java
public enum OrchestraSection {
/** Woodwinds, such as flute, clarinet, and oboe */
WOODWIND,
/** Brass instruments, such as french horn and trumpet */
BRASS,
/** Percussion instruments, such as timpani and cymbals */
PERCUSSION,
/** Stringed instruments, such as violin and cello */
STRING;
}
```

### μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž…μ„ λ¬Έμ„œν™”

- ν•„λ“œ, 멀버듀에도 λͺ¨λ‘ 주석을 달아야 ν•œλ‹€.
- ν•„λ“œ μ„€λͺ…은 λͺ…μ‚¬κ΅¬λ‘œ ν•œλ‹€.
- μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž…μ˜ μš”μ•½ μ„€λͺ…은 ν”„λ‘œκ·Έλž¨ μš”μ†Œμ— 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ λ‹¨λ‹€λŠ” 것이 μ–΄λ–€ μ˜λ―ΈμΈμ§€λ₯Ό μ„€λͺ…ν•˜λŠ” λ™μ‚¬κ΅¬λ‘œ ν•œλ‹€.

```java
/**
* Indicates that the annotated method is a test method that
* must throw the designated exception to pass.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
/**
* The exception that the annotated test method must throw
* in order to pass. (The test is permitted to throw any
* subtype of the type described by this class object.)
*/
Class<? extends Throwable> valueO;
}
```

- νŒ¨ν‚€μ§€λ₯Ό μ„€λͺ…ν•˜λŠ” λ¬Έμ„œν™” 주석은 package-info.java νŒŒμΌμ— μž‘μ„±ν•œλ‹€.
- 이 νŒŒμΌμ€ νŒ¨ν‚€μ§€ 선언을 λ°˜λ“œμ‹œ 포함해야 ν•˜λ©° νŒ¨ν‚€μ§€ μ„ μ–Έ κ΄€λ ¨ μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€λ‘œ 포함할 μˆ˜λ„ μžˆλ‹€.

- μžλ°” 9λΆ€ν„° μ§€μ›ν•˜λŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œλ„ 이와 λΉ„μŠ·ν•˜λ‹€. [μ•„μ΄ν…œ 15]()
- λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ‹€λ©΄ λͺ¨λ“ˆ κ΄€λ ¨ μ„€λͺ…은 module-info.java νŒŒμΌμ— μž‘μ„±ν•˜λ©΄ λœλ‹€.

## API λ¬Έμ„œν™”μ—μ„œ 자주 λˆ„λ½λ˜λŠ” μ„€λͺ… 두 가지

- μŠ€λ ˆλ“œ μ•ˆμ „μ„±κ³Ό 직렬화 μ•ˆμ „μ„±
- 클래슀 ν˜Ήμ€ 정적 λ©”μ„œλ“œκ°€ μŠ€λ ˆλ“œ μ•ˆμ „ν•˜λ“  그렇지 μ•Šλ“ , μŠ€λ ˆλ“œ μ•ˆμ „ μˆ˜μ€€μ„ λ°˜λ“œμ‹œ API μ„€λͺ…에 포함해야 ν•œλ‹€.[μ•„μ΄ν…œ 82]()
- 직렬화 ν•  수 μžˆλŠ” 클래슀라면 직렬화 ν˜•νƒœλ„ API μ„€λͺ…에 κΈ°μˆ ν•΄μ•Ό ν•œλ‹€.[μ•„μ΄ν…œ 87]()

### μžλ°”λ…μ€ λ©”μ„œλ“œ 주석 '상속'μ‹œν‚¬ 수 μžˆλ‹€.

- λ¬Έμ„œν™” 주석이 μ—†λŠ” API μš”μ†Œλ₯Ό λ°œκ²¬ν•˜λ©΄ μžλ°”λ…μ΄ κ°€μž₯ κ°€κΉŒμš΄ λ¬Έμ„œν™” 주석을 μ°Ύμ•„μ€€λ‹€.
- μ΄λ•Œ μƒμœ„ '클래슀'보닀 κ·Έ ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•œ 'μΈν„°νŽ˜μ΄μŠ€'λ₯Ό λ¨Όμ € μ°ΎλŠ”λ‹€.

- [The Javadoc Reference Guide](https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javadoc.html)

- λ˜ν•œ {@inheritDoc} νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄ μƒμœ„ νƒ€μž…μ˜ λ¬Έμ„œν™” 주석을 일뢀 상속할 수 μžˆλ‹€.
- ν΄λž˜μŠ€λŠ” μžμ‹ μ΄ κ΅¬ν˜„ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ¬Έμ„œν™” 주석을 μž¬μ‚¬μš©ν•  수 μžˆλ‹€λŠ” λœ»μ΄λ‹€.
- 이 κΈ°λŠ₯을 ν™œμš©ν•˜λ©΄ 거의 λ˜‘κ°™μ€ λ¬Έμ„œν™” 주석 μ—¬λŸ¬ 개λ₯Ό μœ μ§€λ³΄μˆ˜ν•˜λŠ” 뢀담을 쀄일 수 μžˆμ§€λ§Œ, μ‚¬μš©ν•˜κΈ° κΉŒλ‹€λ‘­κ³  μ œμ•½λ„ 쑰금 μžˆλ‹€.
- [λ©”μ„œλ“œ 주석 상속화](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/javadoc.html#inheritingcomments)

### λ¬Έμ„œν™” 주석 μ£Όμ˜μ‚¬ν•­

- μ—¬λŸ¬ ν΄λž˜μŠ€κ°€ μƒν˜Έμž‘μš©ν•˜λŠ” λ³΅μž‘ν•œ API의 경우 λ¬Έμ„œν™” 주석 외에도 전체 μ•„ν‚€ν…μ²˜λ₯Ό μ„€λͺ…ν•˜λŠ” λ³„λ„μ˜ μ„€λͺ…이 ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€.
- 이런 μ„€λͺ… λ¬Έμ„œκ°€ μžˆλ‹€λ©΄ κ΄€λ ¨ ν΄λž˜μŠ€λ‚˜ νŒ¨ν‚€μ§€μ˜ λ¬Έμ„œν™” μ£Όμ„μ—μ„œ κ·Έ λ¬Έμ„œμ˜ 링크λ₯Ό μ œκ³΅ν•΄μ£Όλ©΄ μ’‹λ‹€.

## μžλ°”λ… λ¬Έμ„œλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μž‘μ„±ν–ˆλŠ”μ§€ ν™•μΈν•˜λŠ” κΈ°λŠ₯

- μžλ°” 7μ—μ„œλŠ” CLIμ—μ„œ -Xdoclint μŠ€μœ„μΉ˜λ₯Ό 켜주면 κΈ°λŠ₯이 ν™œμ„±ν™”λœλ‹€.
- μžλ°” 8λΆ€ν„°λŠ” 기본으둜 μž‘λ™ν•œλ‹€.

- 체크 μŠ€νƒ€μΌ(checkstyle) 같은 IDE ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λ©΄ 더 μ™„λ²½ν•˜κ²Œ κ²€μ‚¬λœλ‹€.
- μžλ°”λ…μ΄ μƒμ„±ν•œ HTML νŒŒμΌμ„ HTML μœ νš¨μ„± κ²€μ‚¬κΈ°λ‘œ 돌리면 λ¬Έμ„œν™” μ£Όμ„μ˜ 였λ₯˜λ₯Ό ν•œμΈ΅ 더 쀄일 수 μžˆλ‹€.
- HTML μœ νš¨μ„± κ²€μ‚¬κΈ°λŠ” 잘λͺ» μ‚¬μš©ν•œ HTML νƒœκ·Έλ₯Ό μ°Ύμ•„μ€€λ‹€.
- λ‘œμ»¬μ— λ‚΄λ €λ°›μ•„ μ‚¬μš©ν•  수 μžˆλŠ” μ„€μΉ˜ν˜• 검사기
- μ›Ήμ—μ„œ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” W3C λ§ˆν¬μ—… 검사 μ„œλΉ„μŠ€[W3C-validator]도 μžˆλ‹€.
- μžλ°” 9와 10의 μžλ°”λ…μ€ 기본적으둜 HTML 4.01 λ¬Έμ„œλ₯Ό 생성, λͺ…λ Ήμ€„μ—μ„œ -html5 μŠ€μœ„μΉ˜λ₯Ό 켜면 HTML5 λ²„μ „μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.

## 정리

- λ¬Έμ„œν™” 주석은 APIλ₯Ό λ¬Έμ„œν™”ν•˜λŠ” κ°€μž₯ ν›Œλ₯­ν•˜κ³  효과적인 방법이닀.
- 곡개 API인 경우 ν‘œμ€€ κ·œμ•½μ„ μΌκ΄€λ˜κ²Œ μ„€λͺ…을 달아야 ν•œλ‹€.
- λ¬Έμ„œν™” 주석에 μž„μ˜ HTML νƒœκ·Έλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
- 단, HTML λ©”νƒ€λ¬ΈμžλŠ” νŠΉλ³„ν•˜κ²Œ μ·¨κΈ‰ν•΄μ•Ό ν•œλ‹€.

0 comments on commit 08ba4f9

Please sign in to comment.