JAVA

[Java] 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ

YeopJu 2024. 6. 30. 23:34
λ°˜μ‘ν˜•

이전에 λ¦¬νŒ©ν„°λ§μ„ μ§„ν–‰ν•˜λ©΄μ„œ μƒμ„±μž λŒ€μ‹  정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ κ²½ν—˜μ΄ μžˆλ‹€. κ·Έ λ‹Ήμ‹œμ—λŠ” λ‚΄λΆ€ λ‘œμ§μ— λΆ€ν•©ν•˜λŠ” 의미λ₯Ό κ°€μ§„ 넀이밍이 κ°€λŠ₯ν•˜λ‹€λŠ” 이유 ν•˜λ‚˜λ§ŒμœΌλ‘œ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν–ˆλ‹€. ν•˜μ§€λ§Œ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œμ—λŠ” 이λ₯Ό ν¬ν•¨ν•œ 5κ°€μ§€ μž₯점과 2κ°€μ§€ 단점이 μ‘΄μž¬ν•œλ‹€.

 


 

β˜‘οΈ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œμ˜ μž₯점

 

1. λ‚΄λΆ€ λ‘œμ§μ— λΆ€ν•©ν•˜λŠ” 의미λ₯Ό κ°€μ§„ 넀이밍이 κ°€λŠ₯ν•˜λ‹€.

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μž₯점으둜 정적 νŒ©ν† λ§ λ©”μ„œλ“œλŠ” 넀이밍 μ»¨λ²€μ…˜μ΄ μ‘΄μž¬ν•œλ‹€.

 

`from` : ν•˜λ‚˜μ˜ 맀개 λ³€μˆ˜λ₯Ό λ°›μ•„μ„œ 객체λ₯Ό 생성

`of` : μ—¬λŸ¬κ°œμ˜ 맀개 λ³€μˆ˜λ₯Ό λ°›μ•„μ„œ 객체λ₯Ό 생성

`getInstance` | `instance` : μΈμŠ€ν„΄μŠ€λ₯Ό 생성. 이전에 λ°˜ν™˜ν–ˆλ˜ 것과 같을 수 μžˆλ‹€

`newInstance` | `create` : 항상 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성

`get[OrderType]` : λ‹€λ₯Έ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 생성. 이전에 λ°˜ν™˜ν–ˆλ˜ 것과 같을 수 μžˆλ‹€

`new[OrderType]` : 항상 λ‹€λ₯Έ νƒ€μž…μ˜ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성

 

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

미리 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄λ†“κ±°λ‚˜ μƒˆλ‘œ λ§Œλ“  μΈμŠ€ν„΄μŠ€λ₯Ό μΊμ‹±ν•˜λŠ” λ°©λ²•μœΌλ‘œ μž¦μ€ 객체 생성을 λ°©μ§€ν•  수 μžˆλ‹€.

μ΄λŠ” ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄κ³Ό ν†΅μš©λ  수 μžˆλ‹€. ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄μ΄λž€ 자주 μ‚¬μš©λ˜λŠ” 속성과 λ³€ν•˜μ§€ μ•ŠλŠ” 속성을 λΆ„λ¦¬ν•˜κ³  λ³€ν•˜μ§€ μ•ŠλŠ” 속성을 μΊμ‹±ν•˜κ³  μž¬μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ€„μ—¬μ£ΌλŠ” 것을 λ§ν•œλ‹€.

 

 

 

ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄μ„ μ‚¬μš©ν•  λ•Œ, 일반적으둜 HashMap을 μ‚¬μš©ν•œ 캐싱 방법을 λ– μ˜¬λ¦΄ κ°€λŠ₯성이 λ†’λ‹€. ν•˜μ§€λ§Œ HashMap을 μ‚¬μš©ν•œλ‹€λ©΄ κ°•ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜κ²Œ λ˜μ–΄ CG λŒ€μƒμ΄ λ˜μ§€ μ•Šκ³ , 결과적으둜 λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” WeakHashMap λ˜λŠ” SoftReferenceλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

` private static Map<String, SoftReference<TreeModel>> cache = new HashMap<>();`

public class TreeModelFactory {
    private static Map<String, SoftReference<TreeModel>> cache = new HashMap<>();

