상속 κ΄€κ³„μ—μ„œ νƒ€μž… λ³€ν™˜μ˜ μ΄μœ μ™€ μ‚¬μš© λͺ©μ 

2025. 4. 17. 09:54Β·Backend/JAVA
728x90

πŸ“˜ 상속 κ΄€κ³„μ—μ„œ νƒ€μž… λ³€ν™˜μ΄ μ€‘μš”ν•œ 이유 (μ—…μΊμŠ€νŒ…κ³Ό λ‹€μš΄μΊμŠ€νŒ…)

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)을 κ³΅λΆ€ν•˜λ‹€ 보면, "μ™œ ꡳ이 μžμ‹ 객체λ₯Ό λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ μ°Έμ‘°ν•˜μ§€?"λΌλŠ” 질문이 λ“€ 수 μžˆλ‹€.

이번 κΈ€μ—μ„œλŠ” 상속 κ΄€κ³„μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” μ—…μΊμŠ€νŒ…(upcasting) κ³Ό λ‹€μš΄μΊμŠ€νŒ…(downcasting) 의 κ°œλ…κ³Ό μ‹€μ œ μ‚¬μš© 사둀λ₯Ό μ •λ¦¬ν•œλ‹€.


1. μ—…μΊμŠ€νŒ…μ΄λž€?

μ—…μΊμŠ€νŒ…μ€ μžμ‹ 클래슀의 객체λ₯Ό λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ μ°Έμ‘°ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

Animal a = new Dog(); // μ—…μΊμŠ€νŒ…

μ΄λ ‡κ²Œ ν•˜λ©΄ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜λœ λ©€λ²„λ§Œ μ ‘κ·Όν•  수 μžˆμ§€λ§Œ, μ‹€μ œ κ°μ²΄λŠ” μžμ‹ 객체이기 λ•Œλ¬Έμ— μ˜€λ²„λΌμ΄λ”©λœ λ©”μ„œλ“œλŠ” μžμ‹ 클래슀의 것이 μ‹€ν–‰λ©λ‹ˆλ‹€.

μ™œ μ—…μΊμŠ€νŒ…μ„ μ“ΈκΉŒ?

  1. λ‹€ν˜•μ„±(polymorphism) κ΅¬ν˜„μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.
    • λ‹€μ–‘ν•œ μžμ‹ 객체λ₯Ό κ³΅ν†΅λœ λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν™•μž₯성이 λ›°μ–΄λ‚©λ‹ˆλ‹€.
    • μƒˆλ‘œμš΄ μžμ‹ ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λ”λΌλ„, λΆ€λͺ¨ νƒ€μž…λ§Œ μ•Œκ³  있으면 μ‰½κ²Œ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ ν™œμš© 예

List<Animal> animals = List.of(new Dog(), new Cat());

for (Animal a : animals) {
    a.sound(); // 각 μžμ‹ 클래슀의 sound()κ°€ 호좜됨
}

이처럼 μ—…μΊμŠ€νŒ…μ€ ν”„λ ˆμž„μ›Œν¬, 라이브러리, μ»¬λ ‰μ…˜ λ“±μ—μ„œλ„ 기본적으둜 μ‚¬μš©λ©λ‹ˆλ‹€.


2. λ‹€μš΄μΊμŠ€νŒ…μ΄λž€?

λ‹€μš΄μΊμŠ€νŒ…μ€ λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ 참쑰된 객체λ₯Ό λ‹€μ‹œ μžμ‹ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

Animal a = new Dog();
Dog d = (Dog) a; // λ‹€μš΄μΊμŠ€νŒ…

 

μ™œ λ‹€μš΄μΊμŠ€νŒ…μ„ μ“ΈκΉŒ?

λΆ€λͺ¨ νƒ€μž…μ—λŠ” μ—†λŠ”, μžμ‹ 클래슀 고유의 κΈ°λŠ₯을 μ‚¬μš©ν•΄μ•Ό ν•  λ•Œ ν•„μš”ν•©λ‹ˆλ‹€.

πŸ”Ή ν•„μˆ˜μ μΈ λ‹€μš΄μΊμŠ€νŒ… μ˜ˆμ‹œ

