본문 바로가기

TEKHIT ANDROID SCHOOL

[TEKHIT] KOTLIN 범위 지정 함수와 배열

출처 : Tekhit Android App School / Soft campus 윤재성 강사님

🎉let

  • 첫번째 매개 변수로 객체의 주소값이 들어옵니다.
  • it 통해 객체의 프로퍼티나 메소들에 접근할 수 있습니다.
  • let 호출인 객체가 Null이 아닌 경우에만 호출되기 때문에 컴파일러는 람다 안에서 it 파라미터가 널이 될 수 없는 값임을 보장합니다.
  • Null이 될 수 있는 값을 안전성 검사를 걸쳐 Null이 될 수 없는 함수에 값으로 만들 수 있습니다.
  • 코드 블럭 마지막에 작성된 값을 반환니다.
  • t2 에 객체를 담기 위해선 마지막에 it 작성해 객체의 주소값이 반환될 수 있도록 해줘야 합니다.
class TestClass1(var a1:Int, var a2:Int){
    var a3:Int = 0
    var a4:Int = 0

    fun testMethod1(){
        println("a1 : $a1")
        println("a2 : $a2")
        println("a3 : $a3")
        println("a4 : $a4")
    }
}

fun main(){
    val t1 = TestClass1(100, 200)
    t1.a3 = 300
    t1.a4 = 400

    t1.let {
        it.a3 = 300
        it.a4 = 400
        it.testMethod1()
    }
    
    val t2 = TestClass1(100, 100).let{
        it.a3 = 300
        it.a4 = 400
        it
    }
    println(t2)
    t.testMethod1()
}

🎉 apply

  • 생성된 객체의 주소값이 apply 쪽으로 전달되어 apply 영역 내에 작성한 코드는 apply를 호출한 객체의 메서드로 포함되어 this나 it을 통하지 않고 프로퍼티나 메소드를 사용할 수 있습니다.
  • 람다식이 종료되면 생성된 객체의 주소값이 변수에 저장되기 때문에 let처럼 객체의 주소값을 반환하지 않아도 됩니다.
val t3 = TestClass1(100, 200)
t3.apply {
    a3 = 300
    a4 = 400
    testMethod1()
}

val t4 = TestClass1(100, 200).apply{
    a3 = 300
    a4 = 400
}

🎉 also

  • apply와 비슷하게 생성된 객체의 주소값이 also 쪽으로 전달되어 it 변수에 담기게 됩니다.
  • 따라서 it을 통해 프로퍼티나 메소드에 접근해야 합니다.
  • 람다식이 종료되면 객체의 주소값이 변수에 저장됩니다.
val t10 = TestClass1(100, 200).also {
    it.a3 = 300
    it.a4= 400
}

🎉 run

  • 객체를 생성한 후에 run 람다식 내부로 객체의 주소값이 전달되기 때문에 this(혹은 생략) 을 통해 프로퍼티나 메소드에 접근할 수 있습니다.
  • 람다식의 수행이 끝나면 제일 마지막에 작성한 값이 반환되어 변수에 담기기 때문에 이에 생성된 객체의 주소값이 변수(t9)에 담기게 하기 위해서는 람다식 마지막에 this를 명시하여 객체의 주소값을 반환할 수 있도록 해야 합니다.
val t9 = TestClass1(100, 200).run {
    a3 = 300
    a4= 400
    this
}

🎉 with

  • run과 유사하지만 람다식 코드가 생성된 객체의 일부분 처럼 동작하기 때문에 this(혹은 생략)을 통해 프로퍼티나 메소드에 접근합니다.
  • 람다식 마지막에 객체의 주소값을 반환하는 코드를 작성해야지만 변수(t11)에 객체의 주소값이 담깁니다.
val t11 = with(TestClass1(100, 200)){
    a3 = 300
    a4 = 400
    this
}

🎉 배열

  • 다수의 기억 장소를 하나루 묶어서 관리하는 개념으로 배열의 주소값을 가진 변수를 통해 접근할 수 있습니다.
  • 배열은 다양한 타입의 값을 담을 수 있습니다.