    public static TreeModel getTreeModel(String key) {
        SoftReference<TreeModel> ref = cache.get(key);
        TreeModel model = (ref != null) ? ref.get() : null;

        if (model == null) {
            model = new TreeModel();
            cache.put(key, new SoftReference<>(model));
        }

        return model;
    }
}

 

 

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

 

λ°˜ν™˜ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž…μ΄κΈ°λ§Œ ν•˜λ©΄ μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•΄λ„ 상관 μ—†λ‹€. 예λ₯Ό λ“€μ–΄, EnumSet은 public μƒμ„±μž 없이 였직 정적 νŒ©ν† λ¦¬λ§Œ μ œκ³΅ν•œλ‹€. μ΄λŠ” μ›μ†Œκ°€ 64개 μ΄ν•˜λ©΄ RegularEnumSet의 μΈμŠ€ν„΄μŠ€λ₯Ό, 65개 이상이면 JumboEnumSet의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

이 λ•Œ ν΄λΌμ΄μ–ΈνŠΈλŠ” νŒ©ν† λ¦¬κ°€ κ±΄λ„€μ£ΌλŠ” 객체가 μ–΄λŠ 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€ μ•Œ μˆ˜λ„ μ—†κ³ , μ•Œ ν•„μš”λ„ μ—†λ‹€

 

 

4. 맀개 λ³€μˆ˜μ— 따라 항상 λ‹€λ₯Έ 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

 

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

λŒ€ν‘œμ μΈ μ˜ˆμ‹œλ‘œ μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬μ˜ μžλ°” κΈ°λ³Έ κ΅¬ν˜„μ²΄μΈ `ServiceLoader`κ°€ μžˆλ‹€. μ΄λŠ” μ•„λž˜ μ˜ˆμ‹œ μ½”λ“œμ™€ 같이 μ–΄λ–€ κ΅¬ν˜„μ²΄κ°€ μ˜¬μ§€ λͺ¨λ₯΄μ§€λ§Œ, ν•΄λ‹Ή κ΅¬ν˜„μ²΄κ°€ λ”°λ₯΄κ³  μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€ 기반으둜만 코딩을 해야될 κ²½μš°μ— μ‚¬μš©λ˜λ©° 이λ₯Ό 톡해 κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

 

public static void main(String[] args){
	ServiceLoader<TempService> loader = ServiceLoader.load(TempService.class);
	Optional<TempService> tempServiceOptional = loader.findFirst();
	tempServiceOptional.ifPresent(h -> {
    	System.out.println(h.check());
    });
}

 

β˜‘οΈ 단점

1.μƒμ„±μžλ₯Ό μ œκ³΅ν•˜μ§€ μ•Šκ³  정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ§Œ μ œκ³΅ν•˜λŠ” 경우, ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†λ‹€.

이 μ œμ•½μ€ 상속보닀 μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λ„λ‘ μœ λ„ν•œλ‹€.

 

2. κ°œλ°œμžκ°€ μ°ΎκΈ° μ–΄λ ΅λ‹€.

μƒμ„±μžμ²˜λŸΌ API μ„€λͺ…에 λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— JavaDocsλ₯Ό ν™œμš©ν•΄μ„œ λͺ…μ‹œν•΄μ£ΌλŠ” μŠ΅κ΄€μ„ λ“€μ΄μž.

 

 

 

 

μΈν„°νŽ˜μ΄μŠ€μ™€ 정적 λ©”μ„œλ“œ - μžλ°” 9버전뢀터 μΈν„°νŽ˜μ΄μŠ€μ— 정적 λ©”μ„œλ“œμ™€ default λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€. (μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ ‘κ·Όμ œν•œμžλ₯Ό μ„ μ–Έν•΄μ£Όμ§€ μ•ŠμœΌλ©΄ public으둜 κ°„μ£Όλœλ‹€) 이둜 인해 μœ ν‹Έλ¦¬ν‹° 클래슀λ₯Ό κ΅¬ν˜„ν•  일이 μ€„μ–΄λ“€μ—ˆμ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€μ—λŠ” Private ν•„λ“œκ°’μ„ μ„ μ–Έν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ—¬μ „νžˆ μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λŠ” κ²½μš°κ°€ μ‘΄μž¬ν•œλ‹€.

λ°˜μ‘ν˜•