void interact(Animal a) {
    if (a instanceof Dog) {
        Dog d = (Dog) a;
        d.fetch(); // Dogμ—λ§Œ μžˆλŠ” λ©”μ„œλ“œ
    } else if (a instanceof Cat) {
        Cat c = (Cat) a;
        c.scratch(); // Catμ—λ§Œ μžˆλŠ” λ©”μ„œλ“œ
    }
}

이 경우, λΆ€λͺ¨ νƒ€μž…μΈ Animal둜 λ°›μ•„μ„œ κ³΅ν†΅λœ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λ˜, ν•„μš”ν•  λ•Œ μžμ‹ 객체의 고유 λ™μž‘μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ‹€μš΄μΊμŠ€νŒ…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

⚠️ μ£Όμ˜μ‚¬ν•­

  • λ‹€μš΄μΊμŠ€νŒ… 전에 instanceof둜 νƒ€μž… 체크λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ `ClassCastException`이 λ°œμƒν•  수 μžˆλ‹€.

λŒ€μ²΄ 방법: 좔상 λ©”μ„œλ“œ ν™œμš©

λ‹€μš΄μΊμŠ€νŒ…μ„ μ΅œμ†Œν™”ν•˜κ³  μ‹Άλ‹€λ©΄, λΆ€λͺ¨ ν΄λž˜μŠ€μ— `좔상 λ©”μ„œλ“œ`λ₯Ό μ„ μ–Έν•˜κ³  μžμ‹μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” 방식이 μ’‹μŒ.

abstract class Animal {
    abstract void interact();
}

class Dog extends Animal {
    void interact() { fetch(); }
    void fetch() { ... }
}

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‹€μš΄μΊμŠ€νŒ… 없이도 μžμ‹μ˜ 고유 λ™μž‘μ„ μ‹€ν–‰ν•  수 μžˆλ‹€.


3. 정리

μ—…μΊμŠ€νŒ… μžμ‹ -> λΆ€λͺ¨, λ‹€ν˜•μ„± κ΅¬ν˜„, 자주 μ‚¬μš©λ¨
λ‹€μš΄μΊμŠ€νŒ… λΆ€λͺ¨ -> μžμ‹, 고유 κΈ°λŠ₯ μ‚¬μš© μ‹œ ν•„μš”, μ‘°μ‹¬ν•΄μ„œ μ‚¬μš©

`μ—…μΊμŠ€νŒ…`은 객체지ν–₯의 κΈ°λ³Έ 도ꡬ이며, `λ‹€μš΄μΊμŠ€νŒ…`은 νŠΉμ • μƒν™©μ—μ„œλ§Œ μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 게 μ’‹μŠ΅λ‹ˆλ‹€.

728x90
'Backend/JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬
  • 좔상 클래슀 & 봉인 클래슀
0woy
0woy
Algorithm, CS, Web λ“± 배운 λ‚΄μš©μ„ κΈ°λ‘ν•©λ‹ˆλ‹€.
  • 0woy
    0woy dev
    0woy
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (44) N
      • Backend (4) N
        • JAVA (3)
        • DB (1) N
      • Frontend (15)
        • HTML5 (1)
        • CSS (1)
        • JS (4)
        • Vue 3 (9)
      • Computer Science (13) N
        • λ„€νŠΈμ›Œν¬ (7) N
        • 운영체제 (5)
      • PS (8)
        • LeetCode (2)
        • Baekjoon (1)
        • Programmers (0)
        • μ•Œκ³ λ¦¬μ¦˜ (5)
      • Dev Trivia (4) N
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    dfs
    udp
    fastretransmit
    function
    BFS
    HTTP
    JS
    list
    Vue3
    dom
    μ•”μ‹œμ κ·Έλž˜ν”„
    fast recovery
    https
    implicit graph
    javascript
    set
    κ·Έλž˜ν”„
    트리
    ν•¨μˆ˜
    java
    tcp tahoe
    상속
    DP
    속성
    select
    tcp
    html
    Props
    map
    leetcode
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • 250x250
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
0woy
상속 κ΄€κ³„μ—μ„œ νƒ€μž… λ³€ν™˜μ˜ μ΄μœ μ™€ μ‚¬μš© λͺ©μ 
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”