목록Kotlin (79)
Hello, Android!
채널은 자료를 서로 주고받기 위해 약속된 통로 역할을 한다 코루틴의 채널은 넌블로킹 전송 개념으로 사용된다 채널 구현시에는 SendChannel과 ReceiveChannel 인터페이스를 사용하여 값들의 스트립을 전송하며, 지연함수 send(), receive()를 사용한다 send()함수에서 값을 보내면 receive()함수를 통해 값을 받을수 있다 코루틴에서 채널에 send함수를 이용하여 10개의 값을 보내고 10개의 값을 채널에서 수신하여 출력한다 채널은 더이상 전달하는 데이터가 없으면 close()를 사용하여 채널을 닫을수 있다 - produce produce는 채널이 있는 코루틴으로 생산자(데이터를 만드는쪽)의 코드를 쉽게 구현할수 있다 생산자 produce()로 데이터를 만들고 데이터를 사용하는..
- 반복 반복하는 코드를 작성하기 위해서 repeat() 함수를 사용할수 있다 repeat()을 사용하게 되면 데몬 스레드로 실행하게 된다 - 데몬 스레드 데몬 스레드는 주 스레드와는 별개로 만들어지는 보조 스레드이다 주 스레드가 종료되면 데몬 스레드는 강제적으로 종료된다 repeat의 매개변수로 반복 횟수가 들어간다 하지만 repeat이 launch 내에서 반복을 하지만 launch는 GlobalScope로 생명 주기가 한정되어 있기 때문에 메인 스레드가 종료되면 같이 종료된다 - 작업 취소 cancel 함수를 사용하게 되면 원하는 타이밍에 코루틴 작업을 취소하는것이 가능하다 launch를 통하여 코루틴 작업을 실행하지만 main 함수의 끝에서 job.cancel() 이 있기때문에 코루틴 작업 실행 후..
코루틴은 항상 특정 문맥에서 실행되며, 문맥은 CoroutineContext에 의해 정의되며 어떤 컨텍스트에서 실행이 되는지는 디스패처(Dispatcher)가 결정한다 코루틴은 CoroutineContext로 구현된 형식의 문맥을 가진다 CoroutineDispatcher는 추상 클래스로써 몇가지 디스패처 객체를 정의하고 있다 1. 기본 문맥 Dispatcher.Default(GlobalScope)는 기본 문맥인 CommonPool에서 실행이 되며 GlobalScope로 표현한다 즉 launch(Dispatcher.Default){} 와 GlobalScope.launch{} 는 같은 표현이다 기본 문맥은 CommonPool에서 코루틴을 실행하도록 한다 즉 새로운 스레드를 생성하지 않고 기존에 있는 스레드..
- runBlocking runBlocking은 새로운 코루틴을 실행하고, 해당 코루틴이 완료되기 전까지 현재 스레드를 블로킹 한다 위 예제에서는 메인 함수 자체가 코루틴에서 실행이 된다 블로킹으로 움직이기때문에 내부의 코루틴이 종료될때까지 자동으로 블로킹한다 그렇기때문에 별도로 내부 코루틴이 종료될때까지 기다리게 하지않아도 아래와 같은 결과가 나온다 만약 코루틴의 작업이 완료되는것을 기다리기 위해서는 Job객체의 join() 함수를 사용한다 main내부의 두번째 코루틴에서 job.join으로 인해 print in main 이 출력되고 첫번째 코루틴이 끝날때까지 기다린 뒤 두번째 내부 코루틴이 실행된다 - async 함수의 시작 시점 조절 async함수는 context, start, block 세개의 매..
프로세스나 스레드는 진행중인 작업을 중단하고 다른 작업을 실행하기 위한 문맥교환이 발생할때 많은 비용이 발생한다 하지만 코루틴은 문맥교환 없이 일시중단하여 비용이 적게 발생하는 장점이 있다 - 라이브러리 추가 코루틴을 사용하기 위해서는 라이브러리를 추가해야한다 인텔리J 에서 라이브러리를 추가하기 위해서는 File -> Project Structure -> Libraries에서 + 버튼을 눌러 From Maven 에서 Kotlinx 를 검색하여 org.jetbrains.kotlinx:kotlinx-coroutines-core:버전 을 선택하여 라이브러리를 다운받으면 된다 - launch launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더 생성 이라고 한다 launch는 현재 스레드를 차단하지 않고 ..
어떠한 작업을 하기 위해서 컴퓨터는 프로세스를 만들어 작업을 수행한다 과거에는 프로그램에서 단일 프로세스만으로 충분히 작업이 가능하였지만 한 프로그램 내에서 여러 작업을 동시에 수행해야 하는 경우 여러개의 프로세스를 만들었다 새로운 프로세스를 생성하는것은 비용적인 측면에서도 효율이 좋지 않고 프로세스들 사이에 정보 교환이 어려웠다 이러한 문제를 해결하기 위해 프로세스보다 작은 단위인 스레드가 나왔다 하나의 프로세스 내에서 여러 스레드를 만들어 작업을 수행할수 있으며 메모리를 공유하기때문에 정보 교환도 손쉽게 가능하며 스레드의 생성과 삭제도 적은 비용으로 가능하게 되었다 코틀린에서도 스레드 사용이 가능하며 당연히 자바의 스레드 클래스를 코틀린에서도 사용이 가능하다 main함수에서 생성한 첫번째 스레드는 T..
파일을 읽어올때는 java.io 의 FileReader 클래스를 활용한다 readText는 텍스트를 메모리에 가져온 뒤 그 내용을 반환한다 - InputStream, BufferedReader 파일 읽기또한 쓰기에서처럼 확장함수 use를 사용하면 close를 자동으로 하기때문에 더욱 간단한 코드 작성이 가능하다 inputStream의 bufferedReader를 사용하고 있는데 자바에는 inputStream에 bufferedReader가 존재하지 않는다 이는 kotlin.io 패키지에서 확장함수로 추가되었다 bufferedReader를 사용하는 경우에도 동일하게 사용이 가능하다 파일을 읽어올때 줄 단위로 처리하고싶은 경우 useLines를 사용하면 된다 - copyTo copyTo함수는 이름 그대로 특정..
I/O는 input output으로 데이터를 필요로 하는곳으로 보내고 파일에 저장하거나 읽어올수 있다 - 표준 입출력 출력의 대표로는 우리가 자주 사용하던 print함수가 있다 이는 표준 출력이며, 내부적으로는 자바의 System.out.println()을 호출한다 표준 입력으로는 readLine() 함수가 있으며, 입력받은 데이터를 String으로 반환한다 readLine()는 String타입으로 반환하지만, int로 바로 캐스팅을 할려면 readLine()!!.toInt() 혹은 readLine()?.toInt() 의 형태로 사용하면 된다 여기서 !! 이나 ? 를 사용하여 null이 될수없게 하거나 null을 허용하는 것은 입력에 실패하는 경우 null 가능성이 생기기 때문이다 - 파일 입출력 파일을..