본문 바로가기

코틀린

(16)
코루틴 콘텍스트 (Context) 디스패처는 코루틴이 실행될 스레드를 결정한다. 시작될 곳과 중단 후 재개될 곳을 모두 포함된다. Dispatcher.Default CommonPool로 프레임워크에 의해 자동으로 생성되는 스레드 풀이다. 스레드 풀의 최대 크기는 시스템의 코어 수에서 1을 뺀 값이다. Dispatcher.Unconfinded 첫 번째 중단 지점에 도달할 때까지 현재 스레드에 있는 코루틴을 실행한다. 코루틴은 일시 중지된 후에, 일시 중단 연산에서 사용된 기존 스레드에서 다시 시작된다. 단일 스레드 컨텍스트 항상 코루틴이 특정 스레드 안에서 실행된다는 것을 보장해주는 것으로 newSingleThreadContext()를 사용한 것을 의미한다. 스레드 풀 newFixedThreadPoolContext()를 의미한 것으로 스레..
코루틴 상태는 한 방향으로 이동 코루틴의 상태는 한 방향으로만 이동한다. 이전 상태로 되돌아 가지 않는다는 의미이다. fun main(args: Array) = runBlocking { val time = measureTimeMills { val job = GlobalScope.launch { delay(2000) } job.join() job.start() job.join() } println("Took $time ms") } 총 실행에는 약 2초가 걸렸으므로 잡이 한 번만 실행됬음을 보여준다. 잡이 완료 상태에 도달하였기 때문에 start()를 호출해도 아무런 변화가 없다.
코루틴 1탄 코루틴에 대해서 혼자서는 많이 공부하긴 했는데 한번도 블로그에 올린적은 없네요. 나중에 한번 정리해서 올리도록 하겠습니다. 오늘은 코루틴을 제가 오늘 본 내용에 대해서 포스팅 할게요. 일단 코루틴 디스패처에는 이름을 붙일 수 있습니다! val dispatcher = newSingleThreadContext(name = "ServiceCall") val task = GlobalScope.launch(dispatcher) { printCurrentThead() } task.join() fun printCurrentThread() { println("Running in thread [${Thread.currentThread().name}]") } 이렇게 하게 되면 결국 프린트는 "Running in threa..
Kotlin에서 Unit 과 Nothing val nullableValue: String? = null val value: Int = nullableValue?.toInt() ?: return Unit 타입 : 코틀린의 void 코틀린이 void와 다른점 Unit은 싱글톤 인스턴스이다. 코틀린에서 Unit은 키워드 타입이며 동시에 객체이기도 하다. val unit: Unit = Unit Unit은 객체기도 하며, Any의 자식이다. Generic type으로 Unit을 지정하면 return을 명시적으로 넣지 않아도 된다. 만약 Void type이라도 return은 반드시 넣어야 하나 코틀린의 Unit은 return 없이 사용 가능 자바에서 void는 존재하지 않음을 뜻하지만 코틀린에서 Unit은 아무것도 반환하지 않는 타입을 의미한다. 따라서 자..
코틀린에서 Sequence와 SAM 코틀린에서 Sequence란? 사용법 val list = listOf("one","two","three") val sequenceFromList = list.asSequence() val sequence = sequenceOf("four", "three", "two", "one")Collections 확장 함수의 경우 각 확장 함수를 호출할 때마다 새로운 Collection이 생성되어 전환된다. val list = listOf(1, 2, 3) // [1, -2, 3] 생성 val maxOddSquare = list .map{ it * it } // [1, 4, 9] 생성 .filter { it % 2 == 1 } // [1, 9] 생성 .max()총 3개의 intermediate collection이 생..
Nothing 타입 Nothing 타입은 실행 흐름이 도달할 수 없는 구역을 나타내기 위한 특수 타입이다. fun throwing(): Nothing = throw Exception() fun main(){ val i:Int = throwing() } fun validate(num: Int) { val result: Int = if (num >= 0) num else throw Exception("num이 음수입니다.") } if 블록이 Int 타입, else 블록이 Nothing 타입이면, if-else는 Int 타입을 따라간다. if 블록이 Int 타입, else 블록이 Unit 타입이므로 서로 호환되지않아 if-else 표현식으로 사용할 수 없다. 따라서 Nothing 타입은 throw를 표현식으로 쓸 수 있게 하기 ..
멤버 함수의 중위 표기법 (Infix Notation) 함수를 마치 연산자 처럼 호출하는 방법으로 멤버함수의 중위 표기법이 있다. 함수 선언문 앞에 infix를 붙이면 된다. class Point(var x: Int = 0, var y: Int = 0) { infix fun move(base: Point): Point { return Point(x - base.x, y - base.y) } } fun main(args: Array): Unit { val point = Point(2, 7) move Point(1, 1) println(point.x) println(point.y) } 결과 값으로는 1 6 이 나온다.
in 연산자 in 연산자는 어떤 값이 객체에 포함되어 있는지 여부를 조사하는 역할을 한다. println('a' in "dayun") 위 의 결과로는 "true"가 출력된다. dayun에는 a가 포함되어 있기 때문이다. println("da" !in "dayun") 위의 결과로는 "false"가 출력된다. dayun에 da가 포함되어 있기 때문에 in의 반대인 false가 포함가 출력되는 것이다.