개발자들은 항상 조금 더 간편한 소스, 조금 더 간단한 소스를 고민합니다.

자주 사용되는 소스를 본인이 사용하기 편하게 미리 단축어로 저장해두는건 어떨까요?

 

🌈🌈🌈

(한번 상상을 해봅시다.)

 

 

배열이 하나 존재하고, 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 (확장 프로퍼티)를 제공하여

나만의 함수, 프로퍼티를 만들 수 있습니다.

 

 

Extensions | Kotlin

 

kotlinlang.org

 


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
}

 

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기