출처 : 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())
'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 |