• [Java] ch5 μžλ°” μΈν„°νŽ˜μ΄μŠ€

    2023. 9. 8.

    by. @leeeun

    05 μΈν„°νŽ˜μ΄μŠ€

    • λ‹€λ₯Έ 클래슀λ₯Ό μž‘μ„±ν•  λ•Œ 기본이 λ˜λŠ” 틀을 μ œκ³΅ν•˜λ©΄μ„œ, λ‹€λ₯Έ 클래슀 μ‚¬μ΄μ˜ 쀑간 맀개 μ—­ν• κΉŒμ§€ λ‹΄λ‹Ήν•˜λŠ” μΌμ’…μ˜ 좔상 클래슀
    • 객체의 μ‚¬μš© 방법을 κ°€μ΄λ“œλΌμΈ ν•˜λŠ” 것
    • μžλ°”μ— 클래슀λ₯Ό ν†΅ν•œ 닀쀑 상속이 μ—†λŠ” λŒ€μ‹  μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 닀쀑 상속을 지원
    • μ˜€λ‘œμ§€ 좔상 λ©”μ†Œλ“œμ™€ μƒμˆ˜λ‘œ 이루어짐 ↔ μΆ”μƒν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œ 뿐만 μ•„λ‹ˆλΌ μƒμ„±μž, ν•„λ“œ, 일반 λ©”μ†Œλ“œλ„ 포함

     

    νŠΉμ§•

    • 닀쀑 상속 κ°€λŠ₯(extends) - 일반 클래슀(단일 μƒμ†λ§Œ κ°€λŠ₯)와 달리 μ—¬λŸ¬ 개의 λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό extends둜 상속받을 수 있음
    • 좔상 λ©”μ„œλ“œμ™€ μƒμˆ˜λ§Œ μ‚¬μš© κ°€λŠ₯ (κ΅¬ν˜„ μ†ŒμŠ€ 생성 λΆˆκ°€)
    • μƒμ„±μž μ‚¬μš© λΆˆκ°€ (객체가 μ•„λ‹ˆλ―€λ‘œ)
    • **λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© ν•„μˆ˜ (**μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό 함)

     

    μΈν„°νŽ˜μ΄μŠ€μ˜ μ‚¬μš© 이유

    • μΈν„°νŽ˜μ΄μŠ€λŠ” μ½”λ“œμ™€ μΈν„°νŽ˜μ΄μŠ€λ‘œ μƒμ„±λœ 객체듀을 쀑간에 μ€‘κ³„ν•΄μ£ΌλŠ” μ—­ν• 
    • 개발 μ½”λ“œκ°€ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œ 호좜 → μΈν„°νŽ˜μ΄μŠ€κ°€ 객체의 λ©”μ„œλ“œλ₯Ό 호좜
    • 클래슀의 객체가 λͺ‡κ°œκ°€ 될지 μ•Œ 수 μ—†μœΌλ―€λ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λ“€μ„ ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ‹€λ£Έ
    • 의쑴적인 클래슀λ₯Ό 독립적인 클래슀둜 μ „ν™˜

     

    μ„ μ–Έ

    μ ‘κ·Όμ œμ–΄μž interface μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {
    
        public static final νƒ€μž… μƒμˆ˜μ΄λ¦„ = κ°’;
    
        ...
    
        public abstract λ©”μ†Œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜λͺ©λ‘);
    
        ...
    
    }
    
    • ν΄λž˜μŠ€μ™€λŠ” 달리 μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  μƒμˆ˜λŠ” public static final이어야 ν•˜λ©°, λͺ¨λ“  λ©”μ†Œλ“œλŠ” public abstract이어야 함
    • μ ‘κ·Ό μ œμ–΄μžλŠ” μƒλž΅ κ°€λŠ₯ν•˜λ©° μƒλž΅μ‹œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€

     

    μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œ

    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό implementsν•œ ν΄λž˜μŠ€λ“€μ΄ κ°•μ œλ‘œ κ΅¬ν˜„ν•΄μ•Ό 함 (ν΄λž˜μŠ€μ— κ΅¬ν˜„λ˜μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ 컴파일 였λ₯˜ λ°œμƒ)
    • λ©”μ„œλ“œμ˜ 이름과 μž…μΆœλ ₯에 λŒ€ν•œ μ •μ˜λ§Œ 있고 λ‚΄μš©μ΄ μ—†μŒ
    • μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλŠ” 항상 public으둜 κ΅¬ν˜„ν•΄μ•Ό 함

     

    μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„

    class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ { ... }
    
    • 직접 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것은 λΆˆκ°€
    • μΈν„°νŽ˜μ΄μŠ€κ°€ ν¬ν•¨ν•˜κ³  μžˆλŠ” 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ€„ 클래슀λ₯Ό μž‘μ„±ν•΄μ•Ό 함

     

    λ””ν΄νŠΈ λ©”μ„œλ“œ

    interface Predator {
        String getFood();
    
        default void printFood() {
            System.out.printf("my food is %s\\n", getFood());
        }
    }
    
    • μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ λ©”μ„œλ“œ → κ΅¬ν˜„μ²΄λ₯Ό κ°€μ§ˆ 수 x (μž…μΆœλ ₯에 λŒ€ν•œ μ •μ˜λ§Œ 있고 λ‚΄μš©μ΄ μ—†μŒ)
    • μΈν„°νŽ˜μ΄μŠ€μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œ → κ΅¬ν˜„μ²΄λ₯Ό κ°€μ§ˆ 수 o , ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λŠ” λ””ν΄λ“œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©ν•  수 있고 μ˜€λ²„λΌμ΄λ”©μ΄ κ°€λŠ₯

     

    인용

    μ½”λ”©κ΅μœ‘ ν‹°μ”¨ν”ΌμŠ€μΏ¨

    05-07 μΈν„°νŽ˜μ΄μŠ€

    λŒ“κΈ€