반응형

Study/kotlin 16

[코틀린 프로그래밍] Chapter.16 비동기 프로그래밍

코루틴은 논블로킹 호출을 구현하기 위한 훌륭한 방법입니다. 코루틴을 이용하면 작업을 동시 실행으로 할 수 있고 다른 코루틴 컨텍스트를 사용해서 병렬로 실행할 수 있습니다. 이번 글에서는 코루틴의 개념을 바탕으로 비동기 프로그래밍을 만들어보겠습니다. 비동기 프로그래밍 코루틴은 비차단방식을 사용합니다. 사용 용도로는 리모트 서비스 호출, DB 업데이터, 검색 등 즉시 수행되지 않는 행위들의 효율성을 높이기 위해 사용됩니다. 순차적으로 시작하기 날씨 정보를 가지고 오는 예제로 살펴보겠습니다. 먼저 외부 통신으로 가져온 데이터를 JSON으로 파싱하기 위해서 Klaxon 라이브러리를 추가합니다. implementation("com.beust:klaxon:5.5") 데이터를 가지고 있을 Airport 클래스와 온도..

Study/kotlin 2021.07.01

[코틀린 프로그래밍] Chapter.15 코루틴 탐험하기

이번 글에서는 코루틴의 기본에 대해 작성하고 코루틴을 순차적으로 또는 동시성으로 실행하는 방법을 알아보고 스레드와 코르틴의 관계를 이해하고 스레드 실행의 제어와 코루틴을 디버깅하는 법을 작성하겠습니다. 코루틴과 동시 실행 코루틴은 모든 경우에 사용되는 것은 아닙니다. 로직에 있어 순차적 로직이 필수적일 경우에는 코루틴은 비효율적입니다. 코루틴의 동시 실행은 병령 실행과 다릅니다. 병렬 실행과 동시실행의 차이점을 명확히 이해하여야합니다. 왜냐하면 머맅 코어 프로세서의 멀티 스레드는 일반적으로 병렬로 실행되고 코루틴은 일반적으로 병렬실행보다는 동시실행에 더 많이 사용됩니다. 병렬 vs 동시성 하나의 예를 들어보겠습니다. 사람1이 사람2에게 말을 하고 있습니다. 사람1은 말을 하고 사람2는 말을 듣습니다. 이..

Study/kotlin 2021.06.22

[코틀린 프로그래밍] Chapter.14 재귀 프로그래밍과 메모이제이션 프로그래밍

이번 챕터에서는 재귀 프로그래밍에 대해서 작성해보겠습니다. 재귀는 쿨한 프로그래밍 기법이지만 잘못 사용한다면 런타임 스택 오버플로에 빠져서 효율성이 떨어지는 문제가 있습니다. 꼬리호출 최적화라고 불리는 테크닉을 이용하면 이 문제를 해결할 수 있습니다. 데이터를 저장하는 알고리즘을 사용하면 성능은 향상됩니다. 코틀린은 빌트인 메모이제이션을 지원해주지는 않지만 지금까지 배운 기술들을 사용하면 표현력이 강한 메모이제이션 기능을 쉽게 만들 수 있습니다. 재귀의 강점과 위험성 재귀를 사용하면 분할정복기법을 사용할 수 있습니다. 예제로 살펴보자. // 분할정복기법 문제를 해결할 때 문제를 작게 쪼개서 각 부분의 솔루션을 구현한 후 각 결과를 합쳐서 해결하는 기법 fun sort(numbers: List): List..

Study/kotlin 2021.06.16

[코틀린 프로그래밍] Chapter.13 내부 DSL 만들기

