toByte()
, toShort()
, toInt()
, toLong()
, toFloat()
, toDouble()
, toChar()
, toString()
is
와 !is
키워드를 활용해서 자료형의 타입을 확인할 수 있음
<object> is <type>
<object> !is <type>
if (name is String) {
println("name은 String 타입이다.")
} else {
println("name은 String 타입이 아니다.")
}
first
, second
component1()
, component2()
val x = Pair<String, String>("Hello", "Kotlin")
val y = Pair<Int, String>("119", "Fire Station")
println("x.first")
println("y.second")
println("x.component2()")
println("y.component1()")
// [output]
// Hello
// Fire Station
// Kotlin
// 119
fun makePair(first: String, second: String): Pair<String, String> {
return Pair(first, second)
}
val (hello, kotlin) = makePair("Hello", "Kotlin")
toList()
를 사용하면 리스트로 변환할 수 있음val list = pair.toList()
println(list[0])
println(list[1])
first
, second
, third
component1()
, component2()
, component3()
val z = Pair<String, String>("Hello", "Kotlin",
"Bye"
)
println("z.first")
println("z.second")
println("z.third")
println("z.component1()")
println("z.component2()")
println("z.component3()")
val (hello, world, bye) = Triple("Hello", "World", "Bye")
val list = triple.toList()
println(list[0])
println(list[1])
println(list[2])
apply
, let
, run
, with
, also
val ars = Person("ars").apply {
age = 25
city = "Seoul"
}
println(ars)
this
val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
this
val nums = mutableListOf("one", "two", "three")
with(nums) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
this
val nums = mutableListOf("one", "two", "three")
nums
.also { println("The list elements before adding new one: $it") }
.add("four")
this
val nums = mutableListOf("one", "two", "three", "four", "five")
nums.map { it.length }.filter { it > 3 }.let {
println(it)
// and more function calls if needed
}
val str: String? = "Hello"
val length = str?.let {
println("let() called on $it")
processNonNullString(it)
it.length
}
it
Fuction | Object reference | Return value | Is extension function |
---|---|---|---|
let | it | Lambda result | Yes |
run | this | Lambda result | Yes |
run | - | Lambda result | No: called without the context object. |
with | this | Lambda result | No: takes the context object as an argument. |
apply | this | Context object | Yes |
also | it | Context object | Yes |
fun ReceiverType.functionName(parameters: ParameterType): Return Type {
// 함수 구현
// ReceiverType 클래스의 인스턴스는 'this'로 참조 가능
// 새로운 기능 구현
return returnValue
}
ReceiverType
확장 함수가 추가될 클래스의 타입functionName
확장 함수의 이름parameters
함수에 전달되는 매개변수들ReturnType
함수가 반환하는 값의 타입fun main() {
fun Student.getGrade() = println("학생의 등급은 ${this.grade} 입니다")
var student = Student("Ars", 10, "A+")
student.displayInfo()
student.getGrade()
}
class Student(name: String, age: Int, grade: String) {
var name: String
var age: Int
var grade: String
init {
this.name = name
this.age = age
this.grade = grade
}
fun displayInfo() {
println("이름은 ${name} 입니다")
println("나이는 ${age} 입니다")
}
}
프로세스 내에서 실행되는 독립적인 실행 흐름
멀티스레딩을 통해 동시에 여러 작업을 처리할 수 있으며, 이를 통해 CPU 자원을 효율적으로 사용할 수 있음
Thread를 다룰 때 주의해야 할 점: 공유 자원에 대한 동기화
새로운 코루틴을 실행하고, 결과를 반환하지 않음
새로운 코루틴을 실행하고, 결과를 반환하는 Deferred 객체를 생성함
async 함수로 생성된 Deferred 객체는 await 함수를 사용하여 비동기 작업의 결과를 기다릴 수 있음
import kotlinx.coroutines.*
fun main() {
println("메인 스레드 시작")
// 코루틴 스코프 생성
val coroutineScope = CoroutineScope(Dispatchers.Default)
// launch를 사용한 코루틴 실행
coroutineScope.launch {
delay(1000) // 1초 대기
println("코루틴 실행 완료")
}
println("메인 스레드 종료")
// 코루틴이 완료될 때까지 대기
Thread.sleep(2000)
}
launch
함수를 사용하여 새로운 코루틴을 실행함delay
함수를 사용하여 1초 동안 일시 정지한 후 메시지를 출력함Thread.sleep(2000)
을 통해 메인 스레드가 코루틴이 끝날 때까지 기다리도록 함[참고 사이트]
'[Kotlin] Pair, Triple', iamjm29
'[Kotlin] 코틀린 차곡차곡 - 8. Scope Function', 사바라다는 차곡차곡
'Scope functions', Kotlin
'[Kotlin] 동기? 비동기?', twaun.log
'Android의 Kotlin 코루틴', developers