IT기기 팁

코틀린 인터페이스

lt8492 2025. 12. 6. 14:57
반응형

 

코틀린 인터페이스(Interface) 완벽 정리

인터페이스는 클래스의 청사진(규약) 역할을 한다.

즉, 어떤 기능을 반드시 구현하도록 강제하면서도,

여러 클래스에 공통된 기능을 부여할 수 있다.


기본 문법

 

interface Clickable {

fun click()

}

 

class Button : Clickable {

override fun click() {

println("버튼 클릭됨")

}

}


인터페이스는 다중 구현 가능

코틀린 클래스는 다중 상속이 불가능하지만,

여러 인터페이스를 동시에 구현할 수 있다.

 

interface Clickable {

fun click()

}interface Focusable {

fun focus()

}

class UIComponent : Clickable, Focusable {

override fun click() = println("클릭 이벤트 처리")

override fun focus() = println("포커스 이벤트 처리")

}


기본 구현이 있는 함수

인터페이스의 함수는 기본 구현(body) 을 가질 수 있다.

 

interface Clickable {

fun click()

fun showStatus() = println("클릭 가능한 객체입니다.")

}class Button : Clickable {

override fun click() = println("버튼 클릭됨")

}

 

val btn = Button()

btn.click()

btn.showStatus()


인터페이스 다중 상속 시 충돌 해결

여러 인터페이스에서 같은 이름의 메서드를 구현하면,

명시적으로 어느 인터페이스의 메서드를 사용할지 지정해야 한다.

 

interface A {

fun show() = println("A의 show()")

}interface B {

fun show() = println("B의 show()")

}

class C : A, B {

override fun show() {

super<A>.show()

super<B>.show()

println("C의 show()")

}

}

 

val c = C()

// 출력:

// A의 show()

// B의 show()

// C의 show()


인터페이스 속성(Property)

인터페이스에서도 속성을 선언할 수 있지만,

초기값은 가질 수 없다. (구현 클래스에서 반드시 정의해야 함)

 

interface User {

val name: String

}class Member(override val name: String) : User


인터페이스 상속

인터페이스끼리도 상속이 가능하다.

 

interface Drawable {

fun draw()

}interface Resizable : Drawable {

fun resize()

}

class Image : Resizable {

override fun draw() = println("이미지 그림")

override fun resize() = println("이미지 크기 조정")

}


추상 클래스 vs 인터페이스

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가
  • 6행 선택6행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
구분
추상 클래스
인터페이스
인스턴스 생성
불가능
불가능
목적
공통 로직 제공 + 상태 유지
동작 규약 정의
생성자
있음
없음
속성
상태(값) 유지 가능
상태 유지 불가 (get만 가능)
다중 상속
불가
가능
사용 예
기본 기능 + 확장성
규칙 정의, 이벤트 리스너 등
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

인터페이스 안의 default, abstract 차이

모든 함수는 기본적으로 abstract 이지만,

구현부가 있으면 자동으로 default 역할을 한다.

 

interface Animal {

fun eat() // abstract

fun breathe() = println("숨쉬기") // default

}


인터페이스 안의 companion object

인터페이스도 companion object를 가질 수 있다.

이를 통해 상수나 팩토리 메서드를 정의할 수 있다.

 

interface Configurable {

companion object {

const val VERSION = "1.0.0"

fun info() = println("설정 인터페이스 버전: $VERSION")

}

}Configurable.info()


인터페이스 활용 예시

1. 클릭 리스너

 

interface OnClickListener {

fun onClick()

}class Button(private val listener: OnClickListener) {

fun click() = listener.onClick()

}

val button = Button(object : OnClickListener {

override fun onClick() {

println("버튼이 클릭되었습니다.")

}

})

button.click()

2. Repository 패턴

 

interface Repository {

fun findAll(): List<String>

}class UserRepository : Repository {

override fun findAll(): List<String> {

return listOf("재은", "철수", "민수")

}

}


  • 공통된 동작 규약 정의용으로 인터페이스를 우선 고려
  • 여러 클래스에 동일한 기능을 부여해야 한다면 인터페이스가 적합
  • 기본 구현이 가능하므로, 불필요한 중복 코드를 줄일 수 있다
  • 충돌 시 super<인터페이스명>.함수()로 명시적으로 해결

 

반응형

'IT기기 팁' 카테고리의 다른 글

윈도우 파워쉘 명령어 모음  (0) 2025.12.06
리눅스 터미널 명령어  (0) 2025.12.06
코틀린 클래스와 상속  (0) 2025.12.06
코틀린 데이터 클래스와 객체 복사  (0) 2025.12.06
코틀린 객체와 동반 객체  (0) 2025.12.06