item 1 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μƒμ„±μž λŒ€μ‹  정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ

  • 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ–»λŠ” μˆ˜λ‹¨μ€ 두가지
  1. public μƒμ„±μžλ₯Ό μ‚¬μš©
  2. 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©
  • ν΄λž˜μŠ€λŠ” μƒμ„±μžμ™€ λ³„λ„λ‘œ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.
public static Boolean valueOf(boolean b) {
    return b? Boolean.TRUE : Boolean.False;
}

참고둜 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλŠ” λ””μžμΈ νŒ¨ν„΄μ—μ„œμ˜ νŒ©ν† λ¦¬ λ©”μ„œλ“œμ™€λŠ” λ¬΄κ΄€ν•˜λ‹€.


μƒμ„±μžκ°€ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ³΄λ‹€ 쒋은 μž₯점 λ‹€μ„―κ°€μ§€

이름을 κ°€μ§ˆ 수 μžˆλ‹€.

  1. μƒμ„±μžμ— λ„˜κΈ°λŠ” λ§€κ°œλ³€μˆ˜μ™€ μƒμ„±μž μžμ²΄λ§ŒμœΌλ‘œλŠ” λ°˜ν™˜λ  객체의 νŠΉμ„±μ„ μ œλŒ€λ‘œ μ„€λͺ…ν•˜μ§€ λͺ»ν•œλ‹€. 반면 정적 νŒ©ν† λ¦¬λŠ” λ°˜ν™˜λœ 객체의 νŠΉμ„±μ„ μ‰½κ²Œ λ¬˜μ‚¬ν•  수 μžˆλ‹€.

BigInteger(int, int, Random)

BigInteger.probablePrime (μžλ°” 4+)

  • λ‘˜μ€‘ μ–΄λŠμͺ½μ΄ 값이 μ†Œμˆ˜μΈ BigIntegerλ₯Ό λ°˜ν™˜ν•œλ‹€ λŠ” 의미λ₯Ό 더 잘 μ„€λͺ…ν•  것 같은지 μƒκ°ν•΄λ³΄μž.

  • μ•„λž˜μ™€ 같이 μƒμ„±μžκ°€ λ™μΌν•˜κ²Œ μ—¬λŸ¬κ°€μ§€ 썼을 λ•Œ μ˜λ„κ°€ λ“œλŸ¬λ‚˜μ§€ μ•ŠλŠ”λ‹€.

BigInt()  -> κΈ°λ³Έ μƒμ„±μž 
BigInt(int t)
BigInt(float f) 
  • μƒμ„±μžλŠ” 이름을 κ°€μ§ˆ μ—†μœΌλ‚˜ λ©”μ†Œλ“œλŠ” 이름을 κ°€μ§ˆ 수 있음
  • μƒμ„±μžλŠ” 정적이 μ•„λ‹ˆλ―€λ‘œ λ©”μ†Œλ“œλŠ” 정적이어야 함
  • static factory methodλ₯Ό μ“Έ κ²½μš°μ— 보톡 μƒμ„±μžλ₯Ό private둜 λ°”κΎΈκ³  객체 생성을 λ§‰λŠ”λ‹€. -> 객체λ₯Ό 직접 생성할 수 μ—†κ²Œ λ§Œλ“ λ‹€.
  1. ν•˜λ‚˜μ˜ μ‹œκ·Έλ‹ˆμ²˜λ‘œλŠ” μƒμ„±μž ν•˜λ‚˜λ§Œ λ§Œλ“€ 수 μžˆλ‹€. μž…λ ₯ λ§€κ°œλ³€μˆ˜λ“€μ˜ μˆœμ„œλ₯Ό λ‹€λ₯΄κ²Œ ν•œ μƒμ„±μžλ₯Ό μƒˆλ‘œ μΆ”κ°€ν•˜λŠ” μ‹μœΌλ‘œ 이 μ œν•œμ„ ν”Όν•΄λ³Ό μˆ˜λ„ μžˆμ§€λ§Œ μ’‹μ§€ μ•Šλ‹€.

그런 APIλ₯Ό μ‚¬μš©ν•˜λŠ” κ°œλ°œμžλŠ” 각 μƒμ„±μžκ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ μ •ν™•νžˆ κΈ°μ–΅ν•˜κΈ° μ–΄λ €μ›Œ μ—‰λš±ν•œ 것을 ν˜ΈμΆœν•˜λŠ” μ‹€μˆ˜λ₯Ό ν•  수 μžˆλ‹€.

