코틀린 & 컴포즈 & Java 57

[kotlin] mapTo

mapTo https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map-to.html mapTo - Kotlin Programming Language kotlinlang.org inline fun Array.mapTo( destination: C, transform: (T) -> R ): C collection 프레임워크 사용시 각 element의 변형을 거쳐 다른 collection에 쉽게 복사할 수 있는 함수 나는 filter를 걸어서 원하는 타입의 뷰중에 데이터만 리스트로 뽑았다.(헤더에 data는 null이라서) 참조 : https://skytitan.tistory.com/180

delegated property 프로퍼티 접근자 로직 재활용

프로퍼티 접근자 로직 재활용 위임 프로퍼티(delegated property) 값을 뒷받침하는 필드에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현할 수 있다. 프로퍼티는 위임을 사용해 자신의 값을 필드가 아니라 데이터베이스 테이블이나 브라우저 세션, 맵 등에 저장할 수 있다. 위임은 객체가 직접 작업을 수행하지 않고 다른 도우미 객체가 그 작업을 처리하게 맡기는 디자인 패턴을 말한다. 이때 작업을 처리하는 도우미 객체를 위임 객체라고 부른다. class Delegate { operator fun getValue(...) {...} //getValue는 게터를 구현하는 로직을 담는다. operator fun setValue(..., value: Type) {...} // set..

Kotlin 구조 분해 선언과 component 함수(Pair, Triple)

구조 분해 선언과 component 함수 구조 분해 선언(destructuring declaration) >>> val p = Point(10, 20) >>> val (x, y) = p // x와 y 변수를 선언한 다음에 p와 여러 컴포넌트로 초기화 >>> println(x) 10 >>> println(y) 20 구조 분해 선언의 각 변수를 초기화하기 위해 componentN 이라는 함수를 호출한다. class Point(val x: Int, val y: Int){ operator fun component1() = x operator fun component2() = y } 여러 값을 한꺼번에 반환해야 하는 함수는 구조 분해 선언 구문을 사용하면 쉽게 풀어서 여러 변수를 넣을 수있다. //값을 저장하기 ..

Kotlin 범위 관례 인덱스로 원소 접근 Get, Set

범위 관례 인덱스로 원소 접근 Get, Set 콜렉션에서 가장 많이 쓰이는 연산은 인덱스를 이용해 읽고 쓰는 연산 자바에서 배열 원소에 접근할때 [ ] 를 사용하는 것처럼 코틀린의 맵에서도 이를 사용한다. callbackParamMap["success"] = true /** * Allows to use the index operator for storing values in a mutable map. */ @kotlin.internal.InlineOnly public inline operator fun MutableMap.set(key: K, value: V): Unit { put(key, value) } class ExampleUnitTest { @Test fun test() { val list = m..

Kotlin == 비교연산자 오버로딩

비교연산자 오버로딩 equals, compareTo 대신 Kotlin 에서는 == 비교 연산자를 사용할 수 있음 equals == 연산자는 equals 메서드 호출로 컴파일된다. a==b → a?.equals(b) ?: (b==null) val USE_KAKAO_ACCOUNT_LOGIN = env.name == "DEV" // Decompiled static { USE_KAKAO_ACCOUNT_LOGIN = Intrinsics.areEqual(env.name(), "DEV"); } // ---------------------------------- val USE_KAKAO_ACCOUNT_LOGIN = env.name === "DEV" // Decompiled 하면? env.name == "DEV" htt..

Kotlin Plus 산술연산자 오버로딩

연산자 오버로딩 & 기타 관례 코틀린이 지원하는 여러 관례(컨벤션)와 관례의 사용법 코틀린은 자바클래스를 사용하고 있음. 따라서 자바가 특정 인터페이스를 구현하게 할수는 없음 따라서 확장함수를 통해 기존클래스에 새로운 메서드를 추가한다. 이를 통해 기존 자바코드를 바꾸지 않고도 새로운 기능을 부여할수 있다. StringsJVM.kt (kotlin-stdlib) /** * Returns `true` if this string is equal to[other], optionally ignoring character case. * * Two strings are considered to be equal if they have the same length and the same character at the s..

코틀린 원시타입(Kotlin Primitive Type)

코틀린 원시타입원시 타입(Primitive type) : 값이 들어감참조 타입(Reference type) : 객체 위치 값정수의 Collection을 정의하고 싶다자바 : Collection // 원시 타입 값을 감쌀 래퍼 타입을 사용해서 참조 타입을 만듬코틀린 Collection // 원시 타입과 래퍼 타입 구분 없음원시 타입과 참조 타입이 같다면 코틀린은 항상 객체로 표현하나? 놉 효율적인 방식으로 표현됨. 코틀린 Int → 자바 int로 컴파일 자바 원시 타입은 null이 안됨. 따라서 코틀린 int? 경우 자바 Integer로 됨. int aa = null x Integer aa = null o 제네릭 클래스에서 사용하는 경우에는 자바 Integer로 됨. JVM은 제네릭의 타입 인자로 원시 타..

코틀린 타입 종류 Null가능성

타입 시스템코틀린의 타입 시스템은 코드의 가독성을 향상시키는데 도움이되는 몇가지 특성을 새로 제공널 가능성 (nullability)NullPointerException오류를 피할 수 있게 돕기 위한 코틀린 타입 시스템의 특성null에 대한 접근 방법을 실행시점 → 컴파일 시점널이 될 수 있는 타입 (nullable type)타입 시스템이 널이 될수 있는 타입을 명시적으로 지원타입 이름 뒤에 물음표(?)를 명시fun strLenSafe(s: String?) = ... null과 비교하고 나면 컴파일러는 그 사실을 기억하고, 해당 값을 널이 될 수 없는 타입의 값처럼 사용할 수 있다.fun strLenSafe(s: String?) : Int = if(s != null) s.length else 0 자바에서 ..

[Kotlin] 스코프 펑션(Scoepe Function)

스코프 펑션(Scoepe Function) 선택기준스콥펑션은 크게 두가지 기준으로 나눈다.Context Object를 참조하는 방법 (this, it)Return valuelet객체 결과값에 하나 이상의 함수를 호출하는 경우 사용긴 변수명 대신 it 으로 받을수 있다는 장점이 있음. 다만 이경우 run 이 더 좋을수 있음nullable 한 객체에 대해서 unpack 할수 있어 safety call 을 할수 있음runlet과 유사하나 this 로 받는다는 점이 다르다.this 로 받기때문에 context object 를 생략가능해서 간결해진다.let 과 마찬가지로 nullable 객체에 대한 safety call 할수 있다.withrun 처럼 this 로 받는다.run 처럼 safety call 할수 없어..

[Kotlin] 람다에 대해 알아보자(2)

5-3 지연 계산(lazy) 컬렉션 연산map,filter와 같은 컬렉션은 결과 컬렉션을 즉시(eagerly) 생성 시퀀스(sequence)를 사용하면 중간 임시 컬렉션을 사용하지않고도 컬렉션 연산을 연쇄WHAT?????/** * Returns a list containing only elements matching the given [predicate]. * * @sample samples.collections.Collections.Filtering.filter */ public inline fun Iterable.filter(predicate: (T) -> Boolean): List { return filterTo(ArrayList(), predicate) } /** * Returns a list c..