코틀린에서 클래스의 상속을 어떻게 구현하나요?
_____A1: 코틀린에서는 클래스 상속 시, 부모 클래스가 반드시 `open` 키워드로 선언되어 있어야 하며, 자식 클래스는 부모 클래스 이름 뒤에 괄호를 붙여 생성자를 호출하는 형태로 선언합니다.
예시:
```kotlin
open class Parent { /*...*/ }
class Child : Parent() { /*...*/ }
```
---
Q2: 왜 클래스 앞에 `open` 키워드를 붙여야 하나요?
A2: 기본적으로 코틀린 클래스는 `final`이므로 상속이 불가능합니다. 상속을 허용하려면 해당 클래스에 `open`을 붙여야 하며, 이는 자바의 `final`과 반대 개념입니다.
---
Q3: 부모 클래스의 생성자에 매개변수가 있을 때는 어떻게 하나요?
A3: 자식 클래스가 부모 클래스의 생성자를 호출할 때, 괄호 안에 필요한 인자를 넘겨줘야 합니다.
예시:
```kotlin
open class Parent(val name: String)
class Child(name: String, val age: Int) : Parent(name)
```
---
Q4: 메서드 상속과 오버라이드는 어떻게 하나요?
A4: 상속받은 메서드를 오버라이드하려면 부모 메서드도 `open`이어야 하며, 자식 클래스에서는 `override` 키워드를 반드시 붙여 구현합니다.
예시:
```kotlin
open class Parent {
open fun greet() { println("Hello") }
}
class Child : Parent() {
override fun greet() { println("Hi") }
}
```
---
Q5: 다중 상속은 가능한가요?
A5: 클래스 상속은 단일 상속만 가능합니다. 다중 상속은 지원하지 않지만, 여러 인터페이스 구현은 가능합니다.
---
Q6: 추상 클래스 상속도 가능한가요?
A6: 네, 추상 클래스도 `open`이 기본이며, 추상 메서드는 반드시 자식 클래스에서 `override`하여 구현해야 합니다.
예:
```kotlin
abstract class Animal {
abstract fun sound()
}
class Dog : Animal() {
override fun sound() { println("Bark") }
}
```
---
Q7: 상속 시 프로퍼티 오버라이드는 어떻게 하나요?
A7: 부모 클래스 프로퍼티가 `open`이라면 자식 클래스에서 `override`하여 재정의할 수 있습니다. 예:
```kotlin
open class Parent {
open val name: String = "Parent"
}
class Child : Parent() {
override val name: String = "Child"
}
```
---
요약하면, 코틀린에서 상속하려면 부모 클래스에 `open`을 붙이고, 자식 클래스는 콜론(`:`)과 함께 부모 생성자를 호출합니다. 메서드와 프로퍼티 오버라이드는 모두 명시적 `override` 키워드를 요구합니다.
코틀린에서는 클래스의 상속을 간단하고 명확하게 구현할 수 있도록 다양한 기능을 제공합니다.
이 글에서는 코틀린에서 클래스 상속을 구현하는 방법에 대해 자세히 설명하겠습니다.
기본 클래스와 서브클래스 코틀린에서 클래스를 상속하려면, 기본 클래스(슈퍼클래스 또는 부모 클래스)를 정의하고 이를 상속받을 서브클래스(자식 클래스)를 정의해야 합니다.
기본 클래스는 `open` 키워드를 사용하여 상속이 가능하다고 명시해야 합니다.
기본적으로 코틀린의 클래스는 `final`로 선언되어 있어 상속이 불가능합니다.
기본 클래스 정의 ```kotlin open class Animal { open fun sound() { println("Animal makes a sound") } } ``` 위의 예제에서 `Animal` 클래스는 `open` 키워드로 선언되어 있으며, `sound` 메소드도 `open`으로 선언되어 있어 서브클래스에서 오버라이드할 수 있습니다.
서브클래스 정의 서브클래스는 기본 클래스의 이름 뒤에 콜론(:)을 사용하여 기본 클래스의 이름을 명시합니다.
서브클래스에서 메소드를 오버라이드하려면 `override` 키워드를 사용해야 합니다.
```kotlin class Dog : Animal() { override fun sound() { println("Dog barks") } } ``` 위의 예제에서 `Dog` 클래스는 `Animal` 클래스를 상속받고 있으며, `sound` 메소드를 오버라이드하여 개의 소리를 출력하도록 구현하고 있습니다.
생성자와 초기화 블록 서브클래스는 기본 클래스의 생성자를 호출할 수 있습니다.
기본 클래스의 생성자는 서브클래스의 생성자에서 호출되며, 이를 위해 `super` 키워드를 사용합니다.
```kotlin open class Animal(val name: String) { open fun sound() { println("$name makes a sound") } } class Dog(name: String) : Animal(name) { override fun sound() { println("$name barks") } } ``` 위의 예제에서 `Animal` 클래스는 `name`이라는 프로퍼티를 가지고 있으며, `Dog` 클래스는 이를 상속받아 생성자에서 `name`을 초기화합니다.
다중 상속과 인터페이스 코틀린은 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 유사한 기능을 구현할 수 있습니다.
인터페이스는 여러 클래스에서 구현할 수 있으며, 클래스는 여러 개의 인터페이스를 구현할 수 있습니다.
```kotlin interface Pet { fun play() } class Dog(name: String) : Animal(name), Pet { override fun sound() { println("$name barks") } override fun play() { println("$name is playing") } } ``` 위의 예제에서 `Dog` 클래스는 `Animal` 클래스를 상속받고, `Pet` 인터페이스를 구현하고 있습니다.
`play` 메소드를 오버라이드하여 개가 노는 행동을 정의하고 있습니다.
추상 클래스 추상 클래스는 인스턴스를 생성할 수 없는 클래스입니다.
추상 클래스는 하나 이상의 추상 메소드를 가질 수 있으며, 서브클래스에서 이 메소드를 반드시 구현해야 합니다.
추상 클래스는 `abstract` 키워드를 사용하여 정의합니다.
```kotlin abstract class Animal { abstract fun sound() } class Dog : Animal() { override fun sound() { println("Dog barks") } } ``` 위의 예제에서 `Animal` 클래스는 추상 클래스이며, `sound` 메소드는 추상 메소드로 선언되어 있습니다.
`Dog` 클래스는 이를 오버라이드하여 구체적인 구현을 제공합니다.
결론 코틀린에서 클래스의 상속은 `open` 키워드를 사용하여 기본 클래스를 정의하고, `:` 기호를 사용하여 서브클래스를 정의하는 방식으로 이루어집니다.
서브클래스는 기본 클래스의 속성과 메소드를 재사용하고, 필요에 따라 오버라이드하여 기능을 확장할 수 있습니다.
또한, 인터페이스와 추상 클래스를 활용하여 다중 상속의 유사한 기능을 구현할 수 있습니다.
이러한 상속 개념은 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 합니다.
작성자:
최다윤 [비회원]
| 작성일자: 1년 전
2024-09-09 09:47:19
조회수: 202 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 202 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.