λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“’ | Kotlin/✨ | κ°œλ…

[Kotlin] 상속(Inheritance)

by immgga 2024. 6. 14.

좜처: unsplash.com

 

μƒμ†μ΄λž€?

λΆ€λͺ¨μ˜ μžμ›μ„ μžμ‹μ΄ λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•˜λŠ” 것을 상속이라고 ν•œλ‹€.

 

상속은 클래슀 κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜κ³  μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이기 μœ„ν•΄ μ‚¬μš©λœλ‹€. 상속을 톡해 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 속성과 ν•¨μˆ˜λ₯Ό λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

상속이 ν•„μš”ν•œ 경우

상속이 ν•„μš”ν•œ κ²½μš°λŠ”

이미 μ‘΄μž¬ν•˜λŠ” 클래슀λ₯Ό ν™•μž₯ν•΄ μƒˆλ‘œμš΄ μ†μ„±μ΄λ‚˜ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•œ 클래슀λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•  λ•Œ,
μ—¬λŸ¬ 개의 클래슀λ₯Ό λ§Œλ“€μ—ˆλŠ”λ° ν΄λž˜μŠ€λ“€μ˜ 곡톡점을 뽑아 μ½”λ“œ 관리λ₯Ό νŽΈν•˜κ²Œ ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©λœλ‹€.

 

 

μƒμ†μ˜ ꡬ성

속성과 ν•¨μˆ˜λ₯Ό λ¬Όλ €μ£ΌλŠ” μͺ½μ„ 슈퍼 클래슀(λΆ€λͺ¨ 클래슀), λ¬Όλ €λ°›λŠ” 클래슀λ₯Ό μ„œλΈŒ 클래슀(μžμ‹ 클래슀)라고 ν•œλ‹€.

상속을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžμ‹ 클래슀의 끝에 콜둠(:)을 달고 상속받을 λΆ€λͺ¨ 클래슀의 이름과 νŒŒλΌλ―Έν„°λ₯Ό μ •μ˜ν•΄ μ£Όλ©΄ λœλ‹€.

class `μžμ‹ 클래슀`(p1: String, p2: Int): `λΆ€λͺ¨ 클래슀`(p1, p2)

 

 

μƒμ†μ˜ 쑰건

λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ open μƒνƒœκ°€ μ•„λ‹ˆλ©΄ 상속을 받을 수 μ—†λ‹€.

μ½”ν‹€λ¦°μ˜ 상속 κΈˆμ§€ μƒνƒœμΈ final νƒœκ·Έκ°€ μžλ™μœΌλ‘œ ν΄λž˜μŠ€μ— λΆ™κΈ° λ•Œλ¬Έμ— 상속을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” κΌ­ open νƒœκ·Έλ₯Ό class μ•žμ— λΆ™μ—¬μ€˜μ•Ό ν•œλ‹€.

 

λ˜ν•œ μƒμ†μ—λŠ” 2κ°€μ§€μ˜ κ·œμΉ™μ΄ λ”°λ₯Έλ‹€.

μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ‘΄μž¬ν•˜λŠ” 속성과 같은 μ΄λ¦„μ˜ 속성을 κ°€μ§ˆ 수 μ—†λ‹€λŠ” 것과,
μžμ‹ ν΄λž˜μŠ€κ°€ 생성될 λ•ŒλŠ” λ°˜λ“œμ‹œ λΆ€λͺ¨ 클래슀의 μƒμ„±μžκΉŒμ§€ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•œλ‹€λŠ” 점이닀.

 

 

상속을 μ‚¬μš©ν•΄ 보자

open class Animal(var name: String, var age: Int, var type: String) {
    fun introduce() {
        println("μ €λŠ” $type ${name}이고, ${age}μ‚΄μž…λ‹ˆλ‹€.")
    }
}

λΆ€λͺ¨ 클래슀인 Animal 클래슀λ₯Ό λ§Œλ“€μ–΄ 클래슀의 자체 속성인 name, age, type을 생성해 μ€€λ‹€.

introduce() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ λ™λ¬Όμ˜ 정보λ₯Ό 좜λ ₯ν•œλ‹€.

 

class Dog(name: String, age: Int): Animal(name, age, "개") {
    fun bark() {
        println("멍멍")
    }
}

class Cat(name: String, age: Int): Animal(name, age, "고양이") {
    fun meow() {
        println("μ•Όμ˜Ή")
    }
}

μžμ‹ 클래슀인 Dog와 Catμ—λŠ” name, ageλ₯Ό var ν‚€μ›Œλ“œλ₯Ό 뢙이지 μ•Šμ€ 일반 νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„μ„œ 상속받은 Animal 클래슀의 μƒμ„±μžμ— 직접 λ„˜κ²¨μ€€λ‹€.

μƒμ„±μžμ— 직접 λ„˜κ²¨μ£ΌλŠ” κ°’μ—μ„œ type은 Dog와 Cat ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅λœ κ°’μ΄λ―€λ‘œ κ³ μ •λœ 값을 λ„˜κ²¨μ£Όμ–΄λ„ 상관없닀.

 

fun main() {
    var a = Animal("별이", 5, "개")
    var b = Dog("별이", 5)

    a.introduce()
    b.introduce()
}

μœ„μ™€ 같이 ν΄λž˜μŠ€λ“€ κ°„μ˜ 관계λ₯Ό κ΅¬ν˜„ν•˜λ©΄, λΆ€λͺ¨ 클래슀인 Animalκ³Ό Dog 객체가 같은 ν•¨μˆ˜μΈ introduce()λ₯Ό μ΄μš©ν•΄ 같은 값을 좜λ ₯ν•˜κ²Œ λœλ‹€.

