본문 바로가기

Kotlin23

Scope functions Kotlin 표준 라이브러리에는 객체의 컨텍스트 내에서 코드 블록을 실행하는 것이 유일한 목적인 여러 함수가 포함되어 있습니다. let, run, with, apply and also와 같은 함수는 모두 객체에서 코드 블록을 실행하는 동일한 작업을 수행하는데요. 각 함수의 차이점은 블록 내에서 이 객체를 사용할 수 있게 되는 방식과 표현식의 결과입니다. 몇 가지의 유형 별 예제를 통해 어떻게 scope function을 사용하는지 알아봅니다. Person("Alice", 20, "Amsterdam").let { println(it) it.moveTo("London") it.incrementAge() println(it) } 만약 동일한 코드를 let 키워드 없이 사용한다면 새로운 변수를 선언하고, 반복해.. 2023. 7. 15.
왜 reflect.jar 파일이 별도로 존재하지? 리플렉션은 런타임에 프로그램의 구조를 파악할 수 있게 해주는 언어 및 라이브러리 features의 집합이다. 코틀린에서 함수와 속성은 일급 시민이다. 이를 검사하는 기능은 기능적 또는 반응형 스타일을 사용할 때 필수적이다. 일급 시민과 리플렉션은 직접적인 관계는 없습니다. 코틀린의 언어적 특성에 함수와 속성 등은 일급 시민이라는 것입니다. 다만 리플렉션을 통해 메타데이터(클래스, 함수, 프로퍼티 등)를 동적으로 액세스 하고 조작할 수 있다는 것입니다. 그리고 이러한 기능을 사용하는 경우 우리는 별도의 라이브러리인 kotlin-reflect.jar를 사용해야 한다는 것입니다. 이를 분리한 이유는 공식문서에서 설명한 것과 같이 다음과 같습니다. JVM 플랫폼에서 Kotlin 컴파일러 배포에는 리플렉션 기능을.. 2023. 7. 6.
Using JPA with Kotlin in a Spring Boot Application 보호되어 있는 글 입니다. 2023. 7. 5.
spring boot, gradle 설정에 kotlin 환경 설정하기. 우선 다음과 같이 build.gradle 파일에 코틀린 플러그인을 설정해주어야 한다. https://plugins.gradle.org/plugin/org.jetbrains.kotlin.jvm 2023. 7. 4.
JUnit5 @JvmStatic @BeforeAll, @AfterAll 어노테이션은 @Test 메서드가 실행되기 전에 전, 후로 한 번 실행되어야 하는 메서드를 지정하는 데 사용됩니다. 이 메서드는 static이여야 하며, 테스트 클래스 내에서 한 번만 호출됩니다. 그래서 보통 테스트 환경의 초기화나 설정과 같은 작업을 수행하는 데 사용됩니다. 자바가 아닌 코틀린을 이용해 테스트를 작성하기 위해선 다음과 같이 지정해야 합니다. import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test import org.junit.jupiter.api.Assertions.* class ExampleTest { companion object { @BeforeAll @JvmStatic.. 2023. 7. 4.
Backing Property 코틀린에서 백킹 프로퍼티는 프로퍼티의 값을 저장하고 가져오기 위해서 내부적으로 사용하는 보조 프로퍼티입니다. 기본적으로 private 한 접근범위를 가지며, 기본값은 동일한 이름의 프로퍼티의 값을 저장하기 위한 필드입니다. 간단한 테스트코드를 작성하는 도중 객체의 값을 확인해야 하는 경우가 생겼습니다. if (calculator.number != 8) { throw IllegalStateException() } 위 코드는 내부 프로퍼티가 외부로 노출되어 에러 발생 여부를 포함하는 구조입니다. 이를 대체하기 위해 data class를 검토해 볼 수 있지만 setter를 포함하고 싶지 않다면 백킹 프로퍼티를 고려해 볼 수 있습니다. class Calculator( private var _number: Int.. 2023. 7. 3.
Kotlin 테스트 작성을 위한 빌드 업 코틀린으로 테스트코드를 작성하기 위해 빌드 스크립트에서 추가해주어야 하는 부분이 있다. 1. plugins id 'org.jetbrains.kotlin.jvm' version '1.6.21' 2. dependencies implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' 3. 컴파일 옵션 compileKotlin{ kotlinOptions { jvmTarget = "11" } } 4. 테스트 컴파일 옵션 compileTestKotlin{ kotlinOptions { jvmTarget = "11" } } 이를 통해 순수 코틀린으로 테스트를 작성할 준비가 완료되었다. 5. 패키지 구조 java 프로젝트에 코틀린을 위한 별도의 패키지 구조를 만들어준다. 그리고.. 2023. 1. 18.
Tip Type Alias, as import 긴 이름의 클래스 혹은 함수 타입이 있을 때 축약하거나 더 좋은 이름을 쓰고 싶을 때 사용한다. fun filterFruits(fruits: List, filter: (Fruit) -> Boolean) { } 람다의 파라미터를 다음과 같이 변형할 수 있다. typealias FruitFilter = (Fruit) -> Boolean fun filterFruits(fruits: List, filter: FruitFilter) { } 이름이 긴 클래스를 컬렉션에 사용할 때도 간단히 줄일 수 있다. 다른 패키지의 같은 이름 함수를 동시에 가져오고 싶다면 as import를 사용할 수 있다. 이는 어떤 클래스나 함수를 임포트 할 때 이름을 바꾸는 기능이다. import c.. 2023. 1. 15.
함수 1. 확장함수 코틀린은 자바와 100% 호환을 목표로 하고 있다. 기존 자바 코드 위에 자연스럽게 코틀린 코드를 추가하려는 고민이 동반된다. 그래서 어떤 클래스 안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 만들 수 있도록 하는 개념이 나온다. fun main() { val str = "abc" print(str.lastChar()) } fun String.lastChar(): Char { return this[this.length-1] } String 클래스를 확장하는 코드이다. 이 함수 블록 내부에서는 this를 이용해 실제 클래스 안의 값에 접근한다. 확장함수가 캡슐화를 위협할 수 있다고 생각할 수 있지만 확장함수는 클래스의 private, protected 멤버자체를 가져올 수 없다. 시그.. 2023. 1. 15.
중첩 클래스, 다양한 클래스 내부 클래스. 내부 클래스는 자바에서 다음과 같은 구조를 같는다. public class JavaHouse { ... public class LivingRoom { ... } } 내부 클래스를 코틀린에서 사용하는 방법을 알아보기 전에 내부 클래스의 단점을 조금 알고 가자. 우선 내부 클래스는 숨겨진 외부 클래스 정보를 사용할 수 있다. 내부 클래스에서 외부 클래스의 정보를 사용하고 있기 때문에 외부 클래스의 인스턴스를 GC 하려고 할 때 적절한 참조를 해제하는 코드가 내부 클래스에 없다면 해당 인스턴스는 영원히 GC 대상으로 마킹되지 않는다. 따라서 이는 메모리 누수가 생길 수 있다. 추가적으로 이를 디버깅하기 위해선 생각보다 많은 시간이 들어간다. 그래서 보통 클래스 안에 클래스를 만들 때는 stati.. 2023. 1. 15.