Kotlin/TIL

TIL (03.11)

내손은개발 🐾 2024. 3. 11. 21:28

 

CodeKata


 

[프로그래머스_Kotlin] 둘만의 암호

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 두

rlawog.tistory.com

 

알게된 점

  • 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: 필요할때만 생성하고 사용 후에 정리가 필요하다.
  • 코루틴을 실행할 쓰레드를 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