ν•˜μ§€λ§Œ μœ„μ™€ 같이 λΆ€λͺ¨μ˜ ν•¨μˆ˜λ§Œ μ“°λ €κ³  ν•˜λ©΄ 상속을 κ΅¬ν˜„ν•œ μ˜λ―Έκ°€ μ—†κΈ° λ•Œλ¬Έμ— Dog ν•¨μˆ˜μ— bark() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ μ£Όμ—ˆλ‹€.

bark() ν•¨μˆ˜λŠ” Dog ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

b.bark()

var c = Cat("루이", 1)
c.introduce()
c.meow()

Dog와 λ˜‘κ°™μ΄ Cat에도 같은 λ°©μ‹μœΌλ‘œ meow() ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³ , introduce()λ₯Ό μ μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λ‚˜μ˜¬ 것이닀.

 

λ˜ν•œ λΆ€λͺ¨μ˜ ν•¨μˆ˜ 외에도 λΆ€λͺ¨μ˜ ν”„λ‘œνΌν‹° λ˜ν•œ μžμ‹μ΄ μ‚¬μš©ν•  수 μžˆλ‹€.

var a = Animal("별이", 5, "개")
var b = Dog("별이", 5)

a.introduce()
b.introduce()
println(b.name)

Dogμ—μ„œ Animal의 ν”„λ‘œνΌν‹°λ₯Ό κ·ΈλŒ€λ‘œ λ°›μ•„μ„œ μ‚¬μš©ν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

λ§ˆμ§€λ§‰ μ€„μ˜ 좜λ ₯은 "별이"둜 λ‚˜μ˜¨λ‹€.

 

 

μƒμ†μ˜ μž₯단점

클래슀의 상속은 클래슀λ₯Ό 더 ꡬ쑰적으둜 λ‹€λ£° 수 있게 ν•΄μ£ΌλŠ” μž₯점이 μžˆμ§€λ§Œ, λ„ˆλ¬΄ λ‚¨λ°œν•΄μ„œλŠ” μ•ˆ λ˜λŠ” 법.
μ§€λ‚˜μΉœ μƒμ†κ΅¬μ‘°λŠ” μ½”λ“œλ₯Ό 더 μ–΄λ ΅κ²Œ λ§Œλ“€ 수 μžˆλ‹€λŠ” 점도 κΈ°μ–΅ν•΄ λ‘μž.

 

 

 

상속과 단일 μ±…μž„ 원칙

단일 μ±…μž„ 원칙은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ… 쀑 ν•˜λ‚˜μ΄λ‹€. 상속과 단일 μ±…μž„ 원칙을 μ΄ν•΄ν•˜κ³  μ μš©ν•˜λŠ” 것은 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” 데 큰 도움을 μ€€λ‹€.

 

단일 μ±…μž„ 원칙:

ν΄λž˜μŠ€κ°€ ν•˜λ‚˜μ˜ μ±…μž„λ§Œμ„ 가지도둝 μ„€κ³„ν•˜λŠ” 것이닀.

예λ₯Ό λ“€μ–΄ 우리 λͺΈμ˜ μ†Œν™” κΈ°κ΄€ 쀑 μœ„λŠ” μŒμ‹λ¬Όμ„ λΆ„ν•΄ν•΄μ„œ μž₯으둜 μ΄λ™μ‹œν‚€κ³  μž₯은 μŒμ‹λ¬Όμ˜ 양뢄을 ν‘μˆ˜ν•˜κ³  λ‚œ 찌꺼기λ₯Ό λ°°μΆœν•˜λŠ” ν•œ κ°€μ§€μ˜ 일만 ν•˜λŠ” κ²ƒμ²˜λŸΌ ν•˜λ‚˜μ˜ μ±…μž„λ§Œμ„ 가지고 클래슀λ₯Ό 섀계해야 ν•œλ‹€.

단일 μ±…μž„ 원칙을 μ€€μˆ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ½”λ“œμ˜ 변경이 μ–΄λ €μ›Œμ§€κ³ , 버그가 λ°œμƒν•  κ°€λŠ₯성이 높아진닀.

 

상속과 단일 μ±…μž„ 원칙은 μ„œλ‘œ κΈ΄λ°€ν•œ 관계에 μžˆλ‹€.

단일 μ±…μž„ 원칙을 μ€€μˆ˜ν•΄ 클래슀끼리 ν•˜λ‚˜μ˜ μ±…μž„λ§Œμ„ κ°€μ§€κ²Œ μ„€κ³„ν•œ ν›„, ν•„μš”μ— 따라 μƒμ†μœΌλ‘œ 관계λ₯Ό λ§Ίμ–΄μ£Όλ©΄ 클래슀 내뢀에 κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 것을 자유둭게 ν•  수 있고, μ½”λ“œμ˜ μœ μ§€ λ³΄μˆ˜μ„±μ„ 높일 수 μžˆμ„ 것이닀.

 

 

μ°Έκ³ 

https://www.youtube.com/watch?v=Mpn-kGFxB84

 

https://f-lab.kr/insight/java-inheritance-single-responsibility-principle-20240523

 

μžλ°”μ—μ„œμ˜ 상속과 단일 μ±…μž„ 원칙

이 λΈ”λ‘œκ·Έ ν¬μŠ€νŠΈμ—μ„œλŠ” μžλ°”μ—μ„œ 상속과 단일 μ±…μž„ 원칙을 μ–΄λ–»κ²Œ μ μš©ν•  수 μžˆλŠ”μ§€, 그리고 이λ₯Ό 톡해 얻을 수 μžˆλŠ” 이점과 μ£Όμ˜ν•  점에 λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.

f-lab.kr

 

728x90