반응형

Study 76

[엘레강트 오브젝트] 2-1장 가능하면 적게 캡슐화하세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 이 책에서는 4개 또는 그 이하의 객체를 캡슐화할 것을 권장합니다. 내부에 캡슐화된 객체 전체를 가리켜 객체의 '상태' 또는 ' 식별자' 라고 부릅니다. class Cash( private val digits: Int, private val cents: Int, private val currency: String ) Cash 클래스는 3개의 객체를 캡슐화하고 있습니다. 반대로 3개의 객체가 모여서 Cash 클래스의 객체를 식별할 수 있습니다. 상태 관점으로 바라보는 객체 val CashA = Cash(29, 92, "USD")..

Study/object 2021.08.12

[엘레강트 오브젝트] 1-3장 생성자에 코드를 넣지 마세요

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 인자에 손대지 말라 인자에 손대는 클래스 먼저 인자에 손대는(?) 코드를 살펴보겠습니다. class Cash( private val dollars: Int ) { constructor(dollars: String): this(Integer.parseInt(dollars)) } 객체 초기화에는 코드가 없어야하고 인자를 건드리면 안됩니다. 필요하다면 인자를 다른 타입의 객체로 감싸거나 가공하지 않은 형식으로 캡슐화해야합니다. 위 코드를 수정한 예시를 살펴보겠습니다. 인자에 손대지 않는 클래스 class Cash( priv..

Study/object 2021.08.11

[엘레강트 오브젝트] 1-2장 생성자 하나를 주 생성자로 만드세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 이 책의 방법론대로 클래스를 작성한다면 메서드 수보다 생성자 수가 많아질 것 입니다. Method Count < Construct Count 이 책에서 권장하는 메서드의 수는 2 ~ 3개이고 생성자는 5 ~ 10 개입니다. 예시를 통해서 자세히 살펴보겠습니다. 먼저 임의의 Cash 클래스를 생성합니다. class Cash( private var dollars: Int ) { } 생성자가 많아질수록 클래스를 더 유연하게 사용할 수 있습니다. Cash(30) Cash("$29.5") Cash(29.5f) Cash(29.5..

Study/object 2021.08.11

[엘레강트 오브젝트] 1-1장 -er로 끝나는 이름을 사용하지 마세요.

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다. 책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다. 토론하기 클래스 먼저 클래스에 대해서 간략하게 알아봅니다. 일반적으로 클래스가 객체를 인스턴스화합니다. 클래스를 객체의 템플릿으로 설명하지만 잘못된 설명입니다. 클래스는 객체의 팩토리이다. 클래스는 객체를 꺼내거나 반환할 수 있는 위치이기 떄문에 클래스를 저장소 또는 웨어하우스라고 불러야 합니다. 객체가 살아있는 생명체라면 클래스는 객체의 어머니 본론 클래스 명 짓기에 대해 살펴보겠습니다. class CashFormatter( val dollars: Int ) { fun format(): String { return Strin..

Study/object 2021.08.10

그림으로 이해하는 카프카

들어가기전 카프카를 학습하던 중 카프카 구성에 대한 그림이 머릿속에 잘 들어오지 않아 이번 글을 작성하게 되었습니다. 이 글에 나오는 대부분 이미지는 책(아파치카프카 애플리케이션 프로그래밍 with 자바)을 참조하여 그렸습니다. 카프카란? 카프카는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼입니다. 극단적인 예로 아래와 같은 MSA Service가 있다고 가정합니다. 아키텍처의 복잡도가 매우 높은 것을 한 눈에 알아볼 수 있습니다. 다음 그림은 카프카를 도입하여 아키텍처를 재설계한 그림입니다. 극단적인 예를 들기 위한 아키텍처 그림입니다. 실제로는 무조건 카프카를 쓰기보다 용도에 맞게 사용해야합니다. 이 것 말고도 다양하게 카프카를 사용할 수 있습니다. 다..

Study/message-queue 2021.08.05

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

MongoDB 특징과 쉘 사용에 대해서 알아보자 - 1

이 글은 몽고의 특징과 쉘 사용법에 대해서 작성할 글입니다. 2개의 글로 작성되있습니다. 다음글 : MongoDB 특징과 쉘 사용에 대해서 알아보자 - 2 글의 내용이 많으므로 찾으시는 목차를 검색하여 글에서 검색하면 빠르게 찾으실 수 있습니다. 목차 find find(), findOne() findOneAndUpdate() update updateOne(), updateMany() $set 제한자 갱신 연산자($inc) 배열 연산자($push) $push에 $each 제한자 $push에 $slice $sort 제한자를 $push 작업에 적용 배열을 집합으로 사용하기($ne) 요소 제거 배열의 위치 기반 변경 배열 필터를 이용한 갱신 갱신 입력 $setOnInsert 다중 도큐먼트 갱신 갱신한 도큐먼트 ..

Study 2021.06.08

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