μƒμ„±μžλ₯Ό 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ‘œ λ°”κΎΈκ³  각각의 차이λ₯Ό 잘 λ“€μ–΄λ‚΄λŠ” 이름을 μ§€μ–΄μ£Όμž.

호좜될 λ•Œλ§ˆλ‹€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜μ§€λŠ” μ•Šμ•„λ„ λœλ‹€.

  • λ³€μˆ˜ μ–΄λ”˜κ°€μ— μ €μž₯ν•˜κ³  있으며 μΊμ‹±ν•˜κ³  μžˆλ‹€.
  1. λΆˆλ³€ν΄λž˜μŠ€(item 17)λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 미리 λ§Œλ“€μ–΄ λ†“κ±°λ‚˜ μƒˆλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μΊμ‹±ν•˜μ—¬ μž¬ν™œμš© ν•˜λŠ” μ‹μœΌλ‘œ λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•  수 μžˆλ‹€.

Boolean.valueOf(boolean) λ©”μ„œλ“œλŠ” 객체λ₯Ό μ•„μ˜ˆ μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. 생성 λΉ„μš©μ΄ 크고 같은 객체가 자주 μš”μ²­λ˜λŠ” 상황이라면 μ„±λŠ₯을 μƒλ‹Ήνžˆ λŒμ–΄μ˜¬λ €μ€€λ‹€.(ν”ŒλΌμ΄ μ›¨μ΄νŠΈ νŒ¨ν„΄ λΉ„μŠ·ν•œ λ‚΄μš© μ°Έκ³ )

  1. λ°˜λ³΅λ˜λŠ” μš”μ²­μ— 같은 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” 식 : 정적 νŒ©ν„°λ¦¬ λ°©μ‹μ˜ ν΄λž˜μŠ€λŠ” μ–Έμ œ μ–΄λŠ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚΄μ•„ 있게 ν• μ§€λ₯Ό μ² μ €νžˆ ν†΅μ œν•  수 μžˆλ‹€

μΈμŠ€ν„΄μŠ€ ν†΅μ œ(instance-controlled)λ₯Ό ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

  • μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅μ œν•˜λ©΄ 클래슀λ₯Ό μ‹±κΈ€ν„΄μœΌλ‘œ λ§Œλ“€ μˆ˜λ„, μΈμŠ€ν„΄μŠ€ν™” λΆˆκ°€λ‘œ λ§Œλ“€ μˆ˜λ„ μžˆλ‹€.
  • λΆˆλ³€κ°’ 클래슀(item17)μ—μ„œ λ™μΉ˜μΈ μΈμŠ€ν„΄μŠ€κ°€ 단 ν•˜λ‚˜λΏμž„μ„ 보μž₯ν•  수 μžˆλ‹€. a == bμΌλ•Œλ§Œ a.equals(b)κ°€ 성립
  • μΈμŠ€ν„΄μŠ€ ν†΅μ œλŠ” ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄μ˜ 근간이 되며 μ—΄κ±° νƒ€μž…(item34)은 μΈμŠ€ν„΄μŠ€κ°€ ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄μ§μ„ 보μž₯ν•œλ‹€.

λ°˜ν™˜ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž… 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” λŠ₯λ ₯이 μžˆλ‹€.

  1. λ°˜ν™˜ν•  객체의 클래슀λ₯Ό 자유둭게 선택할 수 있게 ν•˜λŠ” μ—„μ²­λ‚œ μœ μ—°μ„±μ„ 제곡

APIλ₯Ό λ§Œλ“€ λ•Œ μ΄λŸ¬ν•œ μœ μ—°μ„±μ„ μ‘μš©ν•˜λ©΄ κ΅¬ν˜„ 클레슀λ₯Ό κ³΅κ°œν•˜μ§€ μ•Šκ³ λ„ κ·Έ 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆμ–΄ APIλ₯Ό μž‘κ²Œ μœ μ§€ν•  수 μžˆλ‹€. μ΄λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œμ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€ 기반 ν”„λ ˆμž„μ›Œν¬(μ•„μ΄ν…œ20)을 λ§Œλ“œλŠ” 핡심 κΈ°μˆ μ΄κΈ°λ„ ν•˜λ‹€.

  1. μžλ°” 8λΆ€ν„°λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ 정적 λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μ—†λ‹€λŠ” μ œν•œμ΄ ν’€λ ΈκΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ν™” λΆˆκ°€ λ™λ°˜ 클래슀λ₯Ό λ‘˜ μ΄μœ κ°€ μ—†λ‹€.

