반응형

전체 글 1277

코틀린 부호 없는 정수

코틀린에서는 부호 없는 정수를 표현하기 위해 UInt, ULong, UShort, UByte 등의 부호 없는 정수 타입을 제공합니다. 이러한 부호 없는 정수 타입은 0과 양의 정수만 표현할 수 있으며, 음수를 표현하지 않습니다. 부호 없는 정수 타입 1. UInt (부호 없는 32비트 정수) val unsignedInt: UInt = 42U 2. ULong (부호 없는 64비트 정수) val unsignedLong: ULong = 42UL 3. UShort (부호 없는 16비트 정수) val unsignedShort: UShort = 42U 4. UByte (부호 없는 8비트 정수) val unsignedByte: UByte = 42U 주의사항 1. 타입 체크와 변환 부호 없는 정수 타입과 부호 있는 정..

Kotlin/포스팅 2023.12.31

코틀린 인라인 클래스 정의

코틀린에서 인라인 클래스(inline class)는 주로 간단한 래퍼(wrapper) 타입을 만들 때 사용됩니다. 이 클래스는 컴파일 시간에 인라인되어 런타임에는 실제 타입으로 대체되므로, 런타임 오버헤드 없이 새로운 타입을 만들 수 있습니다. 인라인 클래스는 특정한 상황에서 사용되어야 하며, 특히 특정 타입을 명시하는 것이 의미 있는 경우에 사용됩니다. 인라인 클래스를 정의하려면 inline 키워드를 사용하고, 주 생성자에 단일 프로퍼티를 가져야 합니다. inline class Wrapper(val value: Int) 위의 예제에서 Wrapper 클래스는 value라는 하나의 정수형 프로퍼티를 가지고 있습니다. 인라인 클래스는 일반 클래스와 마찬가지로 메서드나 프로퍼티를 가질 수 있습니다. 예를 들어..

Kotlin/포스팅 2023.12.31

코틀린 구조 분해 선언

