상속 μ‘°μ‹¬πŸ™…β€β™€οΈ - μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜μž

λͺ©μ°¨

상속보닀 μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λŠ” 게 쒋은 이유λ₯Ό μ•Œμ•„λ³΄μž.

μš°μ„  상속과 μ»΄ν¬μ§€μ…˜μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • 상속 : λΆ€λͺ¨ 클래슀λ₯Ό μžμ‹ν΄λž˜μŠ€κ°€ μž¬μ‚¬μš©+ν™•μž₯ν•˜λŠ” 것 (IS-A 관계)

  • μ»΄ν¬μ§€μ…˜ : κΈ°μ‘΄ ν΄λž˜μŠ€κ°€ μƒˆλ‘œμš΄ 클래슀의 κ΅¬μ„±μš”μ†Œκ°€ λ˜λŠ” 것 (HAS-A 관계)

상속은 λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ₯Ό μž¬μ‚¬μš©+ν™•μž₯ν•  수 μžˆλ‹€. μ»΄ν¬μ§€μ…˜μ€ μ½”λ“œ μž¬μ‚¬μš©λ§Œ ν•˜κ³ , λΆ€λͺ¨ λ©”μ†Œλ“œλ₯Ό ν™•μž₯ν•  μˆ˜λŠ” μ—†λ‹€.

상속 κ΄€κ³„μ—μ„œλŠ” μ—¬λŸ¬ λ¬Έμ œκ°€ λ°œμƒν•˜κΈ°λ„ ν•œλ‹€.

μƒμ†μ˜ 문제점?

λ‹€μŒκ³Ό 같은 상황이 μžˆμ„ 수 μžˆλ‹€.

public class Engine {
    protected int engineCapacity;

    public Engine(int engineCapacity) {
        this.engineCapacity = engineCapacity;
    }

    public startEngine() {
        // engineCapacity μ‚¬μš©ν•΄μ„œ κΈ°λŠ₯ 처리
    }
}

public class Car extends Engine {
    ...

    public Car(int engineCapacity, ...) {
        super(engineCapacity);
        // μƒμœ„ Engine 클래슀의 λ³€μˆ˜/λ©”μ†Œλ“œ μ‚¬μš©ν•΄μ„œ κΈ°λŠ₯ 처리
    }

}

이 경우 ν•˜μœ„ ν΄λž˜μŠ€κ°€ μƒμœ„ ν΄λž˜μŠ€μ— κ°•ν•˜κ²Œ κ²°ν•©, μ˜μ‘΄ν•˜κ²Œ λœλ‹€. 즉, μΊ‘μŠν™”λ₯Ό κΉ¨λœ¨λ¦°λ‹€(μƒμœ„ 클래슀의 κ΅¬ν˜„μ΄ ν•˜μœ„ ν΄λž˜μŠ€μ— λ…ΈμΆœλ˜κ³  κ°•ν•˜κ²Œ κ²°ν•©/의쑴). 이 κ΅¬μ‘°λŠ” λͺ‡ 가지 λ¬Έμ œκ°€ 생길 수 μžˆλ‹€.

  • λ§Œμ•½ λΆ€λͺ¨ν΄λž˜μŠ€μ—μ„œ ν•„λ“œμ˜ νƒ€μž…λ₯Ό λ°”κΎΈλ©΄, μžμ‹ ν΄λž˜μŠ€λ“€λ„ ν•΄λ‹Ή ν•„λ“œ νƒ€μž…μ„ 일일이 λͺ¨λ‘ μˆ˜μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄λŸ°μ‹μœΌλ‘œ 변경에 μœ μ—°ν•˜μ§€ λͺ»ν•˜λ‹€.

  • λΆ€λͺ¨ 클래슀 λ©”μ†Œλ“œ μ‚¬μ΄μ˜ λ‘œμ§μ„ λͺ¨λ₯΄κ³  μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•œλ‹€λ©΄, μžμ‹ 클래슀의 λ©”μ†Œλ“œκ°€ μ›ν•˜μ§€ μ•Šκ²Œ 잘λͺ» λ™μž‘ν•  수 μžˆλ‹€. μ°Έκ³  링크

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜μž.

μ»΄ν¬μ§€μ…˜μ„ μ“°μž

🌟 κΈ°μ‘΄ 클래슀λ₯Ό private μΈμŠ€ν„΄μŠ€λ‘œ λ§Œλ“€μ–΄μ„œ μƒˆλ‘œμš΄ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘°ν•˜λŠ” 방식.
    즉, κΈ°μ‘΄ ν΄λž˜μŠ€κ°€ μƒˆλ‘œμš΄ 클래슀의 κ΅¬μ„±μš”μ†Œλ‘œ 쓰인닀

Carν΄λž˜μŠ€μ— Engine ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€λ‘œ λ“€μ–΄κ°€μžˆλ‹€.

public class Car {
    private Engine engine; // μ»΄ν¬μ§€μ…˜
}