λ™λ°˜ ν΄λž˜μŠ€μ— λ‘μ—ˆλ˜ public 정적 멀버듀 μƒλ‹Ήμˆ˜λ₯Ό κ·Έλƒ₯ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄μ— 두면 λ˜λŠ” 것이닀.

μžλ°” 8 - μΈν„°νŽ˜μ΄μŠ€μ—λŠ” public 정적 λ©€λ²„λ§Œ ν—ˆμš©

μžλ°” 9 - private 정적 λ©”μ„œλ“œ, 정적 ν•„λ“œμ™€ 정적 멀버 ν΄λž˜μŠ€λŠ” public

μž…λ ₯ λ§€κ°œλ³€μˆ˜(인자)에 따라 맀번 λ‹€λ₯Έ 클래슀의 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

  • μΈμžμ— λ”°λΌμ„œ (νŒ©ν† λ¦¬νŒ¨ν„΄) A νƒ€μž…μΌ 경우 A 클래슀 B νƒ€μž…μΌ 경우 B클래슀 λ°˜ν™˜
  • λ§€κ°œλ³€μˆ˜μ— λ”°λΌμ„œ λ‹€λ₯Έ 클래슀λ₯Ό λ°˜ν™˜ν•œλ‹€. (λ‹€ν˜•μ„±)
  1. λ°˜ν™˜ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž…(상속받은 - λ‹€ν˜•μ„±) 이기만 ν•˜λ©΄ μ–΄λ–€ 클래슀의 객체λ₯Ό λ°˜ν™˜ ν•˜λ˜μ§€ 상관없닀. (μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속을 λ°›λ˜)

EnumSet 클래슀(μ•„μ΄ν…œ 36) - (μƒμœ„ 클래슀λ₯Ό 말함) λŠ” public μƒμ„±μž 없이 였직 정적 νŒ©ν„°λ¦¬λ§Œ μ œκ³΅ν•˜λŠ”λ° μ›μ†Œμ˜ μˆ˜μ— 따라 두가지 ν•˜μœ„ 클래슀 쀑 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

μ›μ†Œκ°€ 64개 μ΄ν•˜λ©΄ μ›μ†Œλ“€μ„ long λ³€μˆ˜ ν•˜λ‚˜λ‘œ κ΄€λ¦¬ν•˜λŠ” RegularEnumSet의 μΈμŠ€ν„΄μŠ€λ₯Ό, 65개 이상이면 long λ°°μ—΄λ‘œ κ΄€λ¦¬ν•˜λŠ” JumboEnumSet의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

  /**
     * @description public μƒμ„±μž 없이 정적 νŒ©ν† λ¦¬λ§Œ 제곡
     *              μž…λ ₯ 맀개 λ³€μˆ˜μ— 따라 맀번 λ‹€λ₯Έ 클래슀의 객체λ₯Ό λ°˜ν™˜
     * @param num
     * @return
     */
    public static EnumSet getInstance(int num)  {
        if (num < 64) {
            return new RegularEnumSet();
        } else if (num > 65) {
            return new JumboEnumSet();    // 미리 new ν•œ 객체가 μ—†κ³  λ°˜ν™˜ μ‹œμ μ— new 
        }

        throw new IllegalArgumentException();

    }

정적 νŒ©ν„°λ¦¬ λ§€μ„œλ“œλ₯Ό μž‘μ„±ν•˜λŠ” μ‹œμ μ—λŠ” λ°˜ν™˜ν•  객체의 ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

  • 미리 λ§Œλ“€μ–΄ 놓지 μ•Šκ³  ν•„μš”ν•œ μ‹œμ μ— 객체λ₯Ό λ§Œλ“ λ‹€.

μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬(service provider framework) λ₯Ό λ§Œλ“œλŠ” κ·Όκ°„

μ„œλΉ„μŠ€ μ œκ³΅μžλŠ” λ°˜ν™˜λ˜λŠ” ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” μ• κ°€ μ•„λ‹˜ - λ°˜ν™˜ν•  ν΄λž˜μŠ€κ°€ 이미 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„λ„ 됨.

provider - μ„œλΉ„μŠ€μ˜ κΈ°λŠ₯을 제곡

λ°˜ν™˜ν•˜λŠ” 객체(RegularEnumSet, JumboEnumSet) κ°€ κ΅¬ν˜„μ²΄μ΄λ‹€.