DSL은 도메인 특화언어입니다. ( Domain-Specific languages ) DSL은 에러를 줄이는데 도움을 주는 동시에 프로그래머에게 유연성을 제공합니다. 이번 글에서는 DSL을 설계하는 방법에 대해서 작성해보겠습니다. DSL의 타입과 특징 외부 DSL vs 내부 DSL 외부 DSL은 높은 자유도를 얻을 수 있지만 DSL을 파싱하고 처리할 파서를 만들어야만 합니다. 파서를 만드는 데는 많은 리소스가 필요합니다. 외부 DSL의 예로는 CSS, ANT 빌드파일, Make 빌드파일 등이 있습니다. 하지만 이번 글에서는 내부 DSL에 초점을 맞출 것입니다. 내부 DSL을 위한 코틀린 DSL을 디자인할 때 도움이 되어줄 코틀린의 기능을 살펴보겠습니다. 생략 가능한 세미콜론 코틀린은 세미콜론을 강요하지 ..

Study/kotlin 2021.06.07

[코틀린 프로그래밍] Chapter.12 코틀린에서 구현하는 유창성

먼저 정리하기에 앞서 이 책에서 가장 기억에 남는 문장 "죄송합니다. 편지를 짧게 쓸 여유가 없어서 길게 씁니다" - 블레즈 파스칼 - 개발을 하면 위 문장이 어떤 의미인지 이해할 수 있을 것입니다. 중복 코드 제거, 하나의 클래스 혹은 메서드에 모든 로직을 다 작성, 이중 삼중 if문(for문) 등등 다양한 이유로 코드는 길어집니다. 하지만 고민과 시간을 들이면 코드는 점점 줄어들 것 입니다. 이번 장에서는 어떻게 코틀린 코드를 잘 쓰고, 표현력 있게 쓰고 간결하게 쓰는 지를 작성할 것입니다. 연산자 오버로딩 코틀린은 연산자를 오버로딩하여 사용할 수 있습니다. 즉 기능을 확장시킬 수 있습니다. 예제를 살펴보겠습니다. val one = BigInteger("1") val two = BigInteger("..

Study/kotlin 2021.06.01

[코틀린 프로그래밍] Chapter.11 내부 반복과 지연 연산

외부 반복자가 눈에 띄는 명령형 스타일과는 다르게 함수형 프로그래밍은 내부 반복자를 사용한다. 개발자는 반복에 집중하는 것이 아니라 콜렉션이나 범위에 있는 각 요소에 집중하게 한다. 또한 내부 반복자는 명시적 뮤터빌리티을 피하게 해주기 때문에 경쟁조건의 위험없이 반복을 쉽게 병렬화할 수 있다. 코틀린의 내부 반복자는 편리하고 표현력이 강하고 외부 반복자와 비교했을 때 복잡성을 낮춰준다. 하지만 퍼포먼스가 안 좋을 수 있다. 내부 반복자는 외부 반복자와 비교해 봤을 때 연산을 약간 더 많이 한다. 콜렉션의 요소의 크기가 수백개 정도로 비교적 작은 경우엔 영향이 없지만 수천 개를 다루는 아주 큰 데이터의 콜렉션을 다루는 경우에는 오버헤드가 이슈가 될 수 있습니다. 이럴 때 바로 코틀린의 시퀀스가 필요합니다...

Study/kotlin 2021.05.25

[코틀린 프로그래밍] Chapter.10 람다를 사용한 함수형 프로그래밍

함수형 프로그래밍은 본질적으로 복잡성이 낮습니다. 개발자는 적은 코드로 기능을 구현하고 코드가 더 읽기 쉽고, 이해하기 쉽고, 유지보수하기 쉽게 만들 수 있습니다. Java 같은 언어는 명령형 스타일과 객체지향 스타일의 조합을 제안했습니다. 객체지향 프로그래밍은 추상화와 캡슐화 개념에서 유용했습니다. 함수형 프로그래밍의 목적은 객체지향형 프로그래밍을 대체하는 것이 아니라 복잡성을 낮추는 것입니다. 코틀린은 태생부터 명령형, 함수형, 객체지향형 패러다임을 지원했습니다. 이번 글에서는 함수형 프로그래밍의 장점에 대해서 정리해보겠습니다. 또한 람다 표현식을 만들고 사용하는 법과 람다를 사용하는 경우에 대해서 알아보겠습니다. 함수형 스타일 함수형 스타일은 선언적 스타일에서 태어났습니다. 선언적 스타일의 핵심은 ..

Study/kotlin 2021.05.18

[코틀린 프로그래밍] Chapter.09 델리게이션을 통한 확장

먼저 글을 작성하기 전에 자바에는 없는 기능을 알려드립니다. 상속과 델리게이션은 클래스를 다른 클래스로부터 확장시키는 개념입니다. 코틀린은 객체 지향 프로그래밍을 디자인하면서 두 가지 방법 중 선택하여 사용할 수 있습니다. 상속은 부모와 자식이 강력하게 묶이고 수정할 수 없습니다. 일단 상속을 받으면 클래스는 부모의 클래스에 귀속되어 버립니다. 델리게이션은 상속보다 유연한 개념입니다. 객체는 객체 자신이 처리해야 할 일을 다른 클래스 인스턴스에게 위임하거나 넘길 수 있습니다. 서로 다른 클래스의 인스턴스끼리 위임할 수 있습니다. 상속 대신 델리게이션을 쓰는 상황 - 상속 : 클래스의 객체가 다른 클래스의 객체가 들어갈 자리에 쓰여야 할 때 - 델리게이션 : 클래스의 객체가 단순히 다른 클래스의 객체를 사..

Study/kotlin 2021.05.11

[코틀린 프로그래밍] Chapter.08 클래스 계층과 상속

언어를 다루는 개발자 입장에선 클래스는 쉬운 것 같으면서도 매우 복잡하다고 생각합니다. 클래스는 다른 클래스의 추상화와 연결되어 있고 이를 바탕으로 만들어집니다. 코틀린의 클래스는 기본적으로 final입니다. 베이스 클래스로 사용하려면 open 키워드를 class 앞에 선언해줘야합니다. 클래스를 sealed로 정의하여 클래스에서 확장할 수 있는 특정 클래스를 명시할 수 있습니다. 인터페이스와 추상 클래스 인터페이스 코틀린의 인터페이스는 추상 메소드를 작성하는 명세에 의한 설계를 할 수 있고 Java의 default 메서드처럼 구현이 가능합니다. 또한 static 메소드가 컴패니언 객체에 들어있는 것과 유사하게 작성할 수 있습니다. // 간단한 interface interface Remote { // 구현..

Study/kotlin 2021.05.03

[코틀린 프로그래밍] Chapter.07 객체와 클래스

객체와 싱글톤 코틀린은 싱글톤을 직접 지원함으로써 싱글톤을 구현할 때 발생할 수 있는 부담과 구현이 잘못될 수 있는 리스크를 제거하였다. 객체 표현식으로 사용하는 익명 객체 객체가 필요하면 객체를 가져야 한다. 코틀린의 객체 표현식은 Java의 익명 클래스(Anonymous Class)를 생성하는 데 유용하게 쓰인다. 선언 방식으로는 object 키워드 이후에 블록을 작성하여 사용할 수 있다. fun drawCircle() { val circle = object { val x = 10 val y = 20 val radius = 30 } println("Circle x : ${circle.x} y : ${circle.y} radius : ${circle.radius}") } drawCircle() 익명 객..

Study/kotlin 2021.04.26

[코틀린 프로그래밍] Chapter.06 오류를 예방하는 타입 안정성

Any와 Nothing 클래스 Any Java의 Object와 대응되는 클래스지만 같지는 않습니다. Any는 to(), let(), run(), apply(), also()와 같은 확장함수를 가지고 있습니다. 이러한 메소드에 대해서는 뒤에 자세히 다루겠습니다. Nothing 함수가 아무것도 리턴하지 않는 경우이다. Java의 void가 떠오르지만 다른 개념입니다. 코틀린은 표현식이 리턴을 하지 않을 때에는 Unit을 사용합니다. 그러나 정말 아무것도 리턴하지 않는 경우에는 Nothing 사용합니다. fun computeSqrt(n: Double): Double { if (n >= 0) { return Math.sqrt(n) } else { throw RuntimeException() // Nothing ..

Study/kotlin 2021.04.20

[코틀린 프로그래밍] Chapter.05 콜렉션 사용하기

콜렉션의 특징Java에서는 리스트, 셋, 맵 등의 여러 종류의 콜렉션들을 사용합니다. 코틀린에서은 모두 지원하고 있고 이를 뮤터블( 변경가능 )과 이뮤터블( 변경불가능 ) 2가지로 나뉘어서 사용할 수 있습니다. 배열 만드는 방법val alphabet = arrayOf("a", "b", "c", "d") println("${alphabet[0]} and ${alphabet[1]}") smart하지 못한 방법아래 코드는 Integer 클래스 타입으로 생성됨. 오버헤드가 크게 발생합니다.val notSmartNumbers = arrayOf(1, 2, 3, 4, 5)smart한 방법int인 primity type으로 생성하자.val smartNumbers = intArrayOf(1, 2, 3, 4, 5) // ..

Study/kotlin 2021.04.14

[코틀린 프로그래밍] Chapter.04 외부 반복과 아규먼트 매칭

소스 코드에서 많은 비중을 차지하고 있는 for문을 코틀린에서 우아하게 다루는 방법을 정리해보겠습니다. 범위와 반복 코틀린에서 제공하는 레인지를 설정할 수 있습니다. val oneToFive: IntRange = 1..5 val aToE: CharRange = 'a'..'e' 반복 자바에서 일반적인 for문과 비교해보겠습니다. // Java for (int i = 0; i < 5; i++) { // logic.. } Kotlin // 정방향 for ( i in 1..5) { // logic.. } // 후방향 for ( i in 5.downTo(1)) { // logic... } until : 마지막값을 포함 시키지 않는 for (i in 1 until 5) { print("$i, ") } // 1,2,..

Study/kotlin 2021.04.13

[코틀린 프로그래밍] Chapter.03 함수를 사용하자

함수생성간단한 함수코틀린은 KISS ( Keep It Simple Stupid ) 원칙을 준수한다. 단순하게 작성이 가능하다.fun greet() = "hello" // 가장 심플한 메소드 정적타입의 변수와 마찬가지로 메소드의 리턴타입 또한 타입 추론이 가능하다. 위 코드를 보면 코틀린은 리턴타입이 String 타입이라는 것을 추론할 수 있다.fun greet() : String = "hello" // 위 코드와 동일 코틀린은 표현식이 많고 명령문은 적다. 아래의 메소드가 표현식이다.fun sayHello() = println("hello")코틀린 메소드에서 return 타입은 필수입니다. 위와 같이 리턴타입이 없는 println을 사용할 경우는 Unit 을 리턴합니다. Unit은 아무런 값도 리턴하지 ..

Study/kotlin 2021.04.05

[코틀린 프로그래밍] Chapter.02 Java의 개발자를 위한 코틀린 필수 사항

목표 숫자와 문자열 변수 정의하기 상수 만들기 타입 명시하기 계산 결과를 이용해 문자열 표현식 만들기 멀티라인 문자열 만들기 이번 챕터에서는 자바 개발자들은 코틀린이 가진 뉘앙스를 배우는 동안에는 자바에서 사용하던 버릇을 잊어야합니다. 코드량 Java >> Kotlin 세미클론 Kotlin은 자바에 비해 많은 것들이 선택적입니다. 대표적인 예로 모든 표현식이나 명령문 마지막에 세미클론(;)을 생략되었습니다. // Java int a = 3 * 6; // Kotlin val a = 3 * 6 변수타입 코틀린은 정적 타입 언어입니다. 모든 변수를 선언할 때 타입을 지정해야하는 것은 아니지만 일반적으로는 지정을 해야합니다. 타입이 지정된 변수는 컴파일 시점에 검증됩니다. fun main() { val gree..

Study/kotlin 2021.03.29
728x90
반응형