Kotlin/TIL

TIL (03.26)

내손은개발 🐾 2024. 3. 26. 21:04

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(개인 정리)
 

Android - TabLayout 사용해서 Fragment 전환

그냥 버튼 형식으로 만들기 ScrollView로 버튼을 생성해서 만들어 주는 경우를 해봤다. 내가 봐도 비효율적이다. 적게 있으면 몰라도 Fragment가 많아진다면 하나하나 지정해서 넘겨줘야한다. 이렇게

rlawog.tistory.com

 

 

 

갤러리에서 선택한 이미지 띄우기

과제에서 추가기능으로 회원가입란에 이미지를 띄우고 지우기를 구현해보았다. (미완)

 

 

더보기
    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