item 56 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item56]곡개된 API μš”μ†Œμ—λŠ” 항상 λ¬Έμ„œν™” 주석을 μž‘μ„±ν•˜λΌ

이번 itemμ—μ„œλŠ” javaDoc μž‘μ„± κ·œμΉ™μ„ 닀룬닀.

JavaDoc

μ†ŒμŠ€μ½”λ“œ νŒŒμΌμ—μ„œ λ¬Έμ„œν™” 주석(doc comment)μ΄λΌλŠ” νŠΉμˆ˜ν•œ ν˜•νƒœλ‘œ 기술된 μ„€λͺ…을 μΆ”λ € API λ¬Έμ„œλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” μœ ν‹Έλ¦¬ν‹°

JavaDoc κ³΅μ‹λ¬Έμ„œ

λ¬Έμ„œν™” 주석 μž‘μ„±λ²•μ€ java 4 μ΄ν›„λ‘œ 15λ…„μ§Έ κ°±μ‹ λ˜μ§€ μ•Šκ³  μžˆλ‹€. java 5, 8, 9에 κ°±μ‹ λœ @literal, @code, @implSpec 은 μœ„ μ›ΉνŽ˜μ΄μ§€μ— μ„€λͺ…이 μ—†μœΌλ―€λ‘œ 이번 μž₯μ—μ„œ μ„€λͺ…ν•  것이닀.

λ¬Έμ„œν™” 주석을 μž‘μ„±ν•˜λŠ” κ·œμΉ™

  • API의 곡개된 λͺ¨λ“  클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ, ν•„λ“œ 선언에 λ¬Έμ„œν™” 주석을 달아야 ν•œλ‹€.

κΈ°λ³Έ μƒμ„±μžμ—λŠ” 주석을 달 수 μ—†μœΌλ‹ˆ, 곡개 ν΄λž˜μŠ€λŠ” μ ˆλŒ€ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. μœ μ§€λ³΄μˆ˜κΉŒμ§€ κ³ λ €ν•œλ‹€λ©΄ κ³΅κ°œλ˜μ§€ μ•ŠλŠ” 클래슀,μΈν„°νŽ˜μ΄μŠ€,μƒμ„±μž,λ©”μ„œλ“œ,ν•„λ“œμ—λ„ κ°„λ‹¨ν•œ λ¬Έμ„œν™” 주석을 λ‹€λŠ” 것이 μ’‹λ‹€.

  • λ©”μ„œλ“œμš© λ¬Έμ„œν™” μ£Όμ„μ—λŠ” λ©”μ„œλ“œ-ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ˜ κ·œμ•½μ„ λͺ…λ£Œν•˜κ²Œ κΈ°μˆ ν•œλ‹€.

1.μƒμ†μš©μœΌλ‘œ μ„€κ³„λœ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλΌλ©΄ howκ°€ μ•„λ‹Œ what을 κΈ°μˆ ν•œλ‹€.

2.λ©”μ„œλ“œ ν˜ΈμΆœμ„ μœ„ν•œ μ „μ œμ‘°κ±΄(precondition)을 λͺ¨λ‘ λ‚˜μ—΄ν•œλ‹€. @throws νƒœκ·Έ

3.λ©”μ„œλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ ν›„ λ§Œμ‘±ν•΄μ•Ό ν•˜λŠ” 사후쑰건(postcondition)도 λͺ¨λ‘ λ‚˜μ—΄ν•œλ‹€.

4.λΆ€μž‘μš©λ„ λ¬Έμ„œν™”ν•œλ‹€.

λΆ€μž‘μš©μ΄λž€? β†’ μ‚¬ν›„μ‘°κ±΄μœΌλ‘œ λͺ…ν™•νžˆ λ‚˜νƒ€λ‚˜μ§€λŠ” μ•Šμ§€λ§Œ μ‹œμŠ€ν…œ μƒνƒœμ— μ–΄λ– ν•œ λ³€ν™”λ₯Ό κ°€μ Έμ˜€λŠ” 것. 예λ₯Ό λ“€λ©΄, λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘μ‹œν‚€λŠ” λ©”μ„œλ“œλΌλ©΄ λ¬Έμ„œμ— λ°ν˜€μ•Ό ν•œλ‹€.

5.λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ— @param νƒœκ·Έλ₯Ό, (voidκ°€ μ•„λ‹ˆλΌλ©΄)λ°˜ν™˜νƒ€μž…μ— @return νƒœκ·Έλ₯Ό 단닀.

νŒŒλΌλ―Έν„°, 리턴, 클래슀, μΈν„°νŽ˜μ΄μŠ€, ν•„λ“œλŠ” λͺ…μ‚¬μ ˆλ‘œ μ„€λͺ…을 μž‘μ„±ν•˜κ³ , λ©”μ„œλ“œλŠ” λ™μ‚¬κ΅¬λ‘œ μ„€λͺ…을 μž‘μ„±ν•œλ‹€. @param, @return, @throws μ„€λͺ…μ—λŠ” λ§ˆμΉ¨ν‘œλ₯Ό 뢙이지 μ•ŠλŠ”λ‹€.

  1. μžλ°”λ…μ€ λ¬Έμ„œν™” 주석을 html둜 λ³€ν™˜ν•˜λ―€λ‘œ htmlμš”μ†Œλ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

