본문 바로가기

Kotlin8

[이펙티브 코틀린] 4장 추상화 설계 추상화는 복잡성을 숨기기 위해 사용되는 단순한 형식을 의미합니다. 대표적인 예로 인터페이스가 있습니다. 인터페이스는 클래스라는 복잡한 것에서 메서드와 프로퍼티만 추출해서 간단하게 만들었으므로, 클래스의 추상화라고 할 수 있습니다. 어떤 대상(객체)에 대한 추상화는 여러 가지가 나올 수 있습니다. 객체는 여러 행태로 추상화해서 표현할 수 있습니다. 프로그래밍에서의 추상화 추상화를 설계한다는 것은 단순하게 모듈 또는 라이브러리로 분리한다는 의미가 아닙니다. 함수를 정의할 때는 그 구현을 함수 시그니처 뒤에 숨기게 되는데, 이것이 바로 추상화입니다. 아이템 26. 함수 내부의 추상화 레벨을 통일하라 컴퓨터 과학이 높은 레벨과 낮은 레벨을 확실하게 구분하고 있는 것처럼, 함수도 높은 레벨과 낮은 레벨을 구분해서.. 2023. 7. 5.
[이펙티브 코틀린] 3장 재사용성 아이템 19. knowledge를 반복하여 사용하지 말라 "프로젝트에서 이미 있던 코드를 복사해서 붙여넣고 있다면, 무언가가 잘못된 것이다." 우리 프로그램에서 중요한 knowledge를 크게 두 가지 뽑는다면, 다음과 같습니다. 1. 로직 (logic): 프로그램이 어떠한 식으로 동작하는지와 프로그램이 어떻게 보이는지 2. 공통 알고리즘 (Common Algorithm): 원하는 동작을 하기 위한 알고리즘 둘의 가장 큰 차이점은 시간에 따른 변화입니다. 비즈니스 로젝은 시간이 지나면서 계속해서 변하지만, 공통 알고리즘은 한 번 정의된 이후에는 크게 변하지 않습니다. 물론 공통 알고리즘을 최적화를 하거나, 같은 카테고리의 더 빠른 알고리즘으로 바꿀 수도 있지만, 동작은 크게 변하지 않습니다. 핵심은 프로.. 2023. 6. 18.
[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] 문자열 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] 데이터 클래스 (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.
[Kotlin] Enum Class와 Sealed class Enum Class: Enumerated Type 열거형의 준말로 class 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고 그 중 하나의 상태를 선택해 나타내는 방식입니다. 1. enum class 안에는 상수를 나타내는 대문자로 나타냅니다. enum class Color { RED, BLUE, GREEN } 2. Enum의 객체들은 고유한 속성을 가질 수 있다. enum class Color (val red: Int, val green: Int, val blue: Int) { RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255) } 3. 일반 클래스처럼 함수도 선언 가능하다. enum class Color (val red: Int, val green.. 2022. 8. 1.