본문 바로가기

Kotlin13

GSON과 코틀린을 쓰면서 생겼던 일 (nonnull인데 왜 null 값이 들어갔지?) 배경 Retrofit과 GsonConverter를 사용해서 json을 해당 kotlin data class로 변환하는 작업을 진행했습니다. 분명 data class에서는 불변객체로서 선언되어 있는 프로퍼티를 사용했지만 NullPointerException이 발생하는 것을 확인할 수 있었습니다. 그래서 이 원인을 파악해보고자 내부 구조를 확인해봤습니다. 코드 구성 코드는 간단하게 Gson을 사용해서 다음과 같이 구성했습니다. data class TestData( val a: Int, val b: String, val c: Float ) class GsonTest { @Test fun test() { val str = """{"a":1, "b": null}""" val testData = Gson().fro.. 2024. 4. 16.
[Kotlin] != null과 ?.let 퍼포먼스 차이가 있을까? 공부배경 코틀린을 사용하다보면 null체크를 스코프함수인 let을 통해 간편하게 체크하곤 합니다. 하지만 문득 if로 비교하는 것과 ?.let으로 비교하는 것에 차이는 없는 것일까 확인해보고 싶어서 각 코드를 바이트코드로 변환하여 비교해보고자 합니다. 바이트 코드 명령어 우선 바이트코드 변환에 앞서 명령어들이 어떤 의미를 가지는지 간단히 정리하겠습니다. aload : local variable 을 stack 에 push 한다 ldc : constant pool 에서부터 #index 에 해당하는 데이터를 가져온다 astore : local variable 에 값을 저장한다. invokespecial : instance Method 를 호출하고 결과를 stack 에 push한다. new : 새로운 객체를 생.. 2023. 2. 6.
[Kotlin] filter, map 호출 순서에 따른 성능 차이 이번에 filter와 map의 호출 순서에 따른 성능차이를 확인해보려고 합니다. map, filter VS filter, map 먼저 사용될 data class를 정의합니다. data class Food( val name: String, val price: Int ) 1. map() 함수를 수행한 뒤, filter() 함수를 수행한다. fun main() { val list = listOf( Food("chicken", 20000), Food("pizza", 25000), Food("sushi", 21000), Food("coffee", 5500), Food("beer", 3800) ) val result = list.map(::mapToName) .filter(::filterByPrice) print(.. 2023. 2. 3.
[Kotlin] Collection 관련 함수들 (filter, map, flatmap) filter 주어진 람다의 조건을 만족하는 원소만 필터링하는 기능입니다. List와 Set을 필터링하는 경우에는 List로, Map을 필터링하는 경우에는 Map으로 반환합니다. filter 함수는 요소의 값만 확인할 수 있습니다. val list = listOf("A", "B", "C") val newList = list.filter { it != "A" } println(newList) // input: [A, B, C] // Result: [B, C] map 각 원소를 원하는 형태로 변환해서 새 컬렉션을 만듭니다. 새로 만들어지는 컬렉션은 원본 컬렉션과 원소의 개수는 같지만 각 원소는 주어진 람다(함수)에 따라 변환됩니다. val list = listOf("A", "B", "C") val newLis.. 2023. 2. 3.
[프로그래머스][Kotlin] 로또의 최고 순위와 최저 순위 문제 설명 로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 로또의 순위를 정하는 방식입니다. 1 6개 번호가 모두 일치 2 5개 번호가 일치 3 4개 번호가 일치 4 3개 번호가 일치 5 2개 번호가 일치 6(낙첨) 그 외 로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다. 알아볼 수 없는 번호를 0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가 44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가 31.. 2022. 8. 5.
[프로그래머스][Kotlin] 괄호 변환 - 2020 KAKAO BLIND RECRUITMENT 문제 설명 '(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다. 그리고 여기에 '('와 ')'의 괄호의 짝도 모두 맞을 경우에는 이를 올바른 괄호 문자열이라고 부릅니다. 예를 들어, "(()))("와 같은 문자열은 "균형잡힌 괄호 문자열" 이지만 "올바른 괄호 문자열"은 아닙니다. 반면에 "(())()"와 같은 문자열은 "균형잡힌 괄호 문자열" 이면서 동시에 "올바른 괄호 문자열" 입니다. '(' 와 ')' 로만 이루어진 문자열 w가 "균형잡힌 괄호 문자열" 이라면 다음과 같은 과정을 통해 "올바른 괄호 문자열"로 변환할 수 있습니다. 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 2. 문자열 w를 두 "균형.. 2022. 8. 1.
[Kotlin] 문자열 Count 하기 Java에서 문자열 Count 하는 방법은 굉장히 귀찮았습니다. 재귀, 반복문 등등 물론 lambda식을 활용하여 구현할 수도 있었지만 굉장히 코드가 길었습니다. 반대로 Kotlin에서는 간단하게 해결할 수 있습니다. fun main() { val str = "hello my name is JGeun" println(str.count{it == 'l'}) // result: 2 } 2022. 8. 1.
[프로그래머스][Kotlin] 오픈채팅방 - 2019 KAKAO BLIND RECRUITMENT 문제 설명 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. "[닉네임]님이 들어왔습니다." 채팅방에서 누군가 나가면 다음 메시지가 출력된다. "[닉네임]님이 나갔습니다." 채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다. 채팅방에서 닉네임을 변경한다. 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다. 예를 들어, 채팅방.. 2022. 8. 1.
[Kotlin] 데이터 클래스 (Data class) 데이터 클래스 (Data class)는 데이터를 다루는 데에 최적화된 class 로 '5가지 기능'을 내부적으로 제공합니다. 1. 내용의 동일성을 판단하는 equals() 의 자동 구현 2. 객체의 내용에서 고유한 코드를 생성하는 hashcode()의 자동구현 3. 포함된 속성을 보기쉽게 나타내는 toString()의 자동구현 4. 객체를 복사하여 똑같은 내용의 새 객체를 만드는 copy()의 자동구현 -> 아무 패러미터가 없다면 똑같은 내용으로 생성 (아무 패러미터가 없다면 똑같은 내용으로, 있다면 해당 패러미터를 교체하여 생성합니다) fun main() { val a = Person("철수", 24) val a_compare = Person("철수", 24) println(a == a_compare).. 2022. 8. 1.