3-3. Kotlin 클래스 추상화

2020. 3. 4. 20:58소프트웨어 공학/코딩 공부

본 내용은 kotlinlang.org 공식 문헌과 기타 자료들을 바탕으로 필자가 학습한 내용을 정리한 것입니다.

필자의 허락 없이 글을 상업적 목적으로 인용, 수정, 재배포할 수 없습니다. 내용의 오류 지적은 덧글로 받습니다.

 


추상 클래스

abstract class Juice(val type: String) { // 추상 클래스
    val volume = 100     // 오버라이드 불가
    abstract fun print()  // 추상 멤버
}

class OrangeJuice : Juice("orange") {
    override fun print() {
        println("I'm orange juice.")
    }
}

추상 클래스는 추상화된 멤버를 가질 수 있다는 것을 제외하면 일반 클래스와 똑같다.[각주:1]

abstract 키워드에 의해 추상화된 멤버는 자동으로 open 상태[각주:2]가 된다.


인터페이스

interface Example {
    fun noBody() // 몸체 없음
    
    fun withBody() {
        // 몸체 구현
    }
}

// Example 구현체
class Inheritor : Example {
    override noBody() {
        println("noBody() invoked")
    }
}

인터페이스는 완전히 추상화된 클래스이다. 모든 멤버가 추상화되었으므로 abstract 키워드는 필요없다.

함수는 몸체가 없어도 되지만, 필요하면 만들 수 있다.[각주:3] 인터페이스를 구현하는 방법은 일반 클래스를 상속하는 방식과 같다.

프로퍼티

interface Super {
    val int: Int = 5 // 오류!
    
    val string: String
        get() = "foo" // Getter 구현 가능.
        
    fun foo() {
        print(int)
    }
}

class Inheritor : Super {
    override val int: Int = 0
}

인터페이스에 존재하는 프로퍼티는 다음 규칙을 따라야 한다.

  1. Be abstract - 값을 초기화할 수 없다.
  2. Accessor Implementation - Getter/Setter를 임의로 구현할 수 있다. (다만 backing field 참조는 불가능)

추상화 방식의 비교

분류 키워드 비(非)추상 멤버 추상 멤버 오버라이드
일반 클래스 open 허용 불허 *허용
추상 클래스 abstract 허용 *허용 허용
인터페이스 interface 불허 허용 허용

*허용 표기된 항목은 키워드를 명시한 경우에만 허용한다는 의미입니다.

※ 추상 멤버: 몸체의 구현을 하위 클래스에게 넘긴 함수 또는 프로퍼티.

 


  1. 당연한 말이지만 추상 멤버는 몸체가 없으므로 하위 클래스가 책임지고 구현해야 한다. [본문으로]
  2. 일반적으로 open 키워드가 없는 멤버는 override를 허용하지 않는다. [본문으로]
  3. 단, 몸체가 있으면 abstract가 아니므로 open 키워드가 없으면 하위 클래스가 override할 수 없다! [본문으로]

'소프트웨어 공학 > 코딩 공부' 카테고리의 다른 글

Java - JSR223 스크립트 API  (0) 2020.03.06
3-2. Kotlin 클래스 상속  (1) 2020.03.03
3-1. Kotlin 클래스 생성자  (0) 2020.03.03
3. Kotlin 클래스  (0) 2020.03.03
2. Kotlin 자료형  (1) 2020.03.02