IMCAT.DEV
로그인 가입
Kotlin 입문 객체지향

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()     // 자식 클래스의 메서드 호출
    }

    실행 결과

    먹고 있습니다.
    멍멍!

    코드 한 줄씩 동작 설명

    1. open class Animal : Animal 클래스를 정의합니다. open 키워드는 이 클래스가 다른 클래스에 의해 상속될 수 있음을 나타냅니다.
    2. fun eat() : Animal 클래스의 eat 메서드를 정의합니다. 이 메서드는 "먹고 있습니다."라는 메시지를 출력합니다.
    3. class Dog : Animal() : Dog 클래스를 정의하며, Animal 클래스를 상속받습니다.
    4. fun bark() : Dog 클래스의 bark 메서드를 정의합니다. 이 메서드는 "멍멍!"이라는 메시지를 출력합니다.
    5. val myDog = Dog() : Dog 클래스의 인스턴스를 생성합니다.
    6. myDog.eat() : Animal 클래스의 eat 메서드를 호출하여 "먹고 있습니다."를 출력합니다.
    7. myDog.bark() : Dog 클래스의 bark 메서드를 호출하여 "멍멍!"을 출력합니다.
    8. 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("강아지가 먹고 있습니다.")
          }
      }

      6. 정리

    9. 상속은 코드 재사용성을 높이고 유지보수를 용이하게 합니다.
    10. 부모 클래스와 자식 클래스의 개념을 이해해야 합니다.
    11. open 키워드로 상속 가능 클래스를 정의하고, override 키워드로 메서드를 재정의합니다.
    12. 다음에 학습하면 좋은 주제: "다형성", "인터페이스", "추상 클래스" 등.