학습
Kotlin 상속 기초
Kotlin 상속 기초 — 초급
상속 기초
1. 도입 (왜 배워야 하는가)
상속은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 코드의 재사용성과 가독성을 높여줍니다. 실무에서는 여러 클래스가 공통적인 특성을 가질 때 상속을 통해 중복된 코드를 줄이고, 유지보수를 쉽게 할 수 있습니다. 예를 들어, 여러 종류의 자동차가 있을 때, 모든 자동차에 공통적으로 필요한 기능(예: 시동 걸기, 주행하기 등)을 부모 클래스에서 정의하고, 각각의 자동차 종류는 이를 상속받아 필요한 기능만 추가하면 됩니다.
상속을 이해하지 못하면, 코드의 중복이 발생하고 유지보수가 어려워져, 프로젝트의 복잡도가 증가할 수 있습니다. 또한, 팀원 간의 협업에서도 비효율성을 초래할 수 있습니다.
2. 핵심 개념 설명
상속은 한 클래스가 다른 클래스로부터 속성과 메서드를 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 공통 기능을 한 곳에서 관리할 수 있습니다.
- 부모 클래스(슈퍼클래스): 다른 클래스에게 속성과 메서드를 제공하는 클래스입니다.
- 자식 클래스(서브클래스): 부모 클래스를 상속받아 새로운 속성과 메서드를 추가하거나 재정의하는 클래스입니다.
용어 정리
| 용어 | 설명 |
|---|---|
| 상속(Inheritance) | 클래스 간의 관계로, 부모 클래스의 특성을 자식 클래스가 물려받는 것 |
| 부모 클래스 | 다른 클래스에게 속성과 메서드를 제공하는 클래스 |
| 자식 클래스 | 부모 클래스를 상속받아 새로운 기능을 추가하거나 변경하는 클래스 |
3. 기본 코드 예제
다음은 간단한 상속 예제입니다.
// 부모 클래스 정의
open class Animal {
fun eat() {
println("먹고 있습니다.")
}
}
// 자식 클래스 정의
class Dog : Animal() {
fun bark() {
println("멍멍!")
}
}
fun main() {
val myDog = Dog() // Dog 클래스의 인스턴스 생성
myDog.eat() // 부모 클래스의 메서드 호출
myDog.bark() // 자식 클래스의 메서드 호출
}
실행 결과
먹고 있습니다.
멍멍!
코드 한 줄씩 동작 설명
open class Animal:Animal클래스를 정의합니다.open키워드는 이 클래스가 다른 클래스에 의해 상속될 수 있음을 나타냅니다.fun eat():Animal클래스의eat메서드를 정의합니다. 이 메서드는 "먹고 있습니다."라는 메시지를 출력합니다.class Dog : Animal():Dog클래스를 정의하며,Animal클래스를 상속받습니다.fun bark():Dog클래스의bark메서드를 정의합니다. 이 메서드는 "멍멍!"이라는 메시지를 출력합니다.val myDog = Dog():Dog클래스의 인스턴스를 생성합니다.myDog.eat():Animal클래스의eat메서드를 호출하여 "먹고 있습니다."를 출력합니다.myDog.bark():Dog클래스의bark메서드를 호출하여 "멍멍!"을 출력합니다.- 상속은 코드 재사용성을 높이고 유지보수를 용이하게 합니다.
- 부모 클래스와 자식 클래스의 개념을 이해해야 합니다.
open키워드로 상속 가능 클래스를 정의하고,override키워드로 메서드를 재정의합니다.- 다음에 학습하면 좋은 주제: "다형성", "인터페이스", "추상 클래스" 등.
4. 실전 활용 예제
1. 쇼핑몰에서 장바구니 구현
쇼핑몰에서 다양한 상품을 관리하는 클래스가 있을 때, 공통 기능을 부모 클래스에서 정의하고 각 상품 클래스는 이를 상속받아 사용할 수 있습니다.
open class Product(val name: String, val price: Double) {
fun displayInfo() {
println("상품명: $name, 가격: $price")
}
}
class Book(name: String, price: Double, val author: String) : Product(name, price) {
fun displayAuthor() {
println("저자: $author")
}
}
fun main() {
val book = Book("코틀린 프로그래밍", 30000.0, "홍길동")
book.displayInfo() // 상품 정보 출력
book.displayAuthor() // 저자 정보 출력
}
2. 게임에서 캐릭터 구현
게임에서 다양한 캐릭터를 구현할 때도 유용합니다. 공통적인 기능을 부모 클래스에서 정의하고, 각 캐릭터는 이를 상속받아 특화된 기능을 추가할 수 있습니다.
open class Character(val name: String) {
fun attack() {
println("$name이(가) 공격합니다.")
}
}
class Warrior(name: String) : Character(name) {
fun shieldBlock() {
println("$name이(가) 방패로 막습니다.")
}
}
fun main() {
val warrior = Warrior("전사")
warrior.attack() // 공격 메서드 호출
warrior.shieldBlock() // 방어 메서드 호출
}
5. 흔한 실수와 주의사항
1. 부모 클래스에 open 키워드를 빼먹기
부모 클래스는 상속이 가능하도록 open 키워드를 붙여야 합니다. 이를 빼먹으면 컴파일 오류가 발생합니다.
잘못된 코드
class Animal { // open 키워드가 없음
...
}
올바른 코드
open class Animal { // open 키워드 추가
...
}
2. 자식 클래스에서 부모 클래스의 메서드 재정의 시 override 키워드 누락
부모 클래스의 메서드를 재정의할 때는 반드시 override 키워드를 사용해야 합니다.
잘못된 코드
class Dog : Animal() {
fun eat() { // override 키워드가 없음
println("강아지가 먹고 있습니다.")
}
}
올바른 코드
class Dog : Animal() {
override fun eat() { // override 키워드 추가
println("강아지가 먹고 있습니다.")
}
}