코틀린에서 구조 분해 선언은 복합 데이터 타입(주로 데이터 클래스)의 각 요소를 개별 변수로 분해하여 사용하는 기능입니다. 이는 주로 데이터 클래스의 프로퍼티에 적용되며, 코드를 간결하게 만들고 가독성을 높일 수 있습니다. 기본 구조 data class Person(val name: String, val age: Int) fun main() { val person = Person("John", 30) // 구조 분해 선언 val (name, age) = person // 이제 name과 age 변수를 사용할 수 있음 println("Name: $name, Age: $age") } 위의 예제에서 val (name, age) = person 부분이 구조 분해 선언입니다. person 객체의 프로퍼티인 nam..

Kotlin/포스팅 2023.12.31

코틀린 데이터 클래스 연산

코틀린 데이터 클래스(data class)에서는 자동으로 생성되는 몇 가지 연산을 통해 편리하게 데이터를 다룰 수 있습니다. 이러한 연산들은 주로 데이터 클래스의 프로퍼티들을 다루거나 객체를 비교하는 데 사용됩니다. 1. componentN() 함수 데이터 클래스는 각 프로퍼티에 대한 componentN() 함수를 자동으로 생성합니다. 이 함수들은 구조 분해 선언에서 사용됩니다. data class Person(val name: String, val age: Int) val person = Person("John", 25) val (name, age) = person println("Name: $name, Age: $age") 위의 예제에서 component1()은 name에 대응하고, component..

Kotlin/포스팅 2023.12.31

코틀린 데이터 클래스

코틀린에서 데이터를 모델링하고 간편하게 클래스를 생성하기 위해 데이터 클래스(data class)를 제공합니다. 데이터 클래스는 데이터를 표현하는 데 특화된 클래스로, 자동으로 생성되는 몇 가지 기능을 제공하여 코드를 간결하게 작성할 수 있게 도와줍니다. 아래는 코틀린 데이터 클래스의 특징과 사용법에 대한 설명입니다. 1. 주 생성자에 선언된 프로퍼티들 data class Person(val name: String, val age: Int) 위의 코드에서 Person은 name과 age라는 두 개의 프로퍼티를 가진 데이터 클래스입니다. 주 생성자에 선언된 프로퍼티들은 자동으로 읽기 전용(getter)이 생성되며, 데이터 클래스에서는 일반적으로 읽기/쓰기 메서드가 필요하지 않습니다. 2. 자동으로 생성되는..

Kotlin/포스팅 2023.12.31

코틀린 enum 클래스의 공통 멤버

코틀린의 enum class는 공통 멤버들을 가질 수 있습니다. 이러한 공통 멤버는 열거형 내의 각 상수에 대해 공유되며, 모든 상수에서 동일한 방식으로 동작합니다. 아래는 코틀린 enum class에서 사용할 수 있는 일반적인 멤버들입니다. 1. name 속성 name 속성은 각 열거형 상수의 이름을 나타냅니다. enum class Color { RED, GREEN, BLUE } fun main() { println(Color.RED.name) // 출력: RED } 2. ordinal 속성 ordinal 속성은 각 열거형 상수의 순서(0부터 시작)를 나타냅니다. enum class Color { RED, GREEN, BLUE } fun main() { println(Color.GREEN.ordinal..

Kotlin/포스팅 2023.12.31

코틀린 enum 클래스 사용자 멤버 정의

코틀린 enum class에서 사용자 정의 멤버를 정의하려면, 각 열거형 상수에 속성이나 메서드를 추가하면 됩니다. 사용자 정의 멤버를 통해 각 열거형 상수에 고유한 동작이나 데이터를 부여할 수 있습니다. 다음은 간단한 예제를 통해 코틀린 enum class에서 사용자 정의 멤버를 사용하는 방법을 보여줍니다. enum class Direction(val degrees: Int) { NORTH(0) { override fun printDescription() { println("Heading towards the North") } }, EAST(90) { override fun printDescription() { println("Heading towards the East") } }, SOUTH(180)..

Kotlin/포스팅 2023.12.31

코틀린 enum 클래스 when식

코틀린의 enum class와 when 식을 함께 사용하면 강력하고 간결한 코드를 작성할 수 있습니다. when 식은 여러 값에 따라 다른 동작을 수행할 수 있는 표현식입니다. 이를 활용하여 enum class의 각 상수에 따라 다른 동작을 수행하는 코드를 작성할 수 있습니다. 아래는 when 식과 enum class를 함께 사용하는 예제입니다. enum class Color { RED, GREEN, BLUE } fun getColorName(color: Color): String { return when (color) { Color.RED -> "Red" Color.GREEN -> "Green" Color.BLUE -> "Blue" } } fun main() { val redColor = Color.R..

Kotlin/포스팅 2023.12.31

코틀린 이넘(enum) 클래스

코틀린(Kotlin)에서 enum class는 열거형을 정의하는 데 사용되는 특별한 형태의 클래스입니다. 자바(Java)에서의 열거형과 비슷하지만 몇 가지 차이가 있습니다. 코틀린의 enum class는 강력하면서도 유연한 열거형을 정의하는 데 도움이 됩니다. 아래는 간단한 코틀린 enum class의 예제입니다. enum class Color { RED, GREEN, BLUE } 이 예제에서 Color는 enum class이며, 이넘 상수로 RED, GREEN, BLUE가 있습니다. 1. 값과 메서드 추가 코틀린의 enum class는 각 열거형 상수에 값을 할당할 수 있으며, 각 상수에 메서드를 추가할 수도 있습니다. enum class Color(val rgb: Int) { RED(0xFF0000)..

Kotlin/포스팅 2023.12.31

코틀린 클래스 멤버인 확장

코틀린에서 클래스의 멤버로 확장 함수를 정의할 수 있습니다. 확장 함수는 클래스의 멤버 함수처럼 호출되지만, 클래스의 코드 범위에서 직접 정의되지 않습니다. 대신 클래스의 외부에서 해당 클래스의 기능을 확장하여 새로운 함수를 추가할 수 있습니다. 확장 함수의 일반적인 형태는 다음과 같습니다. fun ClassName.extensionFunction() { // 함수 본문 } 여기서 ClassName은 확장 함수를 추가하려는 클래스의 이름이고, extensionFunction은 새로운 확장 함수의 이름입니다. 예를 들어, String 클래스에 글자 수를 세는 확장 함수를 정의해보겠습니다. fun String.countCharacters(): Int { return this.length } fun main(..

Kotlin/포스팅 2023.12.31

코틀린 영역 함수

코틀린에서 영역 함수(scope function)는 수신 객체에 대해 코드 블록을 실행하면서 유용한 작업을 수행하는 함수입니다. Kotlin 표준 라이브러리에는 다섯 가지의 영역 함수가 있습니다. let, run, with, apply, also 이러한 영역 함수들은 주로 널이 아닌 객체를 다룰 때, 혹은 객체의 초기화 블록에서 사용됩니다. 1. let val result = "Hello, Kotlin".let { println(it) // 출력: Hello, Kotlin it.length } println(result) // 출력: 13 - let 함수는 수신 객체를 람다 블록에 전달하고, 람다 블록의 결과를 반환합니다. - it은 수신 객체를 가리키는 표기법입니다. 2. run val result =..

Kotlin/포스팅 2023.12.31

코틀린 수신 객체가 있는 호출 가능 참조

코틀린에서 수신 객체가 있는 호출 가능 참조를 사용하면 함수나 메서드를 참조하면서 수신 객체도 함께 전달할 수 있습니다. 이것은 클래스의 멤버 함수를 참조하면서 그 함수를 호출할 때 특정 인스턴스를 수신 객체로 전달하고자 할 때 유용합니다. 수신 객체가 있는 호출 가능 참조는 다음과 같이 선언됩니다. val functionReference: ClassName.() -> ReturnType = ClassName::functionName - functionReference: 수신 객체가 있는 호출 가능 참조입니다. - ClassName: 함수 또는 메서드가 속한 클래스의 이름입니다. - ReturnType: 함수 또는 메서드의 반환 타입입니다. - functionName: 호출하려는 함수 또는 메서드의 이름..

Kotlin/포스팅 2023.12.31

코틀린 람다와 수신 객체 지정 함수 타입

코틀린에서 람다와 수신 객체 지정 함수 타입은 함수형 프로그래밍 및 DSL (Domain-Specific Language) 등을 지원하기 위해 도입된 기능입니다. 람다 함수와 수신 객체 지정 함수 타입에 대해 알아봅시다. 1. 람다 함수 (Lambda Function) 코틀린에서 람다 함수는 함수의 일종으로, 다음과 같이 선언할 수 있습니다. val sum: (Int, Int) -> Int = { x, y -> x + y } - sum: 변수 이름 - (Int, Int) -> Int: 람다 함수의 타입. 이는 두 개의 Int 파라미터를 받아서 Int를 반환하는 함수를 나타냅니다. - { x, y -> x + y }: 람다 함수의 구현체. 여기서 x와 y는 파라미터를 나타내며, x + y는 함수의 반환값입..

Kotlin/포스팅 2023.12.31

코틀린 동반 확장

현재까지 코틀린에서는 동반 확장(Companion Object Extension)이라는 공식적인 문법이나 지원은 없습니다. 코틀린에서는 확장 함수 및 확장 프로퍼티를 클래스의 인스턴스에 대해 정의하거나, 동반 객체에 대해 정의할 수 있습니다. 그러나 동반 객체 자체를 확장하는 것은 현재까지는 지원되지 않습니다. 다만, 동반 객체의 멤버 함수 또는 프로퍼티로서 확장 함수 또는 확장 프로퍼티를 정의하는 것은 가능합니다. 아래는 이에 대한 예제입니다. class MyClass { companion object { fun companionFunction() { println("Companion function") } } } // 동반 객체의 멤버 함수를 확장 함수로 정의 fun MyClass.Companion...

Kotlin/포스팅 2023.12.31

코틀린 확장 프로퍼티

코틀린에서 확장 프로퍼티(Extension Property)는 기존 클래스에 새로운 프로퍼티를 추가할 수 있는 기능을 제공합니다. 확장 프로퍼티를 사용하면 기존 클래스의 코드를 변경하지 않고 새로운 프로퍼티를 선언할 수 있습니다. 확장 프로퍼티의 선언 확장 프로퍼티는 다음과 같이 선언됩니다. val ClassName.propertyName: PropertyType get() = // 프로퍼티의 게터 구현 - val: 읽기 전용 프로퍼티인 경우에 사용합니다. - ClassName: 확장할 클래스의 이름입니다. - propertyName: 확장 프로퍼티의 이름입니다. - PropertyType: 프로퍼티의 타입입니다. 확장 프로퍼티의 예제 val String.doubleLength: Int get() = t..

Kotlin/포스팅 2023.12.31

코틀린 확장 함수

코틀린의 확장 함수(Extension Functions)는 기존 클래스의 멤버 함수를 추가할 수 있는 강력한 기능입니다. 확장 함수를 사용하면 기존 클래스의 코드를 변경하지 않고 새로운 함수를 추가할 수 있어 유연하고 간결한 코드를 작성할 수 있습니다. 확장 함수의 선언 확장 함수는 다음과 같이 선언됩니다. fun ClassName.extensionFunctionName(parameters: ParameterType): ReturnType { // 함수의 내용 } - ClassName: 확장할 클래스의 이름입니다. - extensionFunctionName: 확장 함수의 이름입니다. - parameters: 함수의 매개변수입니다. - ReturnType: 함수의 반환 타입입니다. 확장 함수의 예제 // ..

Kotlin/포스팅 2023.12.31

코틀린 비지역적 제어 흐름

코틀린에서의 "비지역적 제어 흐름"은 주로 return 키워드가 사용되는 함수 또는 람다 내에서 특별한 제어 흐름을 의미합니다. 이는 주로 람다 함수, 익명 함수, 또는 중첩 함수 등에서 사용됩니다. 람다 함수에서의 비지역적 제어 흐름 코틀린에서는 람다 함수에서 return 키워드를 사용하면 람다 함수가 아닌 람다를 감싸고 있는 함수를 빠져나가게 됩니다. 이러한 동작을 비지역적(non-local) 제어 흐름이라고 합니다. fun main() { val numbers = listOf(1, 2, 3, 4, 5) // forEach의 람다에서 return은 main 함수를 빠져나가게 됨 numbers.forEach { if (it == 3) { return } println(it) } println("This..

Kotlin/포스팅 2023.12.31

코틀린 인라인 함수와 프로퍼티

코틀린에서 인라인 함수(Inline Function)과 프로퍼티(Property)는 코드 최적화와 간결한 문법을 제공하는 중요한 기능들입니다. 인라인 함수 (Inline Function) 인라인 함수는 호출 시 함수의 내용을 호출하는 부분에 직접 삽입하여 성능을 향상시키는 기능을 제공합니다. 일반적으로 함수를 호출하면 함수의 내용이 호출 지점에 복사되는 것이 아니라 호출 스택에 새로운 프레임이 생성되어 실행됩니다. 그러나 인라인 함수는 컴파일러에 의해 호출 지점에 함수의 코드가 직접 삽입되어 실행되므로 함수 호출로 인한 오버헤드가 줄어들게 됩니다. 인라인 함수를 선언하기 위해서는 inline 키워드를 사용합니다. inline fun customPrint(value: T) { println("Print: ..

Kotlin/포스팅 2023.12.31

코틀린 호출 가능 참조

코틀린에서 호출 가능 참조(Callable Reference)는 함수나 메서드를 참조하여 변수에 저장하거나 다른 함수의 인자로 전달할 때 사용하는 편리한 문법입니다. 호출 가능 참조를 사용하면 람다 식이나 익명 함수를 대체하여 코드를 간결하게 만들 수 있습니다. 함수 참조 (Function Reference) 코틀린에서는 함수 참조를 사용하여 함수를 직접 참조할 수 있습니다. 함수 참조는 :: 연산자를 사용하여 표현됩니다. fun greet(name: String): String { return "Hello, $name!" } val greeting: (String) -> String = ::greet println(greeting("Alice")) // 출력: Hello, Alice! 멤버 참조 (Me..

Kotlin/포스팅 2023.12.31

코틀린 익명 함수

코틀린에서 익명 함수(anonymous function)는 이름이 없는 함수로서, 주로 함수형 프로그래밍에서 사용됩니다. 익명 함수는 일반 함수와 유사하지만, 함수의 이름이 없고 직접 호출될 수 있는 형태로 작성됩니다. 익명 함수의 기본 구조 val sum: (Int, Int) -> Int = fun(x: Int, y: Int): Int { return x + y } // 또는 val sum2 = fun(x: Int, y: Int): Int { return x + y } 익명 함수를 인자로 받는 함수 fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } fun main() { val..

Kotlin/포스팅 2023.12.31

코틀린 람다 함수

코틀린 람다 함수(lambda function)는 익명 함수로, 코드 블록을 간결하게 표현할 수 있는 방법입니다. 람다 함수는 주로 고차 함수의 매개변수로 전달되거나, 함수형 인터페이스의 인스턴스를 생성할 때 사용됩니다. 람다 함수의 기본 구조 // 매개변수 없는 람다 함수 val lambda1: () -> Unit = { println("Hello, World!") } // 두 개의 정수를 더하는 람다 함수 val lambda2: (Int, Int) -> Int = { a, b -> a + b } 람다 함수를 인자로 받는 함수 fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } ..

Kotlin/포스팅 2023.12.31

코틀린 함수 타입

코틀린에서 함수 타입은 함수를 값으로 다룰 수 있도록 하는 개념입니다. 함수 타입은 함수의 시그니처를 표현하며, 변수나 매개변수 등에 할당되거나 전달될 수 있습니다. 함수 타입을 사용하면 고차 함수를 정의하거나 함수를 다룰 때 유연성을 제공합니다. 함수 타입의 기본 형식 코틀린에서 함수 타입은 (매개변수 타입) -> 반환 타입의 형식을 갖습니다. 여기서 매개변수 타입은 함수가 받는 인자의 타입이고, 반환 타입은 함수의 반환 값의 타입입니다. // (Int, Int) -> Int 타입의 함수 선언 val sum: (Int, Int) -> Int = { a, b -> a + b } // (String) -> Unit 타입의 함수 선언 val printMessage: (String) -> Unit = { me..

Kotlin/포스팅 2023.12.30

코틀린 고차 함수

코틀린에서 "고차 함수"는 함수를 인자로 받거나, 함수를 반환하거나, 함수를 변수에 대입할 수 있는 함수를 가리킵니다. 이는 함수형 프로그래밍의 핵심 개념 중 하나입니다. 고차 함수를 사용하면 코드를 더 간결하게 작성하고, 추상화 수준을 높일 수 있습니다. 1. 함수를 인자로 받는 고차 함수 fun List.customFilter(predicate: (T) -> Boolean): List { val resultList = mutableListOf() for (item in this) { if (predicate(item)) { resultList.add(item) } } return resultList } fun main() { val numbers = listOf(1, 2, 3, 4, 5) // cus..

Kotlin/포스팅 2023.12.30

코틀린 객체 식

코틀린의 "객체 식"은 일반적으로 인터페이스나 추상 클래스의 인스턴스를 생성할 때 사용됩니다. 객체 식을 사용하면 익명으로 생성된 객체를 정의하고 해당 객체의 메서드를 구현할 수 있습니다. 객체 식은 Java의 익명 내부 클래스와 유사한 개념이며, 주로 람다나 함수형 인터페이스를 대체하는 데에 사용됩니다. 기본 구조 val myInterfaceImplementation: MyInterface = object : MyInterface { override fun myFunction() { println("Implementation of myFunction in object expression") } } 위의 코드에서 MyInterface는 인터페이스이며, 해당 인터페이스의 인스턴스를 생성하는 익명의 객체를 ..

Kotlin/포스팅 2023.12.30

코틀린 동반 객체

코틀린의 동반 객체는 클래스 내부에 정의된 객체로서, 해당 클래스의 인스턴스와 무관하게 호출될 수 있는 함수나 프로퍼티를 정의하는 데 사용됩니다. 동반 객체는 클래스의 인스턴스 생성 없이 직접 호출할 수 있으며, 주로 팩토리 메서드나 다양한 유틸리티 메서드를 제공하는 데에 활용됩니다. 동반 객체 정의 class MyClass { companion object { // 동반 객체의 멤버(프로퍼티, 함수 등) 정의 val property: Int = 42 fun myFunction() { println("Function in companion object") } } } 동반 객체 사용 fun main() { // 동반 객체의 멤버에 접근하기 위해 클래스의 인스턴스를 생성할 필요 없음 println(MyCla..

Kotlin/포스팅 2023.12.30

코틀린 객체 선언

코틀린에서 "객체 선언"은 싱글톤 패턴을 간단하게 구현할 수 있는 특별한 구조를 제공합니다. 이를 통해 클래스의 인스턴스가 단 하나만 존재하도록 보장할 수 있습니다. 객체 선언은 object 키워드를 사용하여 정의되며, 해당 객체는 해당 클래스의 유일한 인스턴스입니다. 다음은 코틀린 객체 선언에 대한 기본 구조와 사용법에 대한 설명입니다. 기본 구조 object MySingleton { // 객체 선언의 멤버(프로퍼티, 함수 등) 정의 var count: Int = 0 fun increment() { count++ } } 사용법 fun main() { // 객체 선언에서 정의한 프로퍼티와 함수 호출 println(MySingleton.count) // 출력: 0 MySingleton.increment()..

Kotlin/포스팅 2023.12.30

코틀린 객체

코틀린에서 "객체"는 여러 의미를 가질 수 있습니다. 아래에는 주요한 의미로서의 "객체"에 대한 설명이 있습니다. 1. 클래스의 인스턴스 클래스를 기반으로 생성된 실체를 "객체"라고 부릅니다. 클래스는 객체를 생성하는 틀 또는 설계도 역할을 하며, 객체는 그 설계도를 기반으로 생성된 실체입니다. class Person(val name: String, val age: Int) // Person 클래스의 인스턴스 (객체) 생성 val person = Person("Alice", 30) 2. 객체 선언 (Object Declaration) 코틀린에서는 "객체 선언"을 사용하여 싱글톤 패턴을 간단하게 구현할 수 있습니다. 객체 선언은 클래스의 인스턴스를 하나만 가지는 객체를 정의할 때 사용됩니다. object ..

Kotlin/포스팅 2023.12.30

코틀린 지연 계산 프로퍼티와 위임

코틀린에서는 지연 계산 프로퍼티(lazy properties)와 위임(delegation)을 사용하여 프로퍼티의 동작을 커스터마이징할 수 있습니다. 이들은 프로퍼티의 초기화를 늦추거나, 다양한 동작을 추가하기 위해 활용됩니다. 지연 계산 프로퍼티 (Lazy Properties) 지연 계산 프로퍼티는 프로퍼티가 처음으로 접근되는 시점에 초기화되도록 하는 기술입니다. 이를 통해 초기화 비용이 높은 작업을 필요한 시점까지 늦출 수 있습니다. val lazyProperty: String by lazy { println("Compute the value") "Lazy Property Value" } fun main() { println("Before accessing lazy property") println(l..

Kotlin/포스팅 2023.12.30

코틀린 커스텀 접근자

코틀린에서는 프로퍼티의 접근자(accessor)를 커스터마이징하여 특정 동작을 수행하도록 할 수 있습니다. 프로퍼티의 접근자에는 Getter와 Setter가 있으며, 이를 커스터마이징하여 원하는 동작을 추가하거나 변경할 수 있습니다. 커스텀 Getter와 Setter class Person { // 커스텀 Getter와 Setter var age: Int = 0 get() { println("Getting age value") return field } set(value) { println("Setting age value to $value") field = value } } fun main() { val person = Person() // Getter 호출 println("Age: ${person.a..

Kotlin/포스팅 2023.12.30

코틀린 늦은 초기화

코틀린에서 늦은 초기화(Late Initialization)는 일반적으로 프로퍼티를 선언할 때 초기값을 바로 할당하지 않고, 나중에 필요한 시점에서 값을 초기화하는 기술을 가리킵니다. 이는 프로퍼티를 선언할 때 즉시 값을 할당하지 않아도 되며, 나중에 초기화할 수 있는 유연성을 제공합니다. 늦은 초기화를 사용하는 프로퍼티 선언 class MyService { // 늦은 초기화를 사용하는 프로퍼티 선언 lateinit var someProperty: String fun initialize() { // 나중에 필요한 시점에서 프로퍼티 초기화 someProperty = "Initialized" } } 위의 코드에서 someProperty는 lateinit 키워드를 사용하여 늦은 초기화를 허용하는 프로퍼티입니다..

Kotlin/포스팅 2023.12.30