CodeKata
알게된 점
- toChar() / digitToChar()
- Int형에서 toChar()을 하게되면 아스키코드의 문자로 변환한다. (64.toChar()의 결과값은 a)
- digitToChar()은 해당 0~9까지의 숫자 자체를 Char타입으로 반환해준다.
- inc() = ++ / dec() = -- 와 같다.
Kotlin 문법
- 주 생성자와 부 생성자
- init, Constructor 정리
- Interface
책 내용과 구글링으로 나온 내용이라서 개인 노션에 정리하였다.
5-2 ~ 5-6 강의 정리
더보기
확장함수
- 어떤 클래스의 멤버 메서드인 것처럼 호출할 수 있지만 그 클래스의 밖에서 선언된 함수
- 따로 상속받지 않고 하나의 클래스에 추가적인 메서드를 구현하고 싶을 때 사용하는 함수
- 새로운 클래스를 만드는 번거로움을 줄일 수 있음
- 확장 함수는 마치 클래스 안에 메서드를 구현해서 사용하는 것처럼 만들어 주는 효과일 뿐, 실제로 클래스 안에 메서드가 만들어지진 않는다.
fun main() {
fun Student1.getGrade() = println(grade)
var student = Student1("홍길동",10,"A")
student.getGrade()
}
class Student1(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)
}
}
비동기 프로그래밍
- 여러가지의 로직들이 완료 여부에 관계없이 실행되는 방식
- 작업을 순차적으로 진행하지 않고 다른 작업과 동시에 다른 작업을 하는...(설명못하겠다)
- 순서대로 하나의 작업씩 수행하는 행위를 동기적 프로그래밍이라한다.
- 순차적으로 진행하는 동기적을 사용했을 경우 앞에 작업이 끝나지 않으면 뒷작업은 영원히 수행할 수 없다.
쓰레드
- 로직을 동시에 실행할 수 있게 도와준다.
- 프로그램은 하나의 메인 쓰레드가 존재한다.
- fun main() 말고도 별도의 자식 쓰레드를 생성해서 동시에 로직을 실행할 수 있다.
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.concurrent.thread
fun main() {
thread(start = true) {
for (i in 1..10) {
println("Thread1: $i")
runBlocking {
launch {
delay(1000)
}
}
}
}
thread(start = true) {
for (i in 50..60) {
println("Thread2: $i")
runBlocking {
launch {
delay(1000)
}
}
}
}
}
코루틴
- 코루틴이 쓰레드보다 더욱 가볍게 사용할 수 있다.
- 로직들을 협동해서 실행하자는게 목표이고 구글에서 적극 권장한다.
- 최적화된 비동기 함수를 사용
- 일반적으로 launch와 async 빌더를 가장 많이 사용한다.
- launch는 결과 값이 없는 코루틴 빌더를 의미한다.
- launch는 Job객체로 코루틴을 관리한다.
- async는 결과값이 있는 코루틴이고 Deffered 타입으로 값을 리턴해준다.
- 스코프로 범위를 지정할 수 있다.
- GlobalScope: 앱이 실행된 이후에 계속 수행되어야할 때
- 계속 비동기적으로 실행되어야 할 때
- CoroutineScope: 필요할때만 생성하고 사용 후에 정리가 필요하다.
- GlobalScope: 앱이 실행된 이후에 계속 수행되어야할 때
- 코루틴을 실행할 쓰레드를 Dispatcher로 지정할 수 있다.
- 쓰레드보다 더 경량화된게 코루틴이므로 하나의 쓰레드 안에 여러개의 코루틴을 나눠서 쓸 때의 개념
- Dispatchers.Main : UI와 상호작용하기 위한 메인쓰레드
- Main쓰레드 안에서 여러개의 루틴을 나눠서 쓰겠다.
- Dispatchers.IO : 네트워크나 디스크 I/O작업에 최적화되어있는 쓰레드
- Dispatchers.Default : 기본적으로 CPU최적화되어있는 쓰레드
fun main(){
println("메인쓰레드 시작")
var job = GlobalScope.launch{
delay(3000)
println("코루틴")
}
println("메인쓰레드 종료")
}
GlobalScope는 실행되지 않는다. Android처럼 계속 실행하고 있지 않기때문에 기다려주지 않는다.
fun main(){
println("메인쓰레드 시작")
var job = GlobalScope.launch{
delay(3000)
println("코루틴")
}
runBlocking {
job.join()
}
println("메인쓰레드 종료")
}
대신 runBlocking으로 막아줄 수 있다. Android에서는 잘 사용하지 않음
'Kotlin > TIL' 카테고리의 다른 글
TIL (03.13) (0) | 2024.03.13 |
---|---|
TIL (03.12) (0) | 2024.03.12 |
TIL (03.08) (0) | 2024.03.08 |
TIL (03.07) (1) | 2024.03.07 |
TIL (03.06) (1) | 2024.03.06 |