7.@code : μ½”λ“œμš© 폰트둜 λ³€ν™˜. (htmlμš”μ†Œλ‚˜ μžλ°”λ… νƒœκ·Έλ₯Ό λ¬΄μ‹œ)

8.<pre></pre> : @code μ•ˆμ˜ μ€„λ°”κΏˆμ΄ κ·ΈλŒ€λ‘œ μœ μ§€λ¨

9.this : μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ thisλŠ” 호좜된 λ©”μ„œλ“œκ°€ μžλ¦¬ν•œ 객체λ₯Ό 가리킨닀.

μœ„μ˜ λͺ¨λ“  κ·œμ•½μ΄ λ“€μ–΄κ°„ μ˜ˆμ‹œ

/**
    * Returns the element at the specified position in this list.
    * 
    * <p>This method is <i>not</i> guaranteed to run in constant
    * time. In some implementations it may run in time proportional
    * to the element position.</p>
    *
    * @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
    *         (<tt>index &lt; 0 || index &gt;= size()</tt>)
    */
   E get(int index);

@implSpec

일반적인 λ¬Έμ„œν™” 주석은 ν•΄λ‹Ή λ©”μ„œλ“œ - ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ˜ 계약을 μ„€λͺ…ν•œλ‹€.

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

(java 11 κΈ°μ€€)μ΅œμ‹  μžλ°”λ²„μ „μΈ 아직도 μžλ°”λ… λͺ…령쀄에 -tag "implSpec:a:Implementation Requirements:" μŠ€μœ„μΉ˜λ₯Ό μΌœμ€˜μ•Ό 이 νƒœκ·Έλ₯Ό μΈμ‹ν•œλ‹€.

/**
  * Returns true if this collection is empty.
  *
  * @implSpec 
  * This implementation returns {@code this.size() == 0}
  *
  * @return true if this collection is empty
  */
 public boolean isEmpty() {...}

@literal

<, >, & λ“±μ˜ HTML λ§ˆν¬μ—…μ΄λ‚˜ μžλ°”λ… νƒœκ·Έλ₯Ό λ¬΄μ‹œν•˜κ²Œ ν•΄μ€€λ‹€.

μš”μ•½ μ„€λͺ…(summary description)

각 λ¬Έμ„œν™” μ£Όμ„μ˜ 첫 번째 λ¬Έμž₯은 ν•΄λ‹Ή μš”μ†Œμ˜ μš”μ•½ μ„€λͺ…(summary description)으둜 κ°„μ£Όλœλ‹€.

λ©”μ„œλ“œμ™€ μƒμ„±μžμ˜ μš”μ•½ μ„€λͺ…은 동사ꡬ여야 ν•œλ‹€.

μš”μ•½ μ„€λͺ…이 λλ‚˜λŠ” 기쀀은 {<λ§ˆμΉ¨ν‘œ><곡백><λ‹€μŒ λ¬Έμž₯ μ‹œμž‘>} νŒ¨ν„΄μ˜ <λ§ˆμΉ¨ν‘œ> κΉŒμ§€λ‹€.

곡백의 기쀀은 space, tab, new line이며 λ‹€μŒ λ¬Έμž₯ μ‹œμž‘μ˜ 기쀀은 'μ†Œλ¬Έμžκ°€ μ•„λ‹Œ' λ¬Έμžλ‹€.

μ•ˆ 쒋은 예λ₯Ό λ“€μ–΄λ³΄μž

/**
 * A suspect, such as Colonel Mustart or Mrs. Peacock. 
 */
public class Suspect{ ... }

μœ„ μ˜ˆμ—μ„œ μš”μ•½ μ„€λͺ…은 A suspect, such as Colonel Mustart or Mrs. κΉŒμ§€μ΄λ‹€. μ›μΉ˜ μ•ŠλŠ” 상황을 ν”Όν•˜κ³  μ‹Άλ‹€λ©΄, μ˜λ„μΉ˜ μ•Šμ€ λ§ˆμΉ¨ν‘œλ₯Ό ν¬ν•¨ν•œ ν…μŠ€νŠΈλ₯Ό {@literal}둜 κ°μ‹Έμ£Όμž.

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

색인 κΈ°λŠ₯

μžλ°” 9λΆ€ν„°λŠ” μžλ°”λ…μ΄ μƒμ„±ν•œ htmlλ¬Έμ„œμ— 색인 κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆλ‹€.

API λ¬Έμ„œ 였λ₯Έμͺ½ μœ„ κ²€μƒ‰μ°½μ—μ„œ 기본적으둜 클래슀, λ©”μ„œλ“œ, ν•„λ“œ 등을 검색할 수 있으며,

μΆ”κ°€λ‘œ {@index} νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄ μ—¬λŸ¬λΆ„μ˜ APIμ—μ„œ μ€‘μš”ν•œ μš©μ–΄λ₯Ό 색인화할 수 μžˆλ‹€.

μ œλ„€λ¦­

