0️⃣ 확장함수를 왜?
우선 확장함수를 쓰게 된 계기는 정말 단순한데, 수준별 학습반에서 과제를 받았기 때문이다! 기존에 진행한 프로젝트를 함수평 프로그래밍이 가능하도록 리팩토링하는 것이 과제였다. 과제를 진행하고 피드백 받으며 배운 점을 기록해보겠다.
1️⃣ 확장함수란?
코틀린은 클래스에 상속하거나 디자인 패턴을 사용하지 않고 새로운 기능으로 클래스를 확장할 수 있는 기능을 제공하는데, 이를 확장이라는 선언을 통해 이루어진다. 이 때 추가적인 메소드를 구현하면 확장함수라고 일컫게 되는 것이다. 마치 기본 클래스에 정의된 함수인 것처럼 새로운 기능을 추가하는 것이지만 실제로 확장 함수는 클래스 외부에서 선언된다. 그렇다면 확장함수의 장점과 단점은 무엇이 있을까?
장점 | 단점 |
코드 가독성 향상 외부 라이브러리 확장 코드의 재사용성 |
내부 접근 제한 상속 불가능 |
단점에 대해서 좀 더 자세히 설명하자면, 확장 함수는 public 멤버에게만 접근할 수 있다는 뜻이다. 즉, class 내부에 선언된 private이나 protected 같은 경우엔 접근할 수 없다는 것이다. 또한 클래스처럼 상속되지 않아 override도 할 수 없다.
2️⃣ 확장함수 예시
이제부터 내가 적용한 코드를 통해 예시를 보여주겠다! 기본기를 다지는 글 같은 경우엔 아래 출처를 통해 더더욱 자세히 보면 좋다.
// 확장함수
fun Fragment.makingToast(string: String) {
Toast.makeText(this.requireContext(), string, Toast.LENGTH_SHORT)
.show()
}
class AddContactDialogFragment : DialogFragment() {
...
}
확장함수는 이렇게 class 외부에서 특정 클래스에 대해서 확장한 것으로 선언한다. 나는 Fragment 클래스를 통해서 makingToast라는 함수를 조작하고 싶었기 때문에 Fragment.makingToast와 같은 방법으로 선언한 것이다.
Toast를 띄울 때 필요한 context는 this 객체를 통해 직접 참조할 수 있기 때문에 this.requireContext()를 통해 넣으면 된다.
// 확장함수
fun Fragment.makingToast(string: String) {
Toast.makeText(this.requireContext(), string, Toast.LENGTH_SHORT)
.show()
}
class AddContactDialogFragment : DialogFragment() {
...
with(binding) {
// 완료 버튼 : 유효성검사에 따른 토스트메시지
alertBtnDialogComplete.setOnClickListener {
with(binding){
조건1 -> makingToast(getString(R.string.please_check_name))
조건2 -> makingToast(getString(R.string.please_check_phone_number))
조건3 -> makingToast(getString(R.string.not_match_email))
조건4 -> makingToast(getString(R.string.please_check_date))
else -> {
... 중략
dismiss()
}
}
}
}
}
(가독성을 위해 생략한 부분이 많으므로 감안 하여 참고)
위에서 설명했던 장점들이 극적으로 보여지는 예시다. 비록 Toast를 띄우는 짧은 코드를 함수로 빼낸 것 뿐인데도 이렇게 코드가 깔끔해져서 가독성이 향상된다.
class ContactDetailFragment : Fragment() {
...
private fun setAlarm() {
when (selectedAlarm) {
1 -> {
makingToast(getString(R.string.alarm_second_5) + getString(R.string.alarm_selected))
...중략
}
2 -> {
makingToast( getString(R.string.alarm_day_before) + getString(R.string.alarm_selected))
...중략
}
3 -> {
makingToast(getString(R.string.alarm_today) + getString(R.string.alarm_selected))
...중략
}
else -> {
isNotCheck()
selectedAlarm = 0
}
}
}
}
위에서처럼 makingToast는 AddContactDialogFragment와 같은 폴더에서 선언했지만 Fragment에서부터 확장한 함수이기 때문에 Fragment 내부라면 언제든지 import 하여 사용할 수 있다.
확장함수를 사용할 수 있는 방법은 더 다양하고 복잡한 것 같지만 우선 기초방법을 숙지한 데에 있어 의의를 둔다. 나중에 외부 라이브러리를 확장할 수 있는 기회도 올 것이리라 믿고... 다른 공부를 또 열심히 해보자!
❗ 출처
참고 사이트 : https://velog.io/@minju0426/Kotlin-확장함수를-활용하는-법how-to-use-Extension-Function
'Kotlin' 카테고리의 다른 글
Kotlin 문법 : StringBuilder() (0) | 2024.07.10 |
---|---|
switch문과 if else문, 둘 중 어떤 것이 더 좋은가? (2) | 2024.06.14 |
Kotlin 문법 : 상속과 추상화 (0) | 2024.06.12 |
문제해결 : unresolved reference: add (0) | 2024.06.07 |
Kotlin 문법 : sort와 sorted (with. 프로그래머스) (0) | 2024.06.05 |