코틀린 안드로이드 앱개발 강좌, 코틀린, 클래스를 재사용하는 상속

안드로이드 앱 개발에 있어 효율성과 코드 재사용성은 매우 중요한 요소입니다. Kotlin은 이러한 부분을 극대화할 수 있도록 설계된 현대적인 프로그래밍 언어로, 특히 상속을 통한 코드 재사용에 탁월한 기능을 제공합니다. 이 글에서는 코틀린의 상속 개념을 깊이 있게 살펴보고, 실제 안드로이드 앱 개발에 어떻게 활용할 수 있는지를 예제 코드와 함께 설명하겠습니다.

상속 개요

상속은 객체지향 프로그래밍에서 한 클래스가 다른 클래스의 속성과 메소드를 상속받는 기능입니다. 이를 통해 코드의 중복을 줄이고, 보다 유연한 구조를 만들 수 있습니다. 코틀린에서 클래스를 정의할 때, 기본적으로 클래스는 ‘final’로 선언되어 상속이 불가능합니다. 따라서 상속을 허용하고 싶다면 클래스 선언 앞에 ‘open’ 키워드를 사용해야 합니다.

기본적인 클래스 상속 예제


open class Animal(val name: String) {
    fun sound() {
        println("$name makes a sound.")
    }
}

class Dog(name: String) : Animal(name) {
    fun bark() {
        println("$name barks.")
    }
}
    

위 예제에서는 Animal이라는 기본 클래스를 정의하였습니다. 이 클래스는 name이라는 속성과 sound라는 메소드를 가지고 있습니다. 그 다음 Dog라는 클래스가 Animal 클래스를 상속받아 bark라는 추가적인 메소드를 정의하였습니다. 하위 클래스인 Dog는 상위 클래스인 Animal의 속성과 메소드를 사용할 수 있습니다.

안드로이드 앱에서의 클래스 상속 활용

안드로이드 앱 개발에서는 화면(Activity) 또는 View의 재사용을 위해 상속을 자주 사용합니다. 예를 들어, 공통적인 UI 동작이나 데이터 처리를 가진 Activity의 기본 클래스를 만들어 여러 Activity들이 이를 상속받아 사용할 수 있습니다.

기본 Activity 클래스 만들기


open class BaseActivity : AppCompatActivity() {
    fun showToast(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }
}

class MainActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        showToast("Welcome to MainActivity")
    }
}

class SecondActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        showToast("Welcome to SecondActivity")
    }
}
    

여기서는 BaseActivity라는 기본 Activity 클래스를 만들었습니다. 이 클래스는 showToast라는 메소드를 통해 Toast 메시지를 보여주는 기능을 가지고 있습니다. MainActivitySecondActivityBaseActivity를 상속받아 각각의 화면에서 해당 기능을 쉽게 사용할 수 있습니다.

다형성과 상속

상속과 관련하여 다형성(Polymorphism) 개념도 중요합니다. 다형성은 같은 인터페이스를 사용하여 서로 다른 객체를 처리할 수 있는 능력입니다. 코틀린에서는 상위 클래스의 타입으로 하위 클래스의 객체를 처리할 수 있습니다. 이를 통해 코드의 유연성이 증대됩니다.

다형성 예제


fun makeSound(animal: Animal) {
    animal.sound()
}

val dog = Dog("Buddy")
makeSound(dog) // Outputs: Buddy makes a sound.
    

위의 makeSound 함수는 Animal 타입의 객체를 매개변수로 받아 해당 객체의 sound 메소드를 호출합니다. Dog 객체를 전달하면, Animalsound 메소드를 호출하지만, 하위 클래스에서 오버라이드한 메소드를 호출하는 등 다형성을 활용할 수 있습니다.

상속에서의 오버라이딩

상속 시, 하위 클래스에서 상위 클래스의 메소드를 재정의(오버라이딩) 할 수 있습니다. 이를 통해 하위 클래스에서 상위 클래스의 기본 동작을 변경할 수 있습니다. 오버라이딩은 override 키워드를 사용하여 구현합니다.

오버라이딩 예제


open class Vehicle {
    open fun start() {
        println("Vehicle is starting")
    }
}

class Car : Vehicle() {
    override fun start() {
        println("Car is starting")
    }
}
    

위의 예제에서 Vehicle라는 기본 클래스에 start 메소드를 정의하였고, Car 클래스에서 이를 오버라이딩하여 자동차에 맞는 동작으로 변경하였습니다.

상속과 인터페이스

코틀린에서는 클래스 상속과 함께 인터페이스를 통해 코드 재사용을 강화할 수 있습니다. 인터페이스는 클래스가 구현해야 할 메소드의 청사진을 제공하며, 다중 상속을 가능하게 합니다.

인터페이스 사용 예제


interface Drivable {
    fun drive()
}

class Motorcycle : Drivable {
    override fun drive() {
        println("Motorcycle is driving")
    }
}
    

Drivable 인터페이스를 정의하고, 이를 Motorcycle 클래스가 구현하였습니다. 이처럼 인터페이스를 이용하면 여러 클래스가 동일한 기능을 제공하면서도 서로 다른 방법으로 구현할 수 있습니다.

코드 재사용과 유지보수

상속을 통해 생성된 코드는 재사용성이 높아지며, 유지보수도 용이해집니다. 중복된 코드를 줄일 수 있어, 버그가 발생할 확률이 낮아지며, 변화가 생길 경우 상위 클래스의 기능만 수정해주면 됩니다. 그러나 무분별한 상속 사용은 코드의 가독성을 떨어뜨릴 수 있으니, 적절히 사용하는 것이 중요합니다.

결론

본 글에서는 코틀린을 활용한 안드로이드 앱 개발에서 클래스를 재사용하는 상속의 개념과 활용법에 대하여 설명하였습니다. 상속은 코드의 재사용과 중복을 줄이고, 다형성을 통해 유연한 코드를 작성할 수 있게 해 줍니다. 코틀린의 상속을 잘 활용하면 더욱 효과적이고 유지보수하기 쉬운 안드로이드 애플리케이션을 개발할 수 있습니다.