μ„œλΉ„μŠ€ μ œκ³΅μžκ°€ μ‹€μ œ κ΅¬ν˜„μ²΄μ΄λ‹€.

  • μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬λŠ” 3개의 핡심 μ»΄ν¬λ„ŒνŠΈλ‘œ 이뀄진닀.
  • μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€ (service interface)
  • μ œκ³΅μžκ°€ κ΅¬ν˜„μ²΄λ₯Ό 등둝할 λ•Œ μ‚¬μš©ν•˜λŠ” 제곡자 등둝 API (provider registration API)
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλΉ„μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μΈμŠ€ν„΄μŠ€λ₯Ό 얻을 λ•Œ μ‚¬μš©ν•˜λŠ” μ„œλΉ„μŠ€ μ ‘κ·Ό API (service access API)

μ’…μ’… μ„œλΉ„μŠ€ 제곡자 μΈν„°νŽ˜μ΄μŠ€ (service provider interface)

  • JDBC μ—μ„œλŠ” Connection이 μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€ μ—­ν• 
  • DriverManager.registerDriverκ°€ 제곡자 등둝 API μ—­ν• 
  • DriverManager.getConnection이 μ„œλΉ„μŠ€ μ ‘κ·Ό API μ—­ν• 
  • Driverκ°€ μ„œλΉ„μŠ€ 제곡자 μΈν„°νŽ˜μ΄μŠ€ 역할을 μˆ˜ν–‰

정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œμ˜ 단점

상속을 ν•˜λ €λ©΄ publicμ΄λ‚˜ protected μƒμ„±μžκ°€ ν•„μš”ν•˜λ‹ˆ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ§Œ μ œκ³΅ν•˜λ©΄ ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†λ‹€.

  • κΈ°λ³Έ μƒμ„±μžκ°€ private 일 경우 상속 λΆˆκ°€ μ΄λ―€λ‘œ

정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλŠ” κ°œλ°œμžκ°€ μ°ΎκΈ° μ–΄λ ΅λ‹€.

  • νŒ©ν† λ¦¬ νŒ¨ν„΄μ΄λ‚˜ 싱글톀을 μ“Έ 경우 κ΄€λ‘€μ²˜λŸΌ μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œ λͺ…λͺ… κ·œμΉ™μ„ λ”°λ₯΄μž.
from
   λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜λ‚˜ λ°›μ•„μ„œ ν•΄λ‹Ή νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν˜•λ³€ν™˜ λ©”μ„œλ“œ 
   Date d = Date.from(instant);   

of
   μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„ μ ν•©ν•œ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” 집계 λ©”μ„œλ“œ
   Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);    

valueOf
   fromκ³Ό of의 더 μžμ„Έν•œ 버전 
   BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); 

instance / getInstance 
   (λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ”λ‹€λ©΄) λ§€κ°œλ³€μˆ˜λ‘œ λͺ…μ‹œν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ 같은 μΈμŠ€ν„΄μŠ€ μž„μ„ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 
   StackWalker luke = StackWalker.getInstance(options);    

create / newInstance 
   instance ν˜Ήμ€ getInstance와 κ°™μ§€λ§Œ 맀번 μ‚¬λ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해 λ°˜ν™˜ν•¨μ„ 보μž₯ν•œλ‹€. 
   Object newArray = Array.newInstance(classObject, arrayLen);  

getType 
   getInstance와 κ°™μœΌλ‚˜, 생성할 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ“΄λ‹€. "Type"은 νŒ©ν„°λ¦¬ λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•  객체의 νƒ€μž…μ΄λ‹€. 
   FileStore fs = Files.getFileStore(path);   

newType
   newInstance와 κ°™μœΌλ‚˜, 생성할 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ“΄λ‹€. "Type"은 νŒ©ν„°λ¦¬ λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•  객체의 νƒ€μž…μ΄λ‹€.    
   BufferedReader br = Files.newBufferedReader(path);    

type
   getTypeκ³Ό newType의 κ°„κ²°ν•œ 버전
   List<Complaint> litany = Collections.list(legacyLitany);

핡심 정리

정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œκ°€ μœ λ¦¬ν•œμ μ΄ λ§ŽμœΌλ―€λ‘œ λ¬΄μž‘μ • public μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λ˜ μŠ΅κ΄€μ΄ μžˆλ‹€λ©΄ 고치자. 
⚠️ **GitHub.com Fallback** ⚠️