(코틀린) 확장 함수란 무엇인가..

2024. 3. 14. 21:51스터디 정리!

이번 시간에는 코틀린의 확장 함수에 대해 발표를 준비하게 되었습니다!

 

확장함수란?

코틀린은 클래스에 상속하거나 디자인 패턴을 사용하지 않고

새로운 기능으로 클래스를 확장할 수 있는 기능을 제공하는데

이것이 확장이라는 선언을 통해 이뤄집니다.

 

 

 

언제 사용하는가?

 

1, 수정할 수 없는 클래스에 새로운 기능을 확장하고 싶을 때 사용한다

-EX) Retrofit이나 Glide 같은 외부 라이브러리에 확장할 수 있다

 

2, 기존에 이미 있는 기본 클래스에 함수를 추가하고자 할 때 사용한다

EX) Int, String와 같은 기본 타입 클래스에도 함수를 추가할 수 있다

 

 

사용 예시!

 

fun main(){
    //밑에 얘가 객체
    val str1 = "abcd"
    str1.printString()

}

// 확장 함수
fun String.printString(){
    // 확장함수 안에서 this를 통해 객체 자체에 접근할 수 있다.
    println("관리하는 문자열은 :${this} 입니다")
}

 

이런 식으로 간단하게 사용해볼 수 있는데 한 번 이 코드를 나눠서 설명을 드려보겠습니다!

 

// 확장 함수
fun String.printString(){
    // 확장함수 안에서 this를 통해 객체 자체에 접근할 수 있다.
    println("관리하는 문자열은 :${this} 입니다")
}

위의 함수를 보시면 fun String.printString(){}부분이 있는데

여기서 앞에 붙는 String수신 객체 타입 이라 부릅니다!

 

println("관리하는 문자열은 :${this} 입니다")

위의 출력문을 보시면 this가 있는데 이건 수신 객체라고 불립니다!

 

 

그렇다면 수신 객체 타입은 무엇이고 수신 객체는 무엇일까?!

 

수신 객체 타입 : 확장 함수를 만들기 위해선 함수의 이름 앞에 그 함수가 확장할 클래스의 이름을 덧붙여야 하는데

그 클래스 이름을 수신 객체 타입이라 부릅니다

 

수신 객체 : 이 때 확장 함수가 호출되는 대상이 되는 값(객체)을 수신 객체라 부릅니다!

 

즉 수신 객체 타입은 확장이 정의될 클래스 타입이며

수신 객체는 그 클래스에 속한 인스턴스 객체 입니다.

 

 

사용예시!(Toast 만들기)

 

 

fun Context.showToast(msg: String) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
    }

Context를 확장 함수로 받고 Toast를 사용할 수 있는 함수를 만들어 주면 

다른 Activity에서도 

showToast("이것이 확장함수다!")

이러한 코드를 활용하여 Toast 메시지를 띄울 수 있습니다!

 

 

사용예시! (Dialog 만들기)

 

이건 제가 만들고 있는 개인 프로젝트에 적용을 해보았습니다!

 

 

fun showDiaLog(context: Context, title:String, message:String, listener:(DialogInterface, Int) -> Unit){
            var diaLogBuilder = MaterialAlertDialogBuilder(context)
            diaLogBuilder.setTitle(title)
            diaLogBuilder.setMessage(message)
            diaLogBuilder.setPositiveButton("확인", listener)
            diaLogBuilder.setNegativeButton("취소", null)
            diaLogBuilder.show()

        }

전에는 companion object 내부에 Dialog를 정의해두어
다른 Activity에서도 호출을 해서 사용할 수 있게끔 정의를 해두었습니다.

 

deleteButton.setOnClickListener {
                Util.showDiaLog(thirdActivity, "메모 삭제", "메모를 삭제하시겠습니까?"){ dialogInterface: DialogInterface, i: Int ->
                    dismiss()
                }

            }

 

호출은 이렇게 했습니다!

 

 

확장 함수를 사용한 Dialog

fun Context.showDiaLog2(title: String, message: String, listener: (DialogInterface, Int) -> Unit){
            var diaLog = MaterialAlertDialogBuilder(this)
            diaLog.setTitle(title)
            diaLog.setMessage(message)
            diaLog.setPositiveButton("확인", listener)
            diaLog.setNegativeButton("취소", null)
            diaLog.show()
        }

 

아까 Toast를 사용할 때와 마찬가지로 Context를 확장 함수로 받고 Dialog를 

사용할 수 있는 함수를 만들었습니다!

 

if (title.isEmpty()){
     showDiaLog2("안녕", "반가워"){ dialogInterface: DialogInterface, i: Int ->

    }

 

출력은 이렇게 했습니다!

 

결과

 

 

 

 

느낀점

: 확장 함수에 대해 처음 배우게 되었는데 멘토님께서도 그러시고 다른 스터디 분들도 그러시고 다들 굉장히 자주

사용한다고 하셔서 앞으로는 Dialog를 사용하거나 Snackbar를 사용할 때 companion object를 활용하는 것도

좋지만 확장함수를 활용해서 구현 해봐야 할 거 같습니다!!