• [Java] ch5 μžλ°” OOP λ‹€ν˜•μ„± / 좔상 λ©”μ„œλ“œμ™€ 좔상 클래슀

    2023. 9. 8.

    by. @leeeun

    06 λ‹€ν˜•μ„±(polymorphism)

    class Tiger extends Animal implements Predator, Barkable {
    }
    
    Tiger tiger = new Tiger();  // Tiger is a Tiger
    Animal animal = new Tiger();  // Tiger is a Animal
    Predator predator = new Tiger();  // Tiger is a Predator
    Barkable barkable = new Tiger();  // Tiger is a Barkable
    
    • ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬ 개의 μžλ£Œν˜• νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆλŠ” 것 (ex - tiger κ°μ²΄λŠ” Tiger, Animal 클래슀의 κ°μ²΄μ΄λ©΄μ„œ Barakable, Predator μΈν„°νŽ˜μ΄μŠ€μ˜ 객체)
    • 객체지ν–₯ μ–Έμ–΄μ˜ νŠΉμ§•

     

    ν˜•λ³€ν™˜(Casting)

    • μ—…μΊμŠ€νŒ…(upcasting) : (μžμ‹ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ) μžμ‹ν΄λž˜μŠ€μ˜ νƒ€μž…μ˜ 레퍼런슀 λ³€μˆ˜λ₯Ό λΆ€λͺ¨ν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•˜λŠ” 것. (νƒ€μž…λ³€ν™˜ ꡬ문 μƒλž΅ κ°€λŠ₯, μžλ™ ν˜•λ³€ν™˜ 됨)
    • λ‹€μš΄μΊμŠ€νŒ…(downcasting) : (μžμ‹ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ) λΆ€λͺ¨ν΄λž˜μŠ€ νƒ€μž…μ˜ 레퍼런슀 λ³€μˆ˜λ₯Ό μžμ‹ν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•˜λŠ” 것. (νƒ€μž…λ³€ν™˜ ꡬ문 μƒλž΅ λΆˆκ°€, ν˜•λ³€ν™˜ νƒ€μž…μ„ λͺ…μ‹œν•΄μ•Όλ¨)
    • μžμ‹ 클래슀 νƒ€μž…μ˜ 레퍼런슀 λ³€μˆ˜λ₯Ό λΆ€λͺ¨ 클래슀 νƒ€μž…μ˜ 레퍼런슀 λ³€μˆ˜λ‘œ λ‹€λ£° 수 μžˆλ‹€

     

    insteadof

    λ ˆνΌλŸ°μŠ€λ³€μˆ˜μ΄λ¦„ instanceof 클래슀λͺ… // λ³€μˆ˜κ°€ 클래슀의 객체이면 true, μ•„λ‹ˆλ©΄ false λ°˜ν™˜
    
    • μ–΄λ–€ 객체가 νŠΉμ • 클래슀의 객체인지λ₯Ό 쑰사할 λ•Œ μ‚¬μš©λ˜λŠ” μžλ°”μ˜ λ‚΄μž₯ λͺ…λ Ήμ–΄
    • ν•΄λ‹Ή λ³€μˆ˜κ°€ ν˜•λ³€ν™˜ κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” μš©λ„κΈ°λ„ 함
    • animal instanceof Tiger = animal κ°μ²΄λŠ” Tiger 클래슀둜 λ§Œλ“€μ–΄μ§„ 객체인가? λ₯Ό λ¬»λŠ” 쑰건문

    인용

    [Java] μžλ°” - λ‹€ν˜•μ„±μ˜ 이해 (ν˜•λ³€ν™˜ 및 instanceof μ—°μ‚°μž)

    [Java] 클래슀 ν˜• λ³€ν™˜


    07 좔상 λ©”μ„œλ“œ / 좔상 클래슀

     

    좔상 λ©”μ†Œλ“œ(abstract method)

    abstract λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„(); //μ„ μ–Έλ§Œ ν•˜κ³  κ΅¬ν˜„μ€ x
    
    • μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œ
    • μ„ μ–ΈλΆ€λ§Œ μ‘΄μž¬ν•˜κ³  κ΅¬ν˜„λΆ€λŠ” μž‘μ„±λ˜μ–΄ μžˆμ§€ μ•Šμ•„μ„œ 좔상 λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ 클래슀λ₯Ό μƒμ†λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•¨

     

    좔상 클래슀(abstract class)

    abstract class ν΄λž˜μŠ€μ΄λ¦„ {
    
        ...
    
        abstract λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„();
    
        ...
    
    }
    
    • ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀
    • λ°˜λ“œμ‹œ 포함해야 ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό 좔상 ν΄λž˜μŠ€μ— 좔상 λ©”μ†Œλ“œλ‘œ μ„ μ–Έ → 이 클래슀λ₯Ό μƒμ†λ°›λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ 좔상 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜λ„λ‘
    • μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 X (Animal a= new Animal() λΆˆκ°€)→ 상속을 톡해 μžμ‹ 클래슀λ₯Ό λ§Œλ“€κ³  μžμ‹ ν΄λž˜μŠ€κ°€ 좔상 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό μžμ‹ 클래슀λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ 생성 κ°€λŠ₯
    • μ΄μ™Έμ—λŠ” 일반 ν΄λž˜μŠ€μ™€ 동일 (μƒμ„±μž, ν•„λ“œ, 일반 λ©”μ†Œλ“œλ„ 포함 κ°€λŠ₯)

     

    μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀의 차이

    • μžλ°” 8 버전뢀터 μΈν„°νŽ˜μ΄μŠ€μ— default λ©”μ„œλ“œκ°€ μΆ”κ°€→ 좔상 ν΄λž˜μŠ€μ™€μ˜ 차이점이 λͺ¨ν˜Έ (μžμ‹ ν΄λž˜μŠ€μ— λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜λ„λ‘ ν•˜λŠ” κΈ°λŠ₯이 λ™μΌν•˜λ―€λ‘œ)
    • ν•˜μ§€λ§Œ 좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ 달리 일반 클래슀처럼 객체 λ³€μˆ˜, μƒμ„±μž, private λ©”μ„œλ“œ 등을 κ°€μ§ˆ 수 있음 (μΈν„°νŽ˜μ΄μŠ€λŠ” x

    λŒ“κΈ€