본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

Class(1) - 추상 클래스와 인터페이스

by kkkkk1023 2024. 10. 1.

추상 클래스(abstract)

: 추상 클래스는 일부 기능을 미리 구현(abstract 키워드 필요!)할 수 있으며, 나머지 기능은 추상 메소드로 남겨놓아 상속받는 클래스에서 구현하도록 요구할 수 있다.

 

: 완전한 구현과 추상적인 정의를 모두 가질 수 있다.

 

:상속을 통해 기능을 재사용하고, 공통된 동작을 하위 클래스에 제공할 때 유용

 

// 추상 클래스
abstract class Bar {

    abstract fun foo() // 기능 구현 불가능! 하위 클래스에서 구현해야함
    
    fun bar(){ // 일반 메서드
        println("Bar!!!")
    }
}

// 상속 받을 떄 () 필수 !!!!!!
class Foo : Bar() {
    override fun foo() {
        println("Foo!!!")
    }
}

fun main() {
    val bar: Foo = Foo()
    bar.bar()
    bar.foo()

}

 

 

 

 


 

 

인터페이스 (interface)

: 인터페이스 기본적으로 구현을 제공하지 않는 추상 메소드들의 집합이다.

 

: 인터페이스 내에 선언된 메소드는 능을 구현하지 않으며, 이를 구현하는 클래스가 반드시 기능을 정의해야 한다.

 

: 하지만 코틀린에서는 디폴트 메소드도 제공할 수 있습니다. 즉, 인터페이스에서도 일부 구현을 가질 수 있다.

 

// 인터페이스
interface Widget {
    fun onClick() //구현 되지 않은 메서드
    fun showMessage() = println("Hello user?!") //구현 된 디폴트 메서드
}

// 상속 받을 떄 괄호는 필요 없다!!!!!
class Button : Widget {
    override fun onClick() {
        println("Button clicked")
    }
}

fun main() {
    var btn = Button()
    btn.onClick() //Button clicked
    btn.showMessage() //Hello user?!
}

 

 


 

무명 클래스

:한번만 사용하고 시용하지 않을 클래스라면 아래와 같이 작성할 수 있다. 

 

// 인터페이스
interface Widget {
    fun onClick() //구현 되지 않은 메서드
    fun showMessage() = println("Hello user?!") //구현 된 디폴트 메서드
}


fun main() {
    var btn = object : Widget { //무명 클래스
        override fun onClick() {
            println("Button clicked")
        }
    }
    btn.onClick() //Button clicked
    btn.showMessage() //Hello user?!
}

 

 

 


 

 

인터페이스의 다중 상속

: 클래스 상속과는 다르게 다중 상속이 가능하다!

 

이렇게 아래와 같이 다중 상속을 하고 다중 상속한 부모에 있는 모든 메서드를 구현해야한다.

 

// 인터페이스
interface Widget {
    fun onClick() //구현 되지 않은 메서드
    fun showMessage(v: String) = println("UI widget = $v") //구현 된 디폴트 메서드
}

interface  Focusable {
    fun setFocus(b: Boolean)
    fun showMessage(v: String) = println("$v is focusable")
}

class EditText: Widget, Focusable {
    val name = "EditText"

    override fun onClick() {
        println("$name is clicked")
    }

    override fun setFocus(b: Boolean) {
        println("$name ${if (b) "got" else "lost"} focus")
    }

    override fun showMessage(v: String) {
        super<Widget>.showMessage(v)
        super<Focusable>.showMessage(v)
    }
}

fun main() {
    var editText = EditText()
    editText.showMessage(editText.name)
    editText.onClick()
    editText.setFocus(true)
}


//출력
//UI widget = EditText
//EditText is focusable
//EditText is clicked
//EditText got focus