Kotlin 문법: "클래스 상속"

SHY(code poet)·2024년 2월 16일

✨Kotlin에 관하여✨ 

목록 보기
19/36

● 클래스의 상속: 클래스의 재사용을 위한 설계도구
※ 상속이 미리 만들어져 있는 클래스를 가져다 쓰는 개념이라면 익스텐션은 미리 만들어져 있는 클래스에 메서드를 추가하여 넣는 개념이다.
※ 생성자를 통해, 클래스 내부의 프로퍼티와 메소드를 사용한 것이라면 상속은 클래스 자체를 재사용하는 것이다. 자식 클래스는 부모 클래스의 맴버들을 자신의 것처럼 사용할 수 O

  • (상속은 클래스를 생성한 후 도트 연산자(.)를 통해 메서드와 프로퍼티를 사용하는 것처럼)클래스의 자원을 사용하는 또 다른 방법입니다.
  • 상속을 사용하면 부모 클래스의 메서드와 프로퍼티를 마치 내 클래스의 일부처럼 사용할 수 있다.
  • 그러면 상속은 왜 사용할까?
    안드로이드에는 Activity라는 클래스가 미리 만들어져 있으며, 이 Activity 클래스 내부에는 글자를 쓰는 기능, 그림을 그리는 기능, 화면에 새로운 창을 보여주는 기능이 미리 정의되어 있다.
    상속이 있기에 이러한 기능을 직접 구현하지 않고 Activity 클래스를 상속받아 약간의 코드만 추가하면 앱에 필요한 기능을 추가할 수 있다.
    상속은 코드를 재사용하는 측면도 있지만 코드를 체계적으로 관리할 수 있기 때문에 규모가 큰 프로젝트도 효과적으로 설계할 수 있다.

class Activity {
fun drawText()
fun draw()
fun showWindow()
// ...
}

class MainACtivity: Activity() {
fun onCreate(){
draw("새 그림") // 미리 만들어진 기능(draw)을 호출만으로 사용할 수 있습니다.
}
}

① 상속법

open class 상속될 부모 클래스 {
// 코드
}

class 자식 클래스: 부모 클래스() { // 부모클래스를 호출한다. 단, 인터페이스에서는 호출X
// 코드
}

  • 상속 대상이 되는 부모 클래스는 open 키워드로 만들어야만 자식 클래스에서 사용할 수 O
    만약 open 키워드로 열려 있지 않으면 상속할 수 없다.
  • 상속을 받을 자식 클래스에서는 콜론(:)을 이용해서 상속할 부모 클래스를 지정한다.
    상속은 부모의 인스턴스를 자식이 갖는 과정이기 때문에 부모 클래스명 다음에 괄호를 입력해서 꼭 부모의 생성자를 호출해야 한다.

② 생성자 파라미터가 있는 클래스의 상속

open class 부모 클래스(value: String) { // 지금 이 코드는 생성자 함수임. 앞에 클래스가 있을 것임.
// 코드
}

class 자식 클래스(value: String): 부모 클래스(value) { // 부모클래스에 값전달!
// 코드
}

  • 상속될 부모 클래스의 생성자에 파라미터가 있다면 자식 클래스의 생성자를 통해 값을 전달할 수 있다.
  • 부모 클래스에 세컨더리 생성자가 있다면, 역시 자식 클래스의 세컨더리 생성자에서 super 키워드로 부모 클래스에 전달할 수 있다.
    다음은 안드로이드의 View 클래스를 상속받는 예제. 자식 클래스에 세컨더리 생성자만 있을 경우 상속되는 클래스 이름 다음에 괄호가 생략된다.

class CustomView: View { // 부모 클래스명 다음 (괄호)를 생략했습니다.
constuctor(ctx: Context): super(ctx)
constructor(ctx: Context, attrs: AttributeSet): super(ctx, attrs)
}

③ 부모 클래스의 프로퍼티와 메서드 사용하기

  • 부모 클래스에서 정의된 프로퍼티와 메서드를 내 것처럼 사용할 수 있다.
  • 아래 코드에서 Child는 hello라는 프로퍼티와 sayHello라는 메서드가 없지만
    myHello() 메서드를 실행하면 로그에 “Hello!"가 출력된다.

open class Parent {
var hello: String = "안녕하세요"
fun sayHello(){
Log.d("inheritance", "${hello}")
}
}

class Child: Parent(){
fun myHello() {
hello = "Hello!"
sayHello()
}

profile
진정한 개발자는 코드를 두려워하지 않는다. 오히려 코드가 그를 두려워한다.

0개의 댓글