English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 기사에서는 예제를 통해 인터페이스 및 Kotlin에서 인터페이스 구현에 대한 지식을 배울 것입니다.
Kotlin 인터페이스는 Java와 유사합니다 8의 인터페이스. 그들은 추상 메서드 정의와 비추상 메서드 구현을 포함할 수 있습니다. 그러나, 그들은 어떤 상태도 포함할 수 없습니다.
따라서, 인터페이스는 속성이 있을 수 있지만, 반드시 추상이거나 접근자 구현을 제공해야 합니다.
추천 읽기: Kotlin 추상 클래스
Kotlin의 추상 클래스는 인터페이스와 유사하지만 중요한 차이점이 있습니다. 추상 클래스의 속성은 추상이거나 접근자 구현을 제공하지 않아도 됩니다.
interface 키워드는 Kotlin에서 인터페이스를 정의하는 데 사용됩니다. 예를 들어,
interface MyInterface { var test: String //추상 속성 fun foo() //추상 메서드 fun hello() = "Hello there" //기본 구현을 가진 메서드 }
여기서,
MyInterface 인터페이스를 생성합니다.
이 인터페이스는 추상 속성 test와 추상 메서드 foo()를 가집니다.
이 인터페이스는 또한 non-abstract 메서드 hello()를 가집니다.
이 클래스나 객체는 어떻게 인터페이스를 구현합니까?
interface MyInterface { val test: Int //추상 속성 fun foo(): String //추상 메서드(문자열 반환) fun hello() { //기본 구현을 가진 메서드 // body (선택 사항) } } class InterfaceImp: MyInterface { override val test: Int = 25 override fun foo() = "롤" //기타 코드 }
여기서, InterfaceImp 클래스는 MyInterface 인터페이스를 구현합니다.
이 클래스는 인터페이스의 추상 멤버(test 속성과 foo() 메서드)를 재정의합니다.
interface MyInterface { val test: Int fun foo(): String fun hello() { println("안녕하세요, 친구!") } } class InterfaceImp: MyInterface { override val test: Int = 25 override fun foo() = "롤" } fun main(args: Array<String>) { val obj = InterfaceImp() println("테스트 = ${obj.test}") print("hello(): 호출 ") obj.hello() print("foo(): 호출하고 출력 ") println(obj.foo()) }
프로그램을 실행할 때, 출력은 다음과 같습니다:
test = 25 hello(): 你好,伙计! 호출 foo(): Lol 호출하고 출력
지금까지 설명한 것처럼, 인터페이스는 접근자 구현을 제공하는 속성을 가질 수 있습니다. 예를 들어,
interface MyInterface { //구현된 속성 val prop: Int get() = 23 } class InterfaceImp: MyInterface { //클래스 본체 } fun main(args: Array<String>) { val obj = InterfaceImp() println(obj.prop) }
프로그램을 실행할 때, 출력은 다음과 같습니다:
23
여기서 prop은 추출되지 않지만, 인터페이스 내에서는 유효합니다. 이는 접근자 구현을 제공하기 때문입니다.
하지만, 인터페이스 내에서 val prop: Int과 같은 값을 실행할 수는 없습니다. 23 작업을 수행할 수 있습니다.
Kotlin은 실제로의 다중 상속을 허용하지 않습니다. 하지만, 하나의 클래스에서 두 개나 더 많은 인터페이스를 구현할 수 있습니다. 예를 들어,
interface A { fun callMe() { println("인터페이스 A에서") } } interface B { fun callMeToo() { println("인터페이스 B에서") } } //인터페이스 A와 B를 구현 class Child: A, B fun main(args: Array<String>) { val obj = Child() obj.callMe() obj.callMeToo() }
프로그램을 실행할 때, 출력은 다음과 같습니다:
인터페이스 A에서 인터페이스 B에서
두 개의 인터페이스(A와 B)가 같은 이름의 비 추출 메서드(예를 들어 callMe() 메서드)를 가지고 있다고 가정해 보겠습니다. 이 두 개의 인터페이스를 하나의 클래스에서 구현했습니다(예를 들어 C). 이제, C 클래스의 객체를 사용하여 callMe() 메서드를 호출하면 컴파일러가 오류를 발생시킵니다. 예를 들어,
interface A { fun callMe() { println("인터페이스 A") } } interface B { fun callMe() { println("인터페이스 B") } } class Child: A, B fun main(args: Array<String>) { val obj = Child() obj.callMe() }
이렇게 발생하는 오류는 다음과 같습니다:
Error:(14, 1) Kotlin: Class 'C' must override public open fun callMe(): Unit defined in A because it inherits multiple interface methods of it
이 문제를 해결하려면, 자신의 구현을 제공해야 합니다. 이렇게 하면 됩니다:
interface A { fun callMe() { println("인터페이스 A") } } interface B { fun callMe() { println("인터페이스 B") } } class C: A, B { override fun callMe() { super<A>.callMe() super<B>.callMe() } } fun main(args: Array<String>) { val obj = C() obj.callMe() }
이제, 프로그램을 실행하면 출력은 다음과 같습니다:
인터페이스 A 인터페이스 B
여기서, C 클래스에서 callMe() 메서드의 명시적인 구현을 제공합니다.
class C: A, B { override fun callMe() { super<A>.callMe() super<B>.callMe() } }
문장 super<A>.callMe()는 클래스 A의 callMe() 메서드를 호출합니다. 유사하게, super<B>.callMe()는 클래스 B의 callMe() 메서드를 호출합니다.