val array1 = arrayOf(10, 20, 30, 40, 50)
val array2 = arrayOf(100, 11.11, "문자열", true)
  • 특정 타입의 값만 담는 배열을 생성합니다.
val array3 = intArrayOf(10, 20, 30, 40, 50)
val array4 = doubleArrayOf(11.11, 22.22, 33.33, 44.44, 55.55)
val array5 = arrayOf<String>("문자열1", "문자열2", "문자열3")
  • 주어진 람다식을 지정한 개수만큼 반복하여 배열을 생성합니다.
// 0이 5개 담긴 배열 생성
val array6 = Array(5){ 0 }

// 람다식에 있는 it 에는 0 부터 1씩 증가되는 값이 들어온다.
val array7 = Array(5){
    it
}
  • [ index ]를 사용해 배열의 요소에 접근합니다. 
  • get을 사용해도 접근할 수 있습니다.
// 배열이 관리하는 기억 장소는 0부터 1씩 증가되는 순서값을 사용한다.
println("array1[0] : ${array1[0]}")
println("array1[1] : ${array1[1]}")

// get 메서드를 이용할 수도 있다. [ ] 연산자를 사용하면 get 메서드를 호출하기 때문에
// [ ]를 사용한 것과 동일하다.
println("array1.get(0) : ${array1.get(0)}")
println("array1.get(1) : ${array1.get(1)}")

// 다차원 배열 접근
println("array9[0][0] : ${array9[0][0]}")
println("array9[1][1] : ${array9[1][1]}")
  • contentToString : 배열의 값을 문자열로 만들어 반환 
println("array11 : ${array11.contentToString()}")
  • sliceArray : 배열의 일부분을 가져오며 지정된 순서값 범위에 해당하는 값들을 가지고 있는 새로운 배열을 생성한다.
// 일부분을 가져온다.
// 지정된 순서값 범위에 해당하는 값들을 가지고 있는 새로운 배열을 생성한다.
// 순서값 1 ~ 3 - 1까지
val array11 = array1.sliceArray(1..3)
  • 그 밖의 메소드들
println("첫 번째 값 : ${array1.first()}")
println("마지막 값 : ${array1.last()}")
println("30의 위치(존재하는 값) : ${array1.indexOf(30)}")
println("10000의 위치(없는 값) : ${array1.indexOf(10000)}")
println("평균 : ${array1.average()}")
println("총합 : ${array1.sum()}")
println("관리하는 기억장소의 개수 : ${array1.count()}")
println("관리하는 기억장소의 개수 : ${array1.size}")
println("30을 포함하는가 : ${array1.contains(30)}")
println("10000을 포함하는가 : ${array1.contains(10000)}")

println("30을 포함하는가 : ${30 in array1}")
println("10000을 포함하는가 : ${10000 in array1}")

println("최대 : ${array1.max()}")
println("최소 : ${array1.min()}")

val array12 = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 배열이 관리하는 값의 순서를 랜덤하게 섞어 준다.
array12.shuffle()
println(array12.contentToString())

// 정렬(오름 차순)
// 정렬된 배열을 새롭게 생성해서 반환한다.
val array13 = array12.sortedArray()
println(array13.contentToString())

// 정렬(내림 차순)
val array14 = array12.sortedArrayDescending()
println(array14.contentToString())

 

GITHUB

 

GitHub - chanho0908/Tekit_Android_App_School: Tekit Android App School Kotlin Study

Tekit Android App School Kotlin Study. Contribute to chanho0908/Tekit_Android_App_School development by creating an account on GitHub.

github.com

 

'TEKHIT ANDROID SCHOOL' 카테고리의 다른 글

[TECKHIT] Material3 Text fields  (0) 2024.01.22
[TECKHIT] Material3 Button  (1) 2024.01.21
[TEKHIT] KOTLIN FUNCTION  (0) 2024.01.11
[TEKHIT] Enum & SealedClass & Reflection  (0) 2024.01.11
[TEKHIT] 중첩 클래스 & NULL & Casting  (0) 2024.01.10