μ œλ„€λ¦­ νƒ€μž…μ΄λ‚˜ μ œλ„€λ¦­ λ©”μ„œλ“œλ₯Ό λ¬Έμ„œν™”ν•  λ•ŒλŠ” λͺ¨λ“  νƒ€μž… λ§€κ°œλ³€μˆ˜μ— 주석을 λ‹¬μž

μ—΄κ±° νƒ€μž…

μƒμˆ˜λ“€μ—λ„ 주석을 λ‹¬μž. μ—΄κ±° νƒ€μž… μžμ²΄μ™€ κ·Έ μ—΄κ±°νƒ€μž…μ˜ public λ©”μ„œλ“œκΉŒμ§€ 주석을 단닀.

μ• λ„ˆν…Œμ΄μ…˜ νƒ€μž…

멀버듀에도 λͺ¨λ‘ 주석을 단닀. μ• λ„ˆν…Œμ΄μ…˜ νƒ€μž… μžμ²΄λ„ 단닀.

μ• λ„ˆν…Œμ΄μ…˜ νƒ€μž…μ˜ μš”μ•½ μ„€λͺ…은 ν”„λ‘œκ·Έλž¨ μš”μ†Œμ— 이 μ• λ„ˆν…Œμ΄μ…˜μ„ λ‹€λŠ” 것이 μ–΄λ–€ μ˜λ―ΈμΈμ§€λ₯Ό μ„€λͺ…ν•˜λŠ” λ™μ‚¬κ΅¬λ‘œ μž‘μ„±ν•œλ‹€.

νŒ¨ν‚€μ§€λ₯Ό μ„€λͺ…ν•˜λŠ” λ¬Έμ„œν™” 주석

package-info.java νŒŒμΌμ— μž‘μ„±ν•œλ‹€.

이 νŒŒμΌμ€ νŒ¨ν‚€μ§€ 선언을 λ°˜λ“œμ‹œ 포함해야 ν•˜λ©°, νŒ¨ν‚€μ§€ μ„ μ–Έ κ΄€λ ¨ μ• λ„ˆν…Œμ΄μ…˜μ„ μΆ”κ°€λ‘œ 포함할 μˆ˜λ„ μžˆλ‹€.

λͺ¨λ“ˆ μ‹œμŠ€ν…œ

λͺ¨λ“ˆ κ΄€λ ¨ μ„€λͺ…을 module-info.java에 μž‘μ„±ν•œλ‹€.

μŠ€λ ˆλ“œ μ•ˆμ „μ„±κ³Ό 직렬화 κ°€λŠ₯μ„±

클래슀 or 정적 λ©”μ„œλ“œκ°€ μŠ€λ ˆλ“œ μ•ˆμ „ν•˜λ“  그렇지 μ•Šλ“ , μŠ€λ ˆλ“œ μ•ˆμ „ μˆ˜μ€€μ„ λ°˜λ“œμ‹œ API μ„€λͺ…에 포함해야 ν•œλ‹€.

직렬화할 수 μžˆλŠ” 클래슀라면 직렬화 ν˜•νƒœμ— κ΄€ν•΄μ„œλ„ 적어야 ν•œλ‹€.

λ©”μ„œλ“œ μ£Όμ„μ˜ 상속

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

이 κΈ°λŠ₯을 ν™œμš©ν•˜λ©΄ 거의 λ˜‘κ°™μ€ λ¬Έμ„œν™” 주석 μ—¬λŸ¬ 개λ₯Ό μœ μ§€λ³΄μˆ˜ν•˜λŠ” 뢀담을 쀄일 수 μžˆμ§€λ§Œ, μ‚¬μš©ν•˜κΈ° κΉŒλ‹€λ‘­κ³  μ œμ•½μ΄ μžˆλ‹€. (μ°Έκ³  : 였라클 곡식 λ¬Έμ„œ http://bit.ly/2vqmCzj)

전체 μ•„ν‚€ν…μ²˜ μ„€λͺ…

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

μžλ°”λ… 검사기

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

  • java 7 : λͺ…λ Ήμ€„μ—μ„œ -Xdoclint μŠ€μœ„μΉ˜λ₯Ό μΌœμ€€λ‹€.
  • java 8 : μœ„ κΈ°λŠ₯이 기본으둜 μž‘λ™ν•œλ‹€.
  • IDE ν”ŒλŸ¬κ·ΈμΈ checkStyle
  • HTML μœ νš¨μ„± 검사기λ₯Ό μ‚¬μš©
  • W3C λ§ˆν¬μ—… 검사 μ„œλΉ„μŠ€(W3C-validator)

κ·ΈλŸ¬λ‚˜, μžλ°”λ…μ΄ 잘 μ“°μ˜€λŠ”μ§€ ν™•μΈν•˜λŠ” ν™•μ‹€ν•œ 방법은 κ²°κ΅­ μžλ°”λ… μœ ν‹Έλ¦¬ν‹°κ°€ μƒμ„±ν•œ μ›ΉνŽ˜μ΄μ§€λ₯Ό μ½μ–΄λ³΄λŠ” 길뿐이닀.

⚠️ **GitHub.com Fallback** ⚠️