목표채널의 기념 개념과 사용법, 채널을 이용한 데이터 전송 이해셀렉트 표현식의 개념, 셀렉트를 이용한 비동기 작업 처리 이해채널채널은 송신자와 수신자의 수에 제한이 없으며, 채널을 통해 전송된 모든 값은 한 번만 받을 수 있습니다.채널은 누군가가 물품을 기부를 하면 아름다운 가게에 해당 물품이 전시되고, 그 물품은 여러 사람들 중 한 사람에게만 판매될 수 있다는 점에서 아름다운 가게와 비슷하다고 볼 수 있습니다.Channel은 아래와 같이 SendChannel와 ReceiveChannel를 구현한 인터페이스입니다. SendChannel: 원소를 보내거나 채널을 닫는 용도로 사용ReceiveChannel: 원소를 받을 때 사용SendChannel 인터페이스의 send 함수와 ReceiveChannel 인터..
전체 글
배경멀티 모듈 환경에서 테스트를 작성하다보면, 다른 모듈에서 만들어진 testFixture를 활용해야 할 때가 있습니다. 만약, testFixture를 test 디렉토리에서 작성하게 되면 다른 모듈에서 접근할 수 없어 매번 새로운 fixture를 모듈별로 만들어야 하는 번거로움이 있습니다. gradle의 java-test-fixture 플러그인을 활용하면 모듈에서 testFixture를 위한 디렉토리를 만들 수 있고, 상황에 따라 다른 모듈에서 해당 testFixture를 가져다가 사용할 수도 있습니다. Java Test Fixture먼저 gradle에서 java test fixture 플러그인을 설정하지 않으면, 모듈의 src 하위에 새로운 디렉토리를 생성하고자 할 때 아래와 같이 testFixtur..
배경 및 목표Java나 Kotlin 프로젝트를 진행하다보면, 여러 모듈 또는 라이브러리 의존을 하도록 build.gradle(또는 build.gradle.kts)에 의존성을 추가합니다. 의존성을 추가할 때에 사용할 수 있는 타입에는 여러개가 있고 어떤 상황에서 어떤 타입을 사용해야 하는지 정리하고자 포스팅을 하게 되었습니다. GradleGradle의 기본 구조아래 코드는 build.gradle.kts 예시입니다. 멀티모듈 구조를 사용하는 프로젝트의 루트 gradle 파일이라, 단일 모듈 프로젝트의 gradle 파일과 조금 상이할 수 있습니다.build.gradle 파일은 보통 plugins, repositories, dependencies 블록으로 구성됩니다./** * 참고) * - kotlin with..
아이템 49 - 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라Iterable과 Sequence는 서로 다른 목적으로 설계되어, 완전히 다른 형태로 동작합니다.Iterable은 처리 함수를 사용할 때마다 연산이 이루어져 List가 만들어지며, 컬렉션 처리 연산이 호출될 때마다 연산이 이루어집니다.Sequence는 지연(lazy) 처리가 되며, 시퀀스 처리 함수 사용 시 데코레이터 패턴으로 꾸며진 새로운 시퀀스가 리턴되고 최종적인 계산은 최종 연산(예: toList, count 등)이 이루어질 때 수행됩니다.즉, 최종 연산이 이루어지기 전까지는 각 단계에서 연산이 이루어지지 않습니다.시퀀스 지연 처리 장점시퀀스의 지연 처리는 아래와 같은 장점을 제공합니다.자연스러운 처리 순서를 유지함최소한의 연산..
아이템 45 - 불필요한 객체 생성을 피하라객체 생성은 언제나 비용이 들어가며, 상황에 따라 큰 비용이 발생할 수 있으므로 불필요한 객체 생성을 피하는 것이 좋습니다. JVM의 객체 생성 최적화동일 문자열일 때, 기존 문자열 재사용JVM에서는 하나의 가상 머신에서 동일한 문자열을 처리하는 코드가 여러개가 있다면, 기존 문자열을 재사용합니다.Integer나 Long와 같은 박스화한 기본 자료형에 대해서도 작은 값에 대해서는 재사용Kotlin/JVM에서 Int나 Double은 자바에서와 다르게 원시 타입입니다. 박싱 타입일 때, 작은 값들에 대해서는 캐싱을 하여 해당 값이 필요할 때 매번 새로운 객체를 생성하지 않고 기존 객체를 활용할 수 있습니다. 언제 박싱 타입으로 동작할까?nullable하게 타입을 ..
클래스는 객체 지향 프로그래밍(OOP) 패러다임에서 가장 중요한 추상화입니다. 이번 장에서는 코틀린에서 자주 볼 수 있는 클래스 사용 패턴에 대해 알아보고자 합니다. 이런 패턴을 어떻게 활용하고, 어떤 점을 기대하고 사용하는 지 등 규약에 대해서 알아보겠습니다. 해당 규약들을 잘 따르면, 안전하고 깔끔한 코드를 만드는 데 도움이 됩니다.아이템 36 - 상속보다는 컴포지션을 사용하라상속은 굉장히 강력한 기능으로, IS-A 관계의 객체 계층 구조를 만들기 위해 사용됩니다. 상속은 관계가 명확하지 않을 때 사용하면, 여러 문제가 발생할 수 있으므로 신중하게 사용해야 합니다.일반적으로, 일부 코드 추출 또는 재사용이 목적이라면 상속보다는 컴포지션을 사용하는 것이 좋습니다.간단한 행위 재사용프로그레스 바를 특정 ..
목표코루틴 효율적으로 테스트하기단위 테스트단위(Unit)명확히 정의된 역할의 범위를 갖는 코드의 집합을 의미하며, 정의된 동작을 실행하는 개별 함수나 클래스 또는 모듈 모두가 단위가 될 수 있습니다.단위 테스트란, 이런 단위에 대한 자동화된 테스트를 작성하고 실행하는 프로세스를 말합니다. 객체 지향 프로그래밍에서는 책임을 객체에 할당하고 객체간 협력을 구축하고 있기 때문에, 객체 지향 프로그래밍에서의 단위 테스트는 주로 객체에 대해 이루어집니다.코틀린 또한 객체 지향 언어이기 때문에 코틀린에서는 일반적으로 객체가 단위 테스트 대상이 됩니다.테스트는 보통 객체가 예상한 대로 동작하는지 확인하게 되며, 확인하는 대상은 아래와 같이 다양합니다.결과값이 제대로 반환되는지결과값이 원하는데로 잘 변화하는지객체간 의..
목표코틀린 공식 문서의 Asynchronous Flow 학습Asynchronous Flow중단 함수는 비동기적으로 하나의 값을 반환합니다. 비동기적으로 계산된 여러 가지 값들을 반환하고 싶을 때는 어떻게 해야 할까요? 이를 위해 등장한 것이 Kotlin Flow입니다.여러 값들을 표현하는 방법코틀린에서는 collections을 이용해서 여러 값들을 표현할 수 있습니다.forEachcollections의 값들을 표현할 때에는 아래와 같이 간단하게 forEach를 사용할 수 있습니다.Sequence만약, CPU를 소비하는 로직을 포함한다면 sequence를 활용하기도 합니다. 아래 코드는 앞선 forEach와 결과는 동일하지만, CPU 연산처럼 동작하기 위해 100ms 대기하는 로직을 포함하여 프로그램 수..