1번 소스

val newList = ArrayList<RowItem>()

for (rowItem in originalRowItem) {
    if (rowItem.isClicked) {
        newList.add(rowItem)
    }
}

2번 소스

val newList = ArrayList<RowItem>()

newList.addAll(
    originalRowItem.filter {
        it.isClicked
    }
)

저는 요즘 1번 소스를 2번 소스로 고치고 있습니다.

 

그 이유는 코틀린이 함수형 프로그래밍 언어이기 때문입니다.

 

함수형 프로그래밍 언어에서 For 반복문을 지양하는 이유

 

1. 명령형 vs 선언형

2. 원자성 유지

3. 추상화를 통한 안정성 추구

 

 

 

1.명령형 프로그래밍 vs 선언형 프로그래밍

 

명령형은 어떻게 해야하는지에 초점이 맞춰진 프로그래밍 

선언형은 무엇을 해야하는지에 초점을 맞추는 프로그래밍 방식

 

명령형 " 어떻게 데이터를 넣을까?"
선언형 "무슨 데이터를 넣을까?"

1번째 그림이 반복문을 돌면서 어떻게 데이터를 넣을지 되어 있는 코드라면

2번째 글은 어떤 데이터를 넣을 것인지에 대해 초점을 맞춘 코드입니다.

 

요즘 트렌드는 "선언형 프로그래밍이 더 낫다" 라고 많은 개발자 분들이 말하지만..

저의 개인적인 생각으로는 익숙한 코드가 더 잘 읽히는 법이라 가독성 부분은 개인차가 있다고 생각합니다.

 

 

2.원자성 유지

kotlin에서는 매번 새로운 불변형 List를 넘기는 식으로 관리를 합니다.

만약 반복문안에서 MutableList를 이용해서 조작하면 원자성이 깨질 수도 있습니다.

 

 

원자성이란?

원자성이란 완전하고 견고한 상태 혹은 아예 실패하는 실패 원자성 을 의미합니다.

쉽게 말해 성공하면 깔끔하게 성공하거나, 실패하면 완전히 실패하는 것을 말하는데 상태가 변해있으면 원자성을 유지하지 못한 것이라고 할 수 있습니다.

 

예시)

 

val aList = mutableListOf<Int>()
val bList = listOf(2,3,0,4)
try {
    bList.forEach{
        aList.add(12/it)
    }
} catch (e: java.lang.Exception) {

}
Log.e("result",aList.toString())

결과 : aList = [6,4]

 

val aList = mutableListOf<Int>()
val bList = listOf(1,2,0,4)
try {
    aList.addAll(
        bList.map {
            12 / it
        }
    )
} catch (e: java.lang.Exception) {

}
Log.e("result",aList.toString())

결과 : aList = []

 

실패했는데 1번째 코드의 경우 aList가 변해 있지만 2번째 코드의 경우는 변해있지 않습니다

반복문을 사용하지 않고 불변형 객체를 넘기는 것으로 실패의 영향을 남기지 않을 수 있습니다.

 

 

3.추상화를 통한 안정성 추구

 

반복문에서는 종류조건,비교 조건, 반복시점 등 한가지만 살짝 바뀌어도 깨지기 쉬습니다.

반복문을 사용을 하기 보다는 추상화된 함수를 검증 후 재사용하는 편이 더 좋습니다.

결과적으로 언어에서 제공한 검증된 API를 사용하는 편이 훨씬 안정된다는 의미입니다. 

 

 

'kotlin 개인노트' 카테고리의 다른 글

Kotlin Sealed Class 란??  (0) 2022.08.09

+ Recent posts