Engine 클래슀의 μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜λ €λ©΄, engine μΈμŠ€ν„΄μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. κΈ°μ‘΄ 클래슀(Engine 클래슀)의 μ½”λ“œκ°€ λ°”λ€Œλ”λΌλ„ μƒˆλ‘œμš΄ 클래슀(Car)의 영ν–₯이 적닀. 예λ₯Ό λ“€μ–΄, Engine 클래슀의 μ–΄λ–€ ν•„λ“œ νƒ€μž…μ΄ λ³€κ²½λ˜λ”λΌλ„, Car ν΄λž˜μŠ€μ—μ„œλŠ” μ½”λ“œλ₯Ό λ°”κΏ€ ν•„μš”μ—†λ‹€.

즉, 클래슀 κ°„ 의쑴 관계가 μ—†μœΌλ‹ˆ μƒμœ„ 클래슀의 μ½”λ“œκ°€ λ°”λ€Œμ–΄μ„œ ν•˜μœ„ 클래슀의 μ½”λ“œλ₯Ό λ‹€μ‹œ λ³€κ²½ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” 방식이 μ•„λ‹ˆλ‹€. λ©”μ†Œλ“œ ν˜ΈμΆœμ„ 톡해 μ‚¬μš©ν•˜λ©΄ λœλ‹€. 변경에 μœ μ—°ν•˜κ³  μ•ˆμ „ν•˜λ‹€.

이처럼 μ»΄ν¬μ§€μ…˜μ€ λ©”μ†Œλ“œλ₯Ό μž¬μ‚¬μš©μ€ ν•  수 μžˆμœΌλ‚˜, μ˜€λ²„λΌμ΄λ”©(ν™•μž₯)ν•  μˆ˜λŠ” μ—†λ‹€. λ”°λΌμ„œ ν™•μž₯ κ΄€λ ¨ν•˜μ—¬ λ°œμƒν•˜λŠ” λ¬Έμ œμ—μ„œ μžμœ λ‘­λ‹€.

The composition also provides code reusability but the difference here is we do not extend the class for this. 참고 링크

상속과 μ»΄ν¬μ§€μ…˜

상속과 μ»΄ν¬μ§€μ…˜μ„ μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • Engine κΈ°λŠ₯을 μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ Car은 μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν–ˆλ‹€.

  • TeslaλŠ” Car의 κΈ°λŠ₯을 μž¬μ‚¬μš© + ν™•μž₯ν•˜κΈ° μœ„ν•΄μ„œ 상속 λ°›μ•˜λ‹€.

  • is-a 와 has-a 관계 비ꡐ

    • "is-a" relationship (μž¬μ‚¬μš©+ν™•μž₯)

      • a senior citizen is a citizen

      • a Manager is an Employee

    • β€œhas-a" relationship (κΈ°λŠ₯만 λ°›κ² λ‹€)

      • a car has an engine, a transmission, gas tank

      • a Manager has a PayrollID

μ •λ¦¬ν•˜λ©΄

  • 상속은 μ½”λ“œ μž¬μ‚¬μš©+ν™•μž₯ν•  수 μžˆμœΌλ‚˜, μƒμ†κ΄€κ³„μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμœΌλ‹ˆ ν™•μ‹€ν•œ is-a 관계일 λ•Œλ§Œ 상속을 μ‚¬μš©ν•˜μž.

  • λ‹¨μˆœ κΈ°λŠ₯을 μž¬μ‚¬μš©ν•˜κ³ μž ν•œλ‹€λ©΄(has-a 관계), μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜μž. μ»΄ν¬μ§€μ…˜μ€ μ½”λ“œ μž¬μ‚¬μš©λ§Œ ν•˜κ³  ν™•μž₯ν•  수 μ—†μ–΄ μ—¬λŸ¬ λ¬Έμ œμ—μ„œ μžμœ λ‘­λ‹€.

상속 κ΄€κ³„λŠ” ν•„μš”ν•  λ•Œλ§Œ μ‚¬μš©ν•˜μž β†’ μΈν„°νŽ˜μ΄μŠ€λ‚˜ μ»΄ν¬μ§€μ…˜μ„ μ“°μž

개발 섀계 λ‹¨κ³„μ—μ„œ λΆ€λͺ¨λ₯Ό μΆ”μƒν΄λž˜μŠ€ ν˜Ήμ€ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ§Œλ“€μ§€ λ‘˜ 쀑 κ³ λ―Όν•  λ•ŒλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μž. 닀쀑 상속이 κ°€λŠ₯ν•˜κ³  상속 κ΄€κ³„μ˜ λ¬Έμ œκ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. λ§Œμ•½ 이미 λΆ€λͺ¨κ°€ (좔상)클래슀라면 μžμ‹ ν΄λž˜μŠ€λŠ” 상속 κ΄€κ³„λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜μž.

ν™•μ‹€ν•œ is-a 관계이고 μ½”λ“œμ˜ μž¬μ‚¬μš©+ν™•μž₯이 ν•„μš”ν•œ 경우일 λ•Œλ§Œ 상속을 μ‚¬μš©ν•˜μž. μƒμ†κ΄€κ³„λŠ” λΆ€λͺ¨κ°€ 변경될 λ•Œ μžμ‹λ“€λ„ λ‹€ 변경이 λ˜μ–΄μ•Ό ν•˜λŠ” 상황일 λ•Œ μ‚¬μš©ν•˜μž. μ•„λ‹ˆλΌλ©΄ μΈν„°νŽ˜μ΄μŠ€λ‚˜ μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜μžβ•

Reference

μœ„λ‘œκ°€κΈ°β¬†

Last updated