본문 바로가기
개발새발/코틀린

[코틀린/Kotlin] 익명 클래스(Anonymous Class)

by 조희우 2025. 9. 4.

익명클래스(Anonymous Class)

  • 객체를 이름 없이 생성하는 방식
  • 인터페이스나 추상 클래스를 일시적으로 구현하거나 확장
  • Java의 익명 내부 클래스와 비슷한 개념

개념

  • 이름이 없는 클래스
  • 일회성으로 필요한 동작을 정의할 때 사용
  • e.g.) 리스너, 콜백, 인터페이스 구현

사용 예시

  • 버튼 클릭 이벤트 리스너를 설정할 때
  • 일회용 객체가 필요할 때
  • 콜백 처리를 간단하게 하고 싶을 때

예시

interface ClickListener {
	fun onClick()
}

val listener = object: ClickListener {
	override fun onClick() {
		println("Clicked!")
	}
}

listener.onClic() // 출력: Clickced!
  • object: ClickListner { … }는 ClickListner를 구현한 익명 객체를 생성하는 코드
  • 이 객체는 이름이 없으며 변수 listener에 담겨 사용

사용 조건

  • 인터페이스 또는 추상 클래스를 기반으로 생성
  • 반드시 필요한 함수 구현: 추상 멤버 등

대체 - 람다 함수

  • 익명 클래스를 람다로 대체 가능
  • SAM 인터페이스를 람다로 대체 가능
  • Kotlin은 다음 조건을 만족하면 람다를 익명 클래스로 자동 변환
    • 자바 인터페이스: fun interface도 가능
    • 함수가 하나만 존재: Single Abstract Method

예시

[SAM 인터페이스]

val thread = Thread(object: Runnable {
	override fun run() {
		println("Runnign in thread")
	}
})

[람다]

val thread = Thread {
	println("Running in thread")
}

차이점

  • 람다는 함수 / 익명 클래스는 객체(Object)
차이점 익명 클래스 람다
this 익명 클래스 자기 자신 외부 클래스
상태 보유 필드나 멤버 소유 가능 없음(stateless)
여러 메서드 여러 개 구현 가능 불가능(하나만 표현)
  • 익명 클래스 대신 람다를 사용할 수 있는 경우는 제한적!
  • 함수가 하나의 인터페이스, SAM 인터페이스 일때만 사용 가능
  • Kotlin이 자동으로 람다 → 익명 객체로 변환