본문 바로가기

Kotlin

Kotlin - 인라인 값 클래스 (inline value classes) https://kotlinlang.org/docs/inline-classes.html Inline value classes | Kotlin kotlinlang.org 종종 어떤 값을 도메인 특화된 타입의 클래스로 감싸는 것이 효율 적인 경우들이 있다(wrapper class 처럼). 하지만 힙 메모리의 오버헤드가 발생 하고, 감싸는 값이 원시타입(primitive) 인 경우에는 특별히 더 비효율적이다. 왜냐하면 primitive 타입은 런타임 시에 강하게 최적화 되지만 래퍼 클래스는 그렇지 못하기 때문이다. 이러한 문제를 해결하기 위해서 코틀린은 inline class 라는 특별한 클래스 기능을 제공한다. inline 클래스는 값 기반 클래스(value-based classes)이고, 정체성 없이 값의 .. 더보기
Kotlin - Enum 클래스 https://kotlinlang.org/docs/enum-classes.html Enum classes | Kotlin kotlinlang.org 개별 enum 상수는 오브젝트이고 서로 콤마로 구분하여 작성한다. 각 enum 은 enum 클래스의 인스턴스 이기 때문에 아래 처럼 초기화 할 수 있다. // 일반적인 enum enum class Direction { NORTH, SOUTH, WEST, EAST } // 속성값이 있는 경우 초기화 enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) } 익명 클래스 enum 상수는 아래 처럼 자기 자신을 익명 클래스로 선언 할 수 있다. 그렇기 때문에 아래 처럼 enum.. 더보기
Kotlin - 중첩 클래스, 내부 클래스 (Nested and inner classes) https://kotlinlang.org/docs/nested-classes.html Nested and inner classes | Kotlin kotlinlang.org 인터페이스나 클래스 내부에 중첩해서 인터페이스나 클래스를 선언 할 수 있다. interface OuterInterface { class InnterClass interface InnerInterface } class OuterClass { class InnerClass interface InnerInterface } Inner classes 중첩 클래스는 inner 로 표시되고, outer 클래스의 멤버로 접근 가능하다. class Outer { private val bar: Int = 1 inner class Inner { fun .. 더보기
Kotlin - 봉인 클래스와 인터페이스 (Sealed classes and interfaces) https://kotlinlang.org/docs/sealed-classes.html#sealed-classes-and-when-expression Sealed classes and interfaces | Kotlin kotlinlang.org 봉인 클래스(Sealed class)와 인터페이스는 선언된 패키지나 모듈 외에서 이를 상속하는 것을 방지 할 수 있다. 예로 서드파티 클라이언트는 봉인 클래스를 상속 받을 수 없다. 따라서 소스를 관리하는 관리 주체가 작성한 자식 클래스 외에는 둘 수가 없다. 그렇기 때문에 컴파일러는 해당 봉인 클래스의 자식 클래스로 어떤 클래스 들이 있는지 파악 할 수 있다. 쉽게 설명하면 내가 어떤 라이브러리를 개발하면서 JhException라는 봉인 클래스를 만들고 이를 상.. 더보기
Spring boot 3.x (Kotlin), QueryDSL 사용 설정 - Gradle(Kotlin) plugins 에 kotlin kapt 추가 plugins { ... kotlin("kapt") version "1.9.22" } dependencies 에 아래 의존성을 추가한다. dependencies { ... //querydsl implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta") kapt("com.querydsl:querydsl-apt:5.0.0:jakarta") kapt("jakarta.annotation:jakarta.annotation-api") kapt("jakarta.persistence:jakarta.persistence-api") } 이후 build 를 실행해 보면, 아래와 같이 build/generated/source/kapt/ma.. 더보기
Kotlin - 데이터 클래스(Data class) https://kotlinlang.org/docs/data-classes.html Data classes | Kotlin kotlinlang.org 코틀린에서 데이터 클래스는 데이터를 담는 용도에 주로 사용되고, data 키워드를 이용해 선언한다. data class User(val name: String, val age: Int) 컴파일러는 주 생성자에 포함된 속성값을 대상으로 아래 함수들을 자동으로 생성한다. .equals() / .hashCode() .toString() .componentN() .copy() fun derivedMembers() { val u1 = User("John", 25) val u2 = User("John", 25) val u3 = User("John", 26) printl.. 더보기
Kotlin - 확장(Extensions) https://kotlinlang.org/docs/extensions.html Extensions | Kotlin kotlinlang.org Kotlin은 확장이라는 특별한 정의 방법을 이용해서 클래스나 인터페이스의 기능을 상속 없이 확장 할 수 있다. 예로, 직접 수정할 수 없는 서드파티 라이브러리 클래스나 인터페이스에 원하는 함수를 추가 할 수 있다. 이렇게 추가한 함수들은 일반 함수들과 똑같은 방법으로 호출하여 사용가능하다. 이런 동작방식을 확장 함수(extension function) 이라고 부르며, 같은 방식의 확장 속성 (extension properties)도 있다. 확장 함수 (Extension functions) 확장 함수를 정의하기 위해서는 함수명 앞에 해당 함수를 받을 타입을 작성 해.. 더보기
Kotlin - 액세스 한정자 (Visibility modifiers) - public, protected, internal, private 클래스, 오브젝트, 인터페이스, 생성사, 함수, 속성과, 속성의 세터(setter, getter는 프로퍼티와 같은 수준의 액세스 한정자를 갖는다.) 들은 액세스 한정자(접근 제한자, visibility modifier)를 가질 수 있다. private, protected, internal, public 이 있으며, 기본은 public 이다. Packages top-level (패키지에 바로 선언되는) 함수, 속성, 클래스 오브젝트, 인터페이스를 대상으로 아무것도 작성하지 않으면 기본으로 public 이 적용되며, 어느곳에서나 접근이 가능하다. private 으로 선언하면같은 파일 내에서만 접근이 가능하다. internal 로 선언하면 같은 모듈 내에서만 접근이 가능하다. protected는 선언이 불가하.. 더보기