개발자들은 항상 조금 더 간편한 소스, 조금 더 간단한 소스를 고민합니다.
자주 사용되는 소스를 본인이 사용하기 편하게 미리 단축어로 저장해두는건 어떨까요?
🌈🌈🌈
(한번 상상을 해봅시다.)
배열이 하나 존재하고, 2번째 값과 3번째 값의 순서를 바꾸고 싶다면
val tmp = list[index1]
list[index1] = list[index2]
list[index2] = tmp
(변수 하나를 생성하고..)
(하나의 값을 미리 저장해 두고...)
(다른 값으로 변경해주고...)
(다시 변수에 있던 값을 전달하고...)
다시 3번째 값과 4번째 값의 순서를 변경하고 싶다면
위의 과정을 다시 한번 더 수행 해야하죠
만약 List 에 swap() 이라는 함수가 존재하고
(Kotlin List에는 swap() 함수가 존재하지 않습니다.)
함수 호출만으로 원하는 동작이 작동 한다면
val list = mutableListOf(1, 2, 3)
list.swap(0, 2) // result [3, 2 ,1]
가능합니다!
Kotlin 에서는 Extension Functions (확장함수), Extension properties (확장 프로퍼티)를 제공하여
나만의 함수, 프로퍼티를 만들 수 있습니다.
Kotlin Extension Functions
코틀린 확장 함수
확장함수는 자바 static 메소드 (Java static Method)와 비슷합니다.
확장함수는 기존 함수 생성과 방법이 비슷합니다.
아래의 swap() 를 예시로 보면
fun 받는타입값 . 함수명 (파라미터) : 리턴 값 { }
fun MutableList<*>.swap(index1: Int, index2: Int): Unit { }
받는 타입값 = MutableList
함수명 = swap (사용자 임의로 함수명 생성 가능)
리턴값 = 리턴값이 없기때문에 생략함
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' corresponds to the list
this[index1] = this[index2]
this[index2] = tmp
}
위와 같이 선언해두면 어디서든 MutableList에서 swap() 메소드 접근이 가능합니다.
val list = mutableListOf(1, 2, 3)
list.swap(0, 2) // result [3, 2, 1]
Kotlin Extension Properties
코틀린 확장 프로퍼티
코틀린은 함수와 같이 확장 프로퍼티도 제공합니다.
val <T> MutableList<T>.lastData: T? get() = this[size - 1]
위와 같이 제네릭(Generic)을 활용하면 모든 리스트의 마지막 값을 반환하는 확장 프로퍼티를 사용할 수 있습니다.
val list = mutableListOf(1, 2, 3)
list.lastData // result 3
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Ex > Kotlin Extension
val list = mutableListOf(1, 2, 3)
list.swap(0, 2) // result [3, 2, 1]
list.lastData // result 1
// Ex > Kotlin Extension String
val strIndexOf = "Kiu!Project!!"
val search = "!"
strIndexOf.indexOfAll(search) // result [3, 11, 12]
val strSubstring = "KiuStringProject"
strSubstring.substringResult(5) // result [KiuSt, ringProject]
}
}
Ext.kt
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' corresponds to the list
this[index1] = this[index2]
this[index2] = tmp
}
val <T> MutableList<T>.lastData: T? get() = this[size - 1]
fun String.indexOfAll(str: String): MutableList<Int> {
var index = this.indexOf(str)
val returnIndex = mutableListOf<Int>()
while (index != -1) {
returnIndex.add(index)
index = this.indexOf(str, index + 1)
}
return returnIndex
}
fun String.substringResult(endIndex: Int): MutableList<String> {
val returnStr = mutableListOf<String>()
returnStr.add(this.substring(0 until endIndex))
returnStr.add(this.substring(endIndex))
return returnStr
}
여기까지 저의 긴 글을 읽어주셔서 감사합니다.
제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.
'Android > Kotlin' 카테고리의 다른 글
Kotlin String 문자열 활용하기 - 대소문자 변환, format, 공백제거 (%d, \n, trim ...) (2) | 2023.01.28 |
---|---|
Android Kotlin - Date Format 현재날짜 & 'yyyy' vs 'YYYY' (0) | 2022.11.10 |
[Android] Kotlin for문, Kotlin forEach문 (0) | 2022.08.06 |
[Android] Kotlin String 문자열 찾기, 문자열 변경 치환 (indexOf, replace) (0) | 2022.07.18 |
[Android] Kotlin String 문자열 자르기, 문자열 분할 (substring, split, chunked). (1) | 2022.07.16 |
최근댓글