반응형

전체 글 169

[코틀린 프로그래밍] 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

[Kotlin] Application 설정값 가져오는 방법 - ConfigurationProperties로 구성

이번 글에서는 Kotlin에서 아래의 application.yml의 설정값을 읽어오는 방법을 정리해보겠습니다. 이 글에서 사용하는 설정방법은 SpringBoot 2.2.1 이상 버전부터 지원가능한 방법입니다. 모든 소스는 Github에 올려두었습니다. Application.yml sample: kotlin: language: kotlin study-days: 30 java: language: java study-days: 90 test: javaTest build.gradle.kts 아래의 디펜던시가 추가되있어야 ConfigurationProperties를 사용할 수 있습니다. dependencies { annotationProcessor("org.springframework.boot:spring-boo..

Develop/kotlin 2021.05.17

Unrecognized field "address" (class me.kotlin.sample.sample.SimpleData), not marked as ignorable (2 known properties: "first_name", "last_name"]) at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: me.kotlin.sample.sample.SimpleData["ad..

ObjectMapper를 사용하던 중 에러 발생! 증상 에러 메시지 Unrecognized field "address" (class me.kotlin.sample.sample.SimpleData), not marked as ignorable (2 known properties: "first_name", "last_name"]) at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: me.kotlin.sample.sample.SimpleData["address"]) OtherData 데이터 객체를 SimpleData 데이터 객체로 바꾸는 중 에러 발생 class OtherData( val lastName: String? = null, va..

TroubleShooting 2021.05.12

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

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

Study/kotlin 2021.05.11

[Querydsl-JPA] 자주 사용하는 기능 정리 (Kotlin)

이번 글에서는 다양한 프로젝트를 진행하면서 자주 사용되었던 Querydsl-JPA를 정리해보겠습니다. Kotlin Querydsl-JPA 설정방법이 궁금하신 분은 지난번 작성한 이글을 참조해주시기 바랍니다. 모든 소스는 Github에 올렸습니다. 참조해주세요 :) 간단한 목차입니다. 찾으시는 기능이 있으시다면 아래의 목차를 복사하여 Ctrl + F 로 검색하시면 빠르게 찾으실 수 있습니다. 간단한 RUD Read 전체조회 원하는 필드만 조회 QueryProjection Annotation Projections.fields Update Delete 게시판 관련 쿼리 케이스 Paging 기능 추가 케이스 Page && Sort 기능과 검색조건 포함된 케이스 Many Dynamic Query 대용량 데이터 처..

Develop/spring-data 2021.05.10

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

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

Study/kotlin 2021.05.03

Querydsl-JPA 코틀린스럽게 작성하기 ( 설정 포함 )

글 작성 목차는 아래와 같습니다. Kotlin Project에 Querydsl-JPA 설정 Kotlin스럽게 작성하기 Kotlin Project Querydsl-JPA 설정 먼저 Spring Initializer를 이용하여 Kotlin 프로젝트를 생성해보자! Build Script : Gradle Language : Kotlin Packaging : Jar Spring Web : Web Project를 위한 디펜던시 ( @RestController, @Service ... ) Spring Data JPA : JPA를 설정을 위한 디펜던시 ( Entity, Repository ) H2 Database : Entity기반으로 테이블을 생성할 메모리형 데이터베이스 코틀린 프로젝트를 만들고 build.gradl..

Develop/kotlin 2021.04.29

[코틀린 프로그래밍] 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
728x90
반응형