Kotlin
-
아이템1 - 가변성을 제한하라Kotlin/Effective Kotlin 요약 2022. 12. 26. 00:01
Kotlin에서는 read-write property인 var을 사용하거나, mutable 객체를 사용하면 상태를 가질 수 있습니다. var a = 10 var list: MutableLost = mutableListOf() 상태를 가지는 경우는 양날의 검입니다. 장점 : 시간의 변화에 따라서 변하는 요소를 표현할 수 있다. 단점 : 상태를 적절하기 관리하는 것은 어렵다 1. 어디서 변경이 일어났는지 추적하기 힘들다. 2. 어떤 값을 가지고 있는지 알아야 코드의 실행을 예측할 수 있습니다 (예를 들어 분기문이 있을 때) 3. 멀티스레드 프로그래밍일 때는 적절한 동기화가 필요합니다. (Lock, 원자적 연산 등) 4. 테스트하기 어렵습니다 (모든 상태를 테스트해야 합니다, 상태가 늘어나면 더 힘들어집니다)..
-
[Kotlin] Result란?Kotlin/Kotlin 2022. 12. 4. 00:01
코틀린의 runCatching 코틀린에서는 runCatching을 통하여 에러 핸들링을 할 수 있습니다. API를 호출하는 코드에서 API의 응답 에러에 따른 비즈니스 로직을 다르게 가져가고 싶을 수 있습니다. 어떤 경우에는 에러를 캐치해서 다른 메시지를 던지고 싶을 수 있으며, 어떤 코드에서는 그 에러를 무시하고 다른 로직을 수행하고 싶을 수 있습니다. 즉, 동작이 성공하든 실패하든 동작의 결과를 캡슐화해서 나중에 처리될 수 있도록 하는 것이 목적입니다. 함수형 방식의 에러 처리도 가능하며 Coroutines에서 에러 처리를 할 때 구글이 권장하는 방식이기도 합니다. try.. catch 사용 시 try { loginApiClient.login(request) } catch (e: LoginExcept..
-
[Kotlin] 연산자 오버로딩 사용 예시Kotlin/Kotlin 2022. 11. 25. 00:21
개요 Effective kotlin에서는 연산자 오버로딩할때는 의미를 명확히 하라고 합니다. 이런 예제가 어떤것들이 있는지 알아보는 시간을 가지겠습니다. BigInteger BigInteger 클래스는 int, long으로 표현할 수 없는 매우 큰 수를 다루기 위해 등장한 클래스입니다. BigInteger 클래스를 다룬다면 add 함수 호출보단 + 연산하는 것이 더 좋습니다. val a = BigInteger("1") val b = BigInteger("2") println(a.add(b)) //자바에서는 이렇게 써야함 println(a+b) //자바에서는 Error 발생, 코틀린에서는 Error 발생x Pair 활용 만약 두 좌표계를 더해야 하는 일이 있을 수 있습니다. 이런 경우에 연산자 오버로딩을 ..
-
[Kotlin] @JvmStatic이란?Kotlin/Kotlin 2022. 10. 28. 00:01
개요 Junit5의 @ParameterizedTest를 사용하면서 @MethodSource를 사용하던 중 다음과 같은 에러가 발생했습니다. org.junit.platform.commons.JUnitException: Could not find factory method 이때 Companion Object에 @JvmStatic 키워드를 붙여서 해결할 수 있었습니다. https://stackoverflow.com/questions/57054115/use-pure-kotlin-function-as-junit5-methodsource Use pure Kotlin function as Junit5 methodsource I am curious if in the Kotlin, in the parameterized ..
-
11장 - DSL 만들기Kotlin/코틀린인액션요약 2022. 9. 23. 00:01
11장에서 다루는 내용 영역 특화 언어 만들기 수신 객체 지정 람다 사용 invoke 관례 사용 기존 코틀린 DSL 예제 API에서 DSL으로 궁극적인 목표는 코드의 가독성과 유지 보수성을 좋게 유지하고자 합니다. 코틀린이 지원하는 간결한 구문들 - 확장 함수 - 중위 호출 - 연산자 오버로딩 - get 메서드에 대한 관례 - 람다를 괄호 밖으로 빼내는 관례 - 수신 객체 지정 람다 코틀린 DSL도 온전히 컴파일 시점에 타입이 정해져서 모든 정적 타입 지정 언어의 장점을 얻을 수 있습니다. 영역 특화 언어라는 개념 우리에 가장 친숙한 DSL을 SQL과 정규식입니다. 이런 DSL을 사용하게 되면 범용 언어를 사용하는 경우보다 특정 영역에 대한 연산을 더 간결하게 기술할 수 있습니다. 하지만 범용 애플리케이..
-
10 장 - 애노테이션과 리플랙션Kotlin/코틀린인액션요약 2022. 9. 22. 00:01
10장에서 다루는 내용 애노테이션 적용과 정의 리플렉션을 사용해 실행 시점에 객체 내부 관찰 코틀린 실전 프로젝트 예제 어떤 함수를 호출하려면 그 함수가 정의된 클래스의 이름과 함수 이름, 파라미터 이름등을 알아야 했습니다. 하지만 애노테이션과 리플랙션을 이용하면 그런 제약을 벗어나서 미리 알지 못하는 임의의 클래스를 다룰 수 있습니다. 애너테이션 선언과 적용 코틀린에서는 자바와 같은 방법으로 애노테이션을 사용할 수 있습니다. 예를 들어 JUnit 프레임워크를 사용한다면 테스트 메서드 앞에 @Test 애노테이션을 붙이면 됩니다. 흥미로운 예제로는 @Deprecated 애노테이션입니다. 의미론적으로는 자바와 동일하지만 코틀린에서는 replaceWith 파라미터를 통해 옛버전을 대신할 수 있는 패턴을 제시합..
-
9장 -제네릭스Kotlin/코틀린인액션요약 2022. 9. 20. 00:01
9장에서 다루는 내용 제네릭 함수와 클래스 정의하는 방법 타입 소거와 실체화한 타입 파라미터 선언 지점과 사용 지점 변성 코틀린에서 제네릭 클래스와 함수를 선언하고 사용하는 기본 개념은 자바와 비슷합니다. 실제로 제네릭스가 쓰였던 일부 예제에서도 괴리감이 느껴지지 않았습니다. 제네릭 타입 파라미터 타입 파라미터를 받을 때 받는 타입을 정의할 수 있습니다. 만약 문자열을 담는 리스트를 표현할 때 List 으로 표현합니다. 코틀린 컴파일러는 타입 인자도 추론할 수 있습니다. val authors = listOf("Dmitry", "Svetlana") listOf에 전달된 두 값이 문자열이므로 컴파일러는 List임을 추론합니다. 제네릭 함수와 프로퍼티 fun List.slice(indices: IntRange..
-
8장 - 고차 함수 : 파라미터와 반환 값으로 람다 사용Kotlin/코틀린인액션요약 2022. 9. 19. 00:01
8장에서 다루는 내용 - 함수 타입 - 고차 함수와 코드를 구조화할 때 고차 함수를 사용하는 방법 - 인라인 함수 - 비로컬 return과 레이블 - 무명 함수 고차 함수 정의 고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수입니다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있습니다. 예를 들어 표준 라이브러리 함수인 filter는 술어 함수를 인자로 받으므로 고차 함수입니다. list.filter{x > 0 } 간단한 고차 함수 정의하기 fun twoAndThree (operation : (Int, Int) -> Int){ val result = operation(2,3) println("The result is ${result}") } twoAnddThree{a,b ..