반응형

전체 글 1277

코틀린 위임 표현

코틀린에서 위임(delegation)은 클래스가 특정 동작을 다른 객체에게 위임하는 메커니즘을 의미합니다. 주로 프로퍼티 위임을 다루고 있지만, 위임은 메서드 호출에도 활용될 수 있습니다. 프로퍼티 위임 프로퍼티 위임은 새로운 프로퍼티를 선언할 때, 해당 프로퍼티의 getter나 setter를 다른 객체에 위임하는 기능입니다. by 키워드를 사용하여 프로퍼티 위임을 선언합니다. interface PropertyDelegate { operator fun getValue(thisRef: Any?, property: KProperty): T operator fun setValue(thisRef: Any?, property: KProperty, value: T) } class Example : PropertyD..

Kotlin/포스팅 2024.01.06

코틀린 커스텀 위임 만들기

코틀린에서는 사용자 정의 프로퍼티 위임을 만들어서 특정 프로퍼티의 동작을 커스터마이징할 수 있습니다. 이를 위해서는 ReadOnlyProperty 또는 ReadWriteProperty 인터페이스를 구현해야 합니다. 각각은 읽기 전용과 읽기/쓰기 가능한 프로퍼티에 대한 인터페이스입니다. 아래에 간단한 사용자 정의 프로퍼티 위임의 예제를 제시합니다. import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty // ReadOnlyProperty 인터페이스를 구현한 사용자 정의 위임 클래스 class CustomReadOnlyDelegate : ReadOnlyProperty { // getValue 메서드는 프로퍼티에 접근할 때 호출됨 o..

Kotlin/포스팅 2024.01.06

코틀린 표준 위임들

