CS/코틀린 인 액션

    부록 E. 코루틴과 Async/Await

    https://kotlinlang.org/docs/coroutines-guide.html Coroutines guide | Kotlin kotlinlang.org https://speakerdeck.com/taehwandev/kotlin-coroutines Kotlin coroutines Jetbrains day in seoul 2018 speakerdeck.com 비동기는 알면 유용하게 쓰인다... 코루틴은 원래 코틀린 기능이 아니었지만 1.3버전에서 정식 채용된 플러그인. # 수도코드 generator countdown(n) { while(n>0) { yield(n) n -= 1 } } for i in countdown(10) { println(i) } yield를 실행해서 실행하던걸 멈추고 메인루틴..

    11. DSL 만들기

    11장에서 다루는 내용 - 영역 특화 언어 만들기 - 수신 객체 지정 람다 사용 - invoke 관례 사용 - 기존 코틀린 DSL 예제 확장함수를 사용해서 함수를 자연어처럼 쓰는건 멋지긴 한데... 잘 안쓸것 같다. 근데 이것이 진짜 코틀린처럼 쓰는거라며 언어 제작자가 미는 느낌. 나중에 쓰게 된다면 그때 자세히 보는걸로 11.1 API에서 DSL로 일반 구문 간결한 구문 사용한 언어 특성 StringUtil.capitalize(s) s.capitalize() 확장 함수 1.to("one") 1 to one 중위 호출 set.add(2) set += 2 연사자 오버로딩 map.get("key") map["key"] get 메서드에 대한 관례 file.use({ f -> f.read() }) file.us..

    10. 애노테이션과 리플렉션

    (잘 이해가 안되서 이해한 부분 위주로만 작성한다. 나중에 코틀린에 익숙해지면 다시 읽고 오자) 10장에서 다루는 내용 - 애노테이션 적용과 정의 - 리플렉션을 사용해 실행 시점에 객체 내부 관찰 - 코틀린 실전 프로젝트 예제 실전 프로젝트란 https://github.com/yole/jkid GitHub - yole/jkid: JSON serialization/deserialization library for Kotlin data classes JSON serialization/deserialization library for Kotlin data classes - GitHub - yole/jkid: JSON serialization/deserialization library for Kotlin dat..

    9. 제네릭스

    9장에서 다루는 내용 - 제너릭 함수와 클래스를 정의하는 방법 - 타입 소거와 실체화한 타입 파라미터 - 선언 지점과 사용 지점 변성 기본적인 제너릭 개념과 타입끼리도 상하 관계가 있고, 함수 내에서만 자식용으로 쓰인다던지 역전된다던지 하는 아주 개판이다. 클래스를 많이 다뤄야지 이해할 수 있고 의미가 있는 장인 것 같다. 나중에 다시 와서 읽으라고 9.1 제너릭 타입 파라미터 는 자바와 비슷한 개념임. val readers1: MutableList = mutableListOf() val readers2 = mutableListOf() 위의 두 코드는 같다. 안에 element를 쥐어주면 컴파일러가 알아서 타입을 추론하지만, 빈 리스트일 경우는 추론할 만한게 없다보니 직접 타입을 지정해줘야 한다. 제너릭..

    8. 고차 함수: 파라미터와 반환 값으로 람다 사용

    8장에서 다루는 내용 - 함수타입 - 고차 함수와 코드를 구조화할 때 고차 함수를 사용하는 방법 - 인라인 함수 - 비로컬 return과 레이블 - 무명 함수 함수의 인자로 함수를 넘길 수 있는것과 람다에 대해 좀 더 알아보는 장이다. 8.1 고차 함수 정의 함수도 변수마냥 타입 지정해서 넘길 수 있다. 주로 람다 사용하는게 편해서 람다를 넘기는 거고. fun twoAndThree(operation: (Int, Int) -> Int) { val result = operation(2, 3) println("The result is $result") } twoAndThree { a, b -> a + b } // The result is 5 twoAndThree { a, b -> a * b } // The r..

    7. 연산자 오버로딩과 기타 관례

    7장부터 Part 2로 코틀린답게 사용하기가 시작된다.. 별개로 여기 장에서 중간에 나오는 철학이 일단 보기 편하게 작성하고, 확장해야할 때 그때 수정하자가 나온다. 0. 7장에서 다루는 내용 - 연산자 오버로딩 - 관례: 여러 연산을 지원하기 위해 특별한 이름이 붙은 메서드 - 위임 프로퍼티 기본적인 것들은 1부에서 다 했으니 고급 기본 알려주는 느낌? 7.1 산술 연산자 오버로딩 에 들어가기 전에 알아야 개념은 코틀린은 자바의 타입을 가져다 쓰며 자바를 홰손하지 않기 위해 코틀린으로 가져와 확장 함수 형태로 만들어 사용한다. +, -, +=, -=, ++, -- 이런것들 이런것들을 사용하려면 함수 앞에 저 기호를 사용하게 한다는 operator를 써야 한다. data class Point(val x:..

    6. 코틀린 타입 시스템

    제일 큰 차이는 null를 다루는지 여부. 이것만 알아도 90%는 먹고 들어감 6.1. 널 가능성 어느 타입이 null이 될 수 있으면 ?가 붙고, 명확하게 null이 될 수 없다면 붙지 않는다. 즉, Type? = Type + null 이 되는거 그래서 만약 내가 다루고자 하는 타입이 널이 될 수 있다면 널인지 아닌지 체크해줘야 한다. fun strLenSafe(s: String?): Int = if (s != null) s.length else 0 val x: String? = null println(strLenSafe(x)) // 0 println(strLenSafe("abc")) // 3 그럼 ?가 있을 때마다 이렇게 해야되냐? 그래서 타입 ? 을 만들면서 널을 다루는 전용 연산자들을 만들었다(마..

    5. 람다로 프로그래밍

    가독성을 늘리기 위해 줄임말 문법을 계속 만들다보니 오히려 더 복잡해지는 감이 조금 있는 것 같다. 5.1 람다 식과 멤버 참조 val sum = { x: Int, y: Int -> x + y } println(sum(1, 2)) // 3 그냥 만들어서 바로 실행할거면 인자로 받은 람다를 바로 실행해주는 run 라이브러리 함수를 실행하자. { println(42) }() run { println(42) } val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.maxBy(Person::age)) println(people.maxBy({ p: Person -> p.age })) println(people.maxBy() { p: ..

    4. 클래스, 객체, 인터페이스

    다른 언어 쓰느라고 클래스를 거의 쓴 적이 없다. 그래서 이해가 잘 안되서 요약을 잘 못하겠음.. 4.1 클래스 계층 정의 interface Clickable { fun click() fun showOff() = println("I'm clickable!") } interface Focusable { fun setFocus(b: Boolean) = println("I ${if (b) "got" else "lost"} focus.") fun showOff() = println("I'm focusable!") } class Button : Clickable, Focusable { override fun click() = println("I was clicked") override fun showOff() {..

    3. 함수 정의와 호출

    1. 코틀린에서 컬렉션 만들기 코틀린에서 List, Array 같은거 쓰면 자바의 것을 쓴다. 이는 자바로 정의하는게 호환성에 더 유리해서. val set = hashSetOf(1, 7, 53) println(set.javaClass) >>> class java.util.HashSet 거기다 코틀린 자체적으로 확장 함수를 제공. 이건 좀 이따 자세한 설명 해줌 val numbers = listOf(1, 7, 53) println(set.first()) println(set.max()) println(set.last()) 2. 함수를 호출하기 쉽게 만들기 함수에 default 인자 설정 가능(놀랍게도 자바에는 없다). fun joinToString( collection: Collection, separat..