CodeKata
처음보는 것들
reduce, fold
컬렉션에 있는 요소를 누적해서 더하여 반환하는 함수들이다.
내부 요소들을 모두 돌아가며 코드를 수행한다.
reduce
public inline fun <S, T : S> Iterable<T>.reduce(
operation: (S, T) -> S
): S
초기 값은 컬렉션의 첫 번째 요소이고, 반환 값은 컬렉션의 자료형이 되는 것을 알 수 있다.
val numbers = listOf(7, 5, 1, 5, 3)
val sum = numbers.reduce { acc, i -> acc + i }
println("reduce = $sum") //reduce = 21
fold
public inline fun <T, R> Iterable<T>.fold(
initial: R,
operation: (R, T) -> R
): R
초기 값은 파라미터를 통해 자유롭게 정할 수 있으며, 반환 값은 초기 값의 자료형이 되는 것을 알 수 있다.
val numbers = listOf(7, 5, 1, 5, 3)
val sumFromTen = numbers.fold(10) { acc, i -> acc + i }
println("fold = $sumFromTen") //fold = 31
Kotlin 문법
- lateinit
코틀린에서는 일반적으로 생성자에서 모든 프로퍼티를 초기화해야 한다.
게다가 프로퍼티 타입이 null이 될 수 없는 타입이라면 반드시 null이 아닌 값으로 그 프로퍼티를 초기화해야 한다. 그렇게 되면 null이 될 수 있는 타입을 사용할 수 밖에 없다.
하지만 null이 될 수 있는 타입을 사용하면 모든 프로퍼티 접근에 널 검사나 !!을 써야 한다.
이를 해결하기 위해 나중에 초기화(late-initalized)할 수 있다. lateinit 변경자를 붙이면 프로퍼티를 나중에 초기화 할 수 있다.
lateinit var
- 항상 var을 사용해야 한다.
Android를 하면서 binding을 설정해 줄 때 사용했었다.
예시로 왜 binding을 lateinit var을 사용해줘야하나?
→ 기본적으로 null로 들어가면 안돼서 lateinit을 사용해줬는데 onCreate의 경우 Activity나 Fragment가 생성되는 시점에 생기기때문에 나중에 호출이 되기 때문에
처음에 값을 넣어줄 수가 없다.
만약 lateinit 말고 초기값을 null로 잡으면 쓸 때마다 null인지 체크를 하면서 해야하는 번거로움이 있다.
- isNullOrEmpty / isNullOrBlank
안전한 호출이 없이도 null이 될 수 있는 수신 객체 타입에 대해 선언된 확장 함수를 호출 가능하다.
fun verifyUserInput(input: String?) {
if (input.isNullOrBlank()) { //안전한 호출을 사용하지 않아도 됨
println("Please fill in the required fields")
} else {
println("good")
}
}
fun main() {
verifyUserInput(null)//Please fill in the required fields
verifyUserInput("hi")//good
}
null일 경우 true를 반환하고, null이 아닌 경우 isBlank를 호출한다.
하지만 input.isNullOr~()를 쓴다고해서 input이 null이 될 수 있는 타입이 되는 건 아니다. isNullOr~()가 null이 될 수 있는 타입의 확장 함수라면 s가 null이 될 수 있는 타입이다.
Android
fragment 다른 방법으로 화면전환
- 직접 호출
binding.goHome.setOnClickListener {
supportFragmentManager.beginTransaction().apply {
replace(R.id.fragmentContainer,HomeFragment())
commit()
}
}
- TabLayout-viewPager2(개인 정리)
갤러리에서 선택한 이미지 띄우기
과제에서 추가기능으로 회원가입란에 이미지를 띄우고 지우기를 구현해보았다. (미완)
private val getImage = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
uri?.let {
binding.signUpImageView.setImageURI(uri)
binding.signUpImageView.visibility = android.view.View.VISIBLE
}
}
이미지의 uri를 가져오는 방식이다.
private fun selectedImage() {
binding.addImageButton.setOnClickListener {
getImage.launch("image/*")
}
}
private fun deleteImage() {
binding.deleteImageButton.setOnClickListener {
binding.signUpImageView.setImageURI(null)
}
}
지우는 부분은 아직 구현을 완성하지 못해서 그렇다.
'Kotlin > TIL' 카테고리의 다른 글
TIL (03.28) (0) | 2024.03.28 |
---|---|
TIL (03.27) (1) | 2024.03.27 |
TIL (03.25) (1) | 2024.03.25 |
TIL (03.22) (1) | 2024.03.22 |
TIL (03.21) (0) | 2024.03.21 |