코틀린에서 제공하는 표준 위임은 주로 kotlin.properties 패키지에 포함되어 있습니다. 여러 표준 위임 중에서 대표적인 몇 가지를 살펴보겠습니다. 1. lazy lazy는 프로퍼티를 처음 사용할 때까지 초기화를 지연시키는 데 사용됩니다. 다음은 lazy를 사용한 간단한 예제입니다. val lazyValue: String by lazy { println("Computed!") "Hello Lazy" } fun main() { println(lazyValue) // 첫 번째 호출 시에만 "Computed!" 출력, 이후 호출은 초기화된 값을 반환 println(lazyValue) // 두 번째 호출부터는 "Computed!" 출력 없이 초기화된 값을 반환 } 2. observable observa..

Kotlin/포스팅 2024.01.06

코틀린 위임 프로퍼티

코틀린에서 위임 프로퍼티(delegated property)는 프로퍼티의 getter 및 setter 로직을 다른 객체에게 위임하는 메커니즘을 제공합니다. 이를 통해 코드 중복을 피하고, 재사용성을 높일 수 있습니다. 주요한 위임 프로퍼티 중에는 by 키워드를 사용하여 위임을 설정하는 여러 클래스들이 있습니다. 1. Lazy 위임 Lazy는 프로퍼티를 처음으로 사용할 때까지 초기화하지 않고, 사용 시에 초기화하는 데 사용됩니다. val lazyValue: String by lazy { println("Computed!") "Hello Lazy" } fun main() { println(lazyValue) // 첫 번째 호출 시에만 "Computed!" 출력, 이후 호출은 초기화된 값을 반환 println..

Kotlin/포스팅 2024.01.06

코틀린 이터레이션

코틀린에서의 이터레이션은 컬렉션(리스트, 맵, 세트 등)을 반복하여 각 요소를 처리하는 것을 의미합니다. 코틀린에서는 여러 방법을 통해 이터레이션을 수행할 수 있습니다. 1. 리스트 이터레이션 1.1. for 루프와 인덱스 val numbers = listOf(1, 2, 3, 4, 5) for ((index, value) in numbers.withIndex()) { println("Index: $index, Value: $value") } 1.2. for 루프 val numbers = listOf(1, 2, 3, 4, 5) for (number in numbers) { println(number) } 1.3. forEach 함수 val numbers = listOf(1, 2, 3, 4, 5) numbe..

Kotlin/포스팅 2024.01.05

코틀린 구조 분해

코틀린의 구조 분해(구조체 분해)는 데이터 클래스의 주요 속성을 개별 변수로 편리하게 분해할 수 있는 기능을 제공합니다. 이것은 주로 Pair, Triple과 같은 튜플 형태의 데이터 클래스나 컬렉션에서 사용됩니다. 1. 데이터 클래스의 구조 분해 data class Point(val x: Int, val y: Int) val point = Point(3, 5) // 구조 분해 val (x, y) = point println("x: $x, y: $y") // 출력: x: 3, y: 5 위의 예제에서 Point 클래스의 인스턴스를 생성하고, 이를 구조 분해하여 x와 y 변수에 할당하였습니다. 2. Pair와 Triple의 구조 분해 val pair: Pair = Pair("apple", 10) val tr..

Kotlin/포스팅 2024.01.04

코틀린 호출과 인덱스로 원소 찾기

코틀린에서는 함수 호출과 인덱스를 사용하여 컬렉션의 원소를 찾거나 다루는 다양한 방법을 제공합니다. 1. 함수 호출로 원소 찾기 - find 함수 find 함수를 사용하여 조건에 맞는 첫 번째 원소를 찾을 수 있습니다. 조건에 맞는 원소가 없을 경우 null을 반환합니다. val numbers = listOf(1, 2, 3, 4, 5) val result = numbers.find { it > 3 } println(result) // 출력: 4 - first 및 last 함수 first와 last 함수를 사용하여 조건에 맞는 첫 번째 또는 마지막 원소를 찾을 수 있습니다. 조건에 맞는 원소가 없을 경우 NoSuchElementException이 발생할 수 있습니다. val numbers = listOf(..

Kotlin/포스팅 2024.01.04

코틀린 대입

코틀린에서는 변수에 값을 할당하는 대입 연산자(=)를 사용합니다. 대입 연산은 변수에 값을 저장하는 기본적인 작업 중 하나입니다. 다양한 대입 방법과 함께 몇 가지 특별한 대입 연산자에 대한 설명을 제공합니다. 1. 단일 대입 (=) var x: Int = 5 val y: String = "Hello" = 연산자를 사용하여 변수에 값을 할당합니다. var 키워드로 선언된 변수는 값을 변경할 수 있지만, val 키워드로 선언된 변수는 값을 변경할 수 없습니다. 2. 복합 대입 (+=, -=, *=, /= 등) var a: Int = 10 a += 5 // a = a + 5 a -= 3 // a = a - 3 a *= 2 // a = a * 2 a /= 4 // a = a / 4 복합 대입 연산자를 사용하여..

Kotlin/포스팅 2024.01.04

코틀린 중위 연산

코틀린에서는 중위 표현법을 사용하여 특정 이항 연산자 메소드를 좀 더 간결하게 표현할 수 있습니다. 중위 표현법은 함수 호출 시에 점(.)과 괄호(())를 생략하고 공백을 사용하는 방식입니다. 중위 표현법을 사용하려면 다음 조건을 만족해야 합니다. 1. 멤버 함수 또는 확장 함수여야 합니다. 2. 하나의 파라미터를 가져야 합니다. 3. infix 키워드로 정의되어야 합니다. 다음은 중위 표현법을 사용한 예제를 보여줍니다. data class Point(val x: Int, val y: Int) { // 중위 연산자로 좌표를 합치는 함수 정의 infix fun merge(other: Point): Point { return Point(x + other.x, y + other.y) } } fun main()..

Kotlin/포스팅 2024.01.03

코틀린 이항 연산

코틀린에서는 이항 연산자를 오버로딩하여 사용자가 정의한 클래스에 대해 해당 연산을 지원할 수 있습니다. 이항 연산자 오버로딩은 operator 키워드를 사용하여 정의됩니다. 1. 이항 덧셈 (+) 연산자 오버로딩 data class Point(val x: Int, val y: Int) { // 이항 덧셈 연산자 오버로딩 operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } } fun main() { val point1 = Point(1, 2) val point2 = Point(3, 4) // 이항 덧셈 연산자 사용 val result = point1 + point2 println(result) // 출력: Poi..

Kotlin/포스팅 2024.01.03

코틀린 증가와 감소

코틀린에서는 증가와 감소 연산자를 명시적으로 제공하지 않습니다. 대신에, inc() 및 dec() 메서드를 사용하여 객체의 값을 증가 또는 감소시킬 수 있습니다. 1. inc() 및 dec() 메서드 inc() 메서드는 값을 1 증가시키고, dec() 메서드는 값을 1 감소시킵니다. 이러한 메서드는 코틀린에서 내장된 연산자 오버로딩을 지원합니다. class Counter(var value: Int) { // 증가 연산자 오버로딩 operator fun inc(): Counter { value++ return this } // 감소 연산자 오버로딩 operator fun dec(): Counter { value-- return this } } fun main() { val counter = Counter(..

Kotlin/포스팅 2024.01.03

코틀린 단항 연산

코틀린에서는 단항 연산자를 오버로딩하여 사용자 정의 클래스에 대해 해당 연산을 정의할 수 있습니다. 단항 연산자 중에서는 주로 - (마이너스) 연산자와 ! (논리 부정) 연산자가 오버로딩되어 사용됩니다. 1. 마이너스 (-) 연산자 오버로딩 단항 마이너스 연산자 (-)를 오버로딩하기 위해서는 unaryMinus 함수를 정의합니다. data class Complex(val real: Double, val imaginary: Double) { // 단항 마이너스 연산자 오버로딩 operator fun unaryMinus(): Complex { return Complex(-real, -imaginary) } } fun main() { val c1 = Complex(1.0, 2.0) val result = -c..

Kotlin/포스팅 2024.01.03

코틀린 연산자 오버로딩

코틀린에서는 연산자 오버로딩을 지원하여 사용자가 자신만의 클래스에 대해 연산자를 새롭게 정의할 수 있습니다. 연산자 오버로딩을 사용하면 사용자 정의 타입에 대해 자연스럽게 연산을 수행할 수 있습니다. 다음은 코틀린에서 연산자 오버로딩을 어떻게 수행하는지에 대한 간단한 설명입니다. 1. 이항 연산자 오버로딩 이항 연산자를 오버로딩하려면, 해당 연산자에 대한 함수를 클래스 내부에 정의해야 합니다. 예를 들어, 두 개의 복소수를 더하는 plus 연산자를 정의하는 클래스를 살펴봅시다. data class Complex(val real: Double, val imaginary: Double) { // 이항 덧셈 연산자 오버로딩 operator fun plus(other: Complex): Complex { ret..

Kotlin/포스팅 2024.01.03

코틀린 리플렉션 호출 가능

코틀린 리플렉션을 사용하여 함수를 호출하는 데는 call 메서드가 사용됩니다. call 메서드는 KFunction 인터페이스에 속하며, 함수를 동적으로 호출하는 데 사용됩니다. 여러 유형의 함수 호출 및 관련된 내용에 대해 자세히 살펴보겠습니다. 1. 일반 함수 호출 data class Person(val name: String, val age: Int) fun greet(person: Person): String { return "Hello, ${person.name}! You are ${person.age} years old." } fun main() { val person = Person("Alice", 30) val kFunction = ::greet // 일반 함수 호출 val result: S..

Kotlin/포스팅 2024.01.03

코틀린 리플렉션 지정자와 타입

코틀린 리플렉션 API에서는 클래스, 함수, 프로퍼티, 파라미터 등의 리플렉션 정보를 가져오거나 조작하기 위한 여러 지정자와 타입이 제공됩니다. 1. 리플렉션 지정자 (KVisibility) KVisibility는 클래스, 함수, 프로퍼티 등의 접근 제어 지정자를 나타내는 열거형입니다. data class Person(private val name: String, protected val age: Int) fun main() { val kClass = Person::class val properties = kClass.memberProperties for (property in properties) { println("${property.name} visibility: ${property.visibili..

Kotlin/포스팅 2024.01.03

코틀린 리플렉션 API

코틀린 리플렉션 API는 kotlin-reflect 라이브러리를 통해 제공됩니다. 이 라이브러리를 사용하여 실행 중인 코드의 구조를 분석하고 조작할 수 있습니다. 주요한 클래스와 함수들을 살펴보면서 리플렉션 API를 자세히 살펴보겠습니다. 1. KClass KClass는 클래스와 관련된 리플렉션 정보를 제공하는 핵심 인터페이스입니다. ::class를 사용하여 클래스의 KClass 인스턴스를 얻을 수 있습니다. data class Person(val name: String, val age: Int) fun main() { val kClass: KClass = Person::class println("Class Name: ${kClass.simpleName}") } 2. KFunction 및 KPropert..

Kotlin/포스팅 2024.01.03

코틀린 리플렉션

코틀린 리플렉션은 실행 중인 코드의 구조를 분석하고 조작하는 데 사용되는 기술입니다. 리플렉션을 사용하면 클래스, 메서드, 프로퍼티 등에 대한 정보를 동적으로 가져오거나 수정할 수 있습니다. 코틀린 리플렉션은 kotlin-reflect 라이브러리를 통해 제공됩니다. 1. 클래스 정보 가져오기 import kotlin.reflect.full.* data class Person(val name: String, val age: Int) fun main() { val person = Person("Alice", 30) val kClass = person::class println("Class Name: ${kClass.simpleName}") println("Properties: ${kClass.memberPr..

Kotlin/포스팅 2024.01.02

코틀린 내장 애너테이션

코틀린은 몇 가지 내장 애너테이션을 제공하여 코드에 메타데이터를 추가하고 특정 동작을 지정할 수 있습니다. 여기에는 주요 내장 애너테이션 몇 가지에 대한 설명이 포함되어 있습니다. 1. @Deprecated @Deprecated 애너테이션은 해당 요소가 더 이상 사용되지 않음을 나타냅니다. 사용자에게 경고 메시지를 표시하고 새로운 대체 방법을 사용하도록 권장합니다. @Deprecated("This function is deprecated", replaceWith = ReplaceWith("newFunction()")) fun deprecatedFunction() { // deprecated function implementation } 2. @JvmName @JvmName 애너테이션은 자바 바이트코드에서..

Kotlin/포스팅 2024.01.02

코틀린 애너테이션 클래스 정의

코틀린에서 애너테이션을 정의하기 위해서는 annotation 키워드를 사용하여 애너테이션 클래스를 선언합니다. 애너테이션 클래스는 주로 소스 코드에 메타데이터를 추가하기 위해 사용됩니다. 애너테이션 클래스는 클래스 선언과 유사하지만 특정 제약이 있습니다. 다음은 간단한 애너테이션 클래스의 예제입니다. annotation class MyAnnotation 위의 코드에서 MyAnnotation은 코틀린에서 정의된 애너테이션입니다. 애너테이션 클래스는 class 키워드를 사용하여 정의되지만 일반적인 클래스와는 몇 가지 차이점이 있습니다. 1. 애너테이션 파라미터 애너테이션 클래스는 파라미터를 가질 수 있습니다. 이를 통해 애너테이션을 더 유연하게 사용할 수 있습니다. annotation class MyAnno..

Kotlin/포스팅 2024.01.02

코틀린 애너테이션

코틀린에서 애너테이션(Annotation)은 소스 코드에 메타데이터를 추가하는 방법입니다. 애너테이션은 주로 컴파일러, 런타임, 또는 다른 도구들에게 추가 정보를 제공하는 데 사용됩니다. 아래는 코틀린 애너테이션에 대한 주요 내용입니다. 1. 애너테이션 선언 코틀린에서 애너테이션은 @ 기호를 사용하여 선언됩니다. annotation class MyAnnotation 2. 애너테이션 사용 애너테이션은 클래스, 함수, 프로퍼티 등에 적용될 수 있습니다. @MyAnnotation class MyClass { @MyAnnotation fun myFunction(@MyAnnotation parameter: String): Int { return 42 } @MyAnnotation val myProperty: Str..

Kotlin/포스팅 2024.01.02

코틀린 타입 별명

코틀린에서 타입 별명을 사용하여 긴 타입을 간단하게 나타낼 수 있습니다. 이는 코드의 가독성을 향상시키고 복잡한 타입을 간결하게 표현하는데 도움이 됩니다. 타입 별명을 선언하는 방법은 다음과 같습니다. typealias MyString = String typealias IntPredicate = (Int) -> Boolean typealias StringList = List 위의 예제에서 MyString은 String 타입의 별명이 되었고, IntPredicate는 (Int) -> Boolean 함수 타입의 별명이 되었습니다. 또한 StringList는 List 타입의 별명입니다. 사용 예제 fun processString(myString: MyString) { println(myString.toUppe..

Kotlin/포스팅 2024.01.02

코틀린 스타 프로젝션

스타 프로젝션(Star Projection)은 코틀린에서 사용되는 제네릭 타입에서 일부만을 사용하거나 특정한 변성을 신경 쓰지 않고 모든 타입을 사용할 때 유용한 문법입니다. 스타 프로젝션은 * 기호를 사용하여 표현됩니다. 사용 예제 class Box(val value: T) fun printBox(box: Box) { // 어떤 타입이든 상관없이 사용 가능 val value = box.value println(value) } fun main() { val intBox = Box(42) val stringBox = Box("Hello") printBox(intBox) // 출력: 42 printBox(stringBox) // 출력: Hello } 위의 예제에서 printBox 함수는 Box로 선언되어 있..

Kotlin/포스팅 2024.01.02

코틀린 프로젝션을 사용한 사용 지점 변성

코틀린에서 프로젝션(projection)은 제네릭 타입의 일부만을 사용하거나 제한하여 변성을 다루는 방법입니다. 프로젝션을 통해 사용 지점에서 타입의 변성을 다양하게 조절할 수 있습니다. 코틀린에서는 세 가지 종류의 프로젝션을 사용합니다: 선언 지점 변성(out), 하위 타입 제한(in), 스타 프로젝션(*). 1. 선언 지점 변성 (out) 선언 지점 변성은 제네릭 타입을 사용하는 곳에서만 특정 타입 파라미터를 더 상위 타입으로 취급하는 방법입니다. out 키워드를 사용합니다. class Box(val value: T) fun useProducer(producer: Box) { // 생산된 값을 사용하는 로직 } val stringProducer: Box = // ... useProducer(strin..

Kotlin/포스팅 2024.01.02

코틀린 선언 지점 변성

코틀린에서 선언 지점 변성(Declaration-site variance)은 제네릭 타입의 변성을 타입 선언 시점에서 지정하는 방식을 의미합니다. 이는 클래스나 인터페이스를 선언할 때 타입 파라미터의 변성을 결정하는 것을 말합니다. 코틀린에서는 out과 in 키워드를 사용하여 선언 지점 변성을 지정합니다. out 키워드 (공변성 - Covariance) out 키워드를 사용하여 타입 파라미터가 해당 타입이나 그 하위 타입으로만 사용되도록 선언할 수 있습니다. 이는 주로 타입을 "생산"하는 경우에 사용됩니다. interface Producer { fun produce(): T } fun useProducer(producer: Producer) { // 생산된 값을 사용하는 로직 } val stringPro..

Kotlin/포스팅 2024.01.02

코틀린 변성의 생산자와 소비자 구분

코틀린에서 변성(variance)를 이해하기 위해 "생산자 프로듀서(Producer)"와 "소비자 컨슈머(Consumer)"라는 개념을 살펴보는 것이 도움이 됩니다. 이 개념들은 주로 제네릭 타입을 설계할 때 사용되며, 공변성과 반공변성과 관련이 있습니다. 1. 생산자 프로듀서 (Producer) 생산자는 데이터를 "생산"하거나 "만들어냄"을 의미합니다. 제네릭 타입에서는 주로 "읽기 연산"에 해당합니다. 공변성은 생산자를 나타내며, 타입 파라미터가 out으로 선언됩니다. interface Producer { fun produce(): T } class StringProducer : Producer { override fun produce(): String { return "Hello, Kotlin!" ..

Kotlin/포스팅 2024.01.02

코틀린 변성

코틀린에서 변성(variance)은 제네릭 타입 간의 서브 타이핑 관계를 설명하는데 사용되는 개념입니다. 변성은 주로 제네릭 클래스나 인터페이스를 설계할 때 타입 파라미터의 하위 타입 관계를 지정하는 데 활용됩니다. Kotlin에서는 세 가지 변성을 지원합니다: 공변성(Covariance), 반공변성(Contravariance), 무변성(Invariance). 1. 공변성 (Covariance) 공변성은 부모 타입의 제네릭 타입을 자식 타입으로 취급하는 것을 의미합니다. out 키워드를 사용하여 선언합니다. 이는 주로 읽기 연산에서 사용됩니다. class Box(val value: T) val box: Box = Box(42) val intBox: Box = box // 공변성 위의 예제에서 Box는 T..

Kotlin/포스팅 2024.01.02

코틀린 타입 소거와 구체화

코틀린은 제네릭을 구현할 때 자바 가상 머신(JVM)의 제한적인 제네릭 지원 때문에 타입 소거(Type Erasure)와 구체화(Reification)라는 두 가지 다른 접근 방식을 사용합니다. 1. 타입 소거 (Type Erasure) 타입 소거는 JVM이 제네릭을 지원하지 않는 부분에 대응하기 위한 방법 중 하나입니다. 즉, 컴파일러가 소스 코드를 바이트 코드로 변환할 때, 제네릭 정보를 유지하지 않고 실제 타입을 알 수 없도록 하는 것을 말합니다. 이는 컴파일 시점에는 제네릭 타입에 대한 정보가 있지만 런타임에서는 소거되어 실제로 Object 타입으로 변환됩니다. class Box(val value: T) fun main() { val intBox = Box(42) val stringBox = Bo..

Kotlin/포스팅 2024.01.02

코틀린 바운드와 제약

코틀린에서 제네릭을 사용할 때, 타입 파라미터에 제약을 가하는 기능을 "바운드"라고 합니다. 이를 통해 특정 타입이나 특정 조건을 만족하는 타입만을 사용할 수 있도록 제한할 수 있습니다. 상한(Upper Bound) 바운드 상한 바운드는 타입 파라미터가 특정 상위 타입이나 인터페이스의 서브 타입이어야 함을 나타냅니다. where 키워드를 사용하여 제약을 추가할 수 있습니다. fun max(first: T, second: T): T { return if (first > second) first else second } 위의 예제에서 T : Comparable는 T가 Comparable 인터페이스의 서브 타입이어야 한다는 제약을 나타냅니다. 따라서 max 함수를 호출할 때 T는 Comparable을 구현한 ..

Kotlin/포스팅 2024.01.02

코틀린 제네릭 선언

코틀린에서 제네릭을 선언하는 방법은 주로 클래스, 인터페이스, 함수 등을 정의할 때 사용됩니다. 제네릭은 코드의 재사용성과 타입 안정성을 높이기 위한 강력한 기능입니다. 이를 위해 타입 파라미터를 사용하여 일반적인 형식으로 코드를 작성할 수 있습니다. 1. 클래스에서의 제네릭 선언 클래스에서 제네릭을 선언하는 방법은 다음과 같습니다. class Box(val item: T) { // 클래스 내용 } 위의 예제에서 Box 클래스는 T라는 타입 파라미터를 가지고 있습니다. 이 클래스는 나중에 생성할 때 실제 타입으로 대체됩니다. val intBox = Box(42) // Box val stringBox = Box("Hello") // Box val doubleBox = Box(3.14) // Box 2. 함..

Kotlin/포스팅 2024.01.02

코틀린 타입 파라미터

코틀린에서 타입 파라미터(Type Parameter)는 제네릭 프로그래밍에서 사용되는 개념으로, 함수나 클래스가 특정한 타입이나 형식에 의존하지 않고, 일반적으로 작동하도록 하는데 사용됩니다. 즉, 코드의 재사용성과 타입 안정성을 높이기 위한 도구로 활용됩니다. 타입 파라미터는 일반적으로 대문자 알파벳으로 표시되며, 함수나 클래스를 선언할 때에 사용됩니다. 함수에서의 타입 파라미터 사용 fun printItem(item: T) { println(item) } 위의 예제에서 는 타입 파라미터를 나타냅니다. printItem 함수는 어떤 타입의 인자든 받을 수 있도록 일반화되어 있습니다. 함수를 호출할 때마다 실제 타입으로 대체됩니다. printItem(42) // 출력: 42 printItem("Hello..

Kotlin/포스팅 2024.01.02