Post

[Java] Default Method

[Java] Default Method

πŸ“Œ Default Methodλž€?

1
2
3
4
5
6
7
interface MyInterface {
    void normalMethod();

    default void printHello() {
        System.out.println("Hello World");
    }
}

default λ©”μ„œλ“œλŠ” Java 8λΆ€ν„° λ„μž…λœ κΈ°λŠ₯으둜, κΈ°μ‘΄μ—λŠ” μΈν„°νŽ˜μ΄μŠ€μ— 좔상 λ©”μ„œλ“œλ§Œ μž‘μ„±ν•  수 μžˆμ—ˆμœΌλ‚˜ default λ©”μ„œλ“œμ˜ λ“±μž₯으둜 둜직이 ν¬ν•¨λœ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  수 있게 λ˜μ—ˆλ‹€.

μ™œ λ“±μž₯ν•˜μ˜€μ„κΉŒ? μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ N개의 ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  ν•˜μž. μΈν„°νŽ˜μ΄μŠ€μ˜ μƒˆλ‘œμš΄ 좔상 λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜μ—ˆκ³ , λͺ¨λ“  ν΄λž˜μŠ€κ°€ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν•„μˆ˜λ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€κ³  ν•˜μž. κ·Έλ ‡λ‹€λ©΄ N개의 ν΄λž˜μŠ€κ°€ 일일히 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜λ‹€. μ΄λŠ” 맀우 λΆˆνŽΈν•˜κΈ°μ—, 좔상 λ©”μ„œλ“œμ˜ 기본적인 κ΅¬ν˜„μ„ μ œκ³΅ν•˜λŠ” default λ©”μ„œλ“œκ°€ λ“±μž₯ν•œ 것이닀. ν•„μš”ν•œ 경우 μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ κ΅¬ν˜„μ„ μž¬μ •μ˜ν•  수 μžˆλ‹€.

πŸ“Œ 이점

  • ν•˜μœ„ ν˜Έν™˜μ„±μ΄ μ’‹λ‹€. 이전에 μ–ΈκΈ‰ν•œ λ‚΄μš©μ΄μ§€λ§Œ, 기쑴에 κ΅¬ν˜„λœ ν΄λž˜μŠ€λ“€μ„ λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 있게 ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€κ°€ λ‹¨μˆœνžˆ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λŠ” 것을 λ„˜μ–΄ κΈ°λ³Έ κ΅¬ν˜„μ„ κ°€μ§ˆ 수 있게 λ˜λ©΄μ„œ μΈν„°νŽ˜μ΄μŠ€μ˜ 역할이 μœ μ—°ν•΄μ§„λ‹€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface Loggable {
    default void log(String message) {
        System.out.println("[LOG] " + message);
    }
}

interface Notifiable {
    default void notify(String event) {
        System.out.println("[NOTIFICATION] " + event);
    }
}

class ServiceProcessor implements Loggable, Notifiable {
    public void processData(String data) {
        log("데이터 처리 μ‹œμž‘: " + data);
        
        System.out.println("데이터 " + data + " 처리 쀑...");
        
        notify("데이터 처리 μ™„λ£Œ: " + data);
    }
}
  • μžλ°”λŠ” 기본적으둜 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  닀쀑 상속과 μœ μ‚¬ν•œ 효과λ₯Ό μ–»κΈ° μœ„ν•΄ implementes ν‚€μ›Œλ“œλ₯Ό 톡해 μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€. 여기에 default λ©”μ„œλ“œ κ°œλ…μ„ μΆ”κ°€ν•˜λ©΄ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€μ˜ default λ©”μ„œλ“œκ°€ μ œκ³΅ν•˜λŠ” λ‹€μ–‘ν•œ λ‘œμ§λ“€μ„ μ‘°ν•©ν•˜μ—¬ κ°€μ§ˆ 수 μžˆλ‹€.

πŸ“Œ 주의

클래슀의 닀쀑 μƒμ†μ—μ„œ λ°œμƒν•˜λŠ” Diamond Problem 이 λ™μΌν•˜κ²Œ λ°œμƒν•  수 μžˆλ‹€. μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό implements ν•œ μƒν™©μ—μ„œ λ§Œμ•½ λ™μΌν•œ μ΄λ¦„μ˜ (default) λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜λŠ” 경우 μ–΄λ–€ (default) λ©”μ„œλ“œλ₯Ό μ·¨ν•΄μ•Ό ν•  μ§€ λͺ¨ν˜Έν•΄μ§„λ‹€.

μžλ°”λŠ” 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μš°μ„ μˆœμœ„ κ·œμΉ™μ„ μ œκ³΅ν•œλ‹€.

  1. κ΅¬ν˜„ν•˜λŠ” 클래슀 λ˜λŠ” μƒμœ„ ν΄λž˜μŠ€κ°€ λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜μ˜ λ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄ ν΄λž˜μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ default λ©”μ„œλ“œλ³΄λ‹€ 항상 μš°μ„ κΆŒμ„ κ°€μ§„λ‹€.
  2. μΈν„°νŽ˜μ΄μŠ€ κ°„ 상속 계측 ꡬ쑰가 μžˆλŠ” 경우 κ°€μž₯ ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ default λ©”μ„œλ“œκ°€ μš°μ„ κΆŒμ„ κ°€μ§„λ‹€.
  3. λ™μΌν•œ 레벨의 μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λ™μΌν•œ μ‹œκ·Έλ„ˆμΉ˜μ˜ default λ©”μ„œλ“œκ°€ μΆ©λŒν•˜λŠ” 경우 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ μΆ©λŒν•˜λŠ” default λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

πŸ“Œ default λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ μΈν„°νŽ˜μ΄μŠ€ vs. 좔상 클래슀

ν•œ κ°€μ§€ 의문이 λ“€μ–΄μ•Ό ν•œλ‹€. default λ©”μ„œλ“œμ™€ 좔상 클래슀 λͺ¨λ‘ β€˜μΆ”μƒν™”β€™λ₯Ό μ œκ³΅ν•˜κ³ , κ΅¬ν˜„μ„ λΆ€λΆ„μ μœΌλ‘œ 포함할 수 μžˆλŠ”λ° μ–΄λ–€ 차이가 μžˆμ„κΉŒ?

κ°€μž₯ 큰 차이점은 ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆμœΌλ‚˜, 좔상 ν΄λž˜μŠ€λŠ” 단 ν•˜λ‚˜λ§Œ 상속할 수 μžˆλ‹€λŠ” 점이닀. 즉, 이전에 μ–ΈκΈ‰ν•œ 바와 같이 νŠΉμ • λ™μž‘μ„ 닀쀑 μƒμ†ν•˜λŠ” 효과λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.

πŸ“Œ μ°Έκ³ 

https://whybk.tistory.com/155

This post is licensed under CC BY 4.0 by the author.