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를 활용하는 것도
좋지만 확장함수를 활용해서 구현 해봐야 할 거 같습니다!!
'스터디 정리!' 카테고리의 다른 글
코틀린의 by 키워드란? (0) | 2024.03.30 |
---|---|
코드 다듬기 : 로컬 함수와 확장 (1) | 2024.03.19 |
코틀린에서의 예외 처리란?!(Kotlin in Action) (6) | 2024.03.01 |