반응형

Kotlin 27

enum class, sealed class

enum class enum class는 enum 예약어로 만들며 클래스 내에 문자열 상수를 열거해 선언합니다. 열거한 상수는 사실 객체이며, 기본으로 name과 ordinal 프로퍼티를 제공합니다. name은 열거 상수의 문자열이며, ordinal은 열거한 순서를 나타내는 인덱스 번호입니다. 열거형 클래스에는 기본으로 열거한 상수 모두를 객체로 가져오는 values() 함수와 인수로 전달한 문자열에 해당하는 열거 상수를 가져오는 valueOf() 함수를 제공합니다. enum class Direction(val no: Int) { NORTH(10), EAST(20), WEST(30), SOUTH(40)//Direction을 상속받는 클래스이므로 상위 클래스의 생성자에 맞추어 호출 } fun main(ar..

Kotlin 2022.03.31

sequence

컬렉션 API 중, map이나 filter 같은 함수는 결과 컬렉션을 즉시 생성합니다. 이것은 즉, 컬렉션 함수를 연쇄하면 매 단계마다 중간 계산 결과를 새로운 컬렉션에 임시로 저장하고 있다는 말입니다. 반면에, 시퀀스(sequence)를 사용하면 중간 임시 컬렉션을 사용하지 않고도 컬렉션 연산을 연쇄할 수 있습니다. sequences 의 여러 단계 처리는 전체 단계가 처리된 결과가 요구됬을 때에 실제 연산이 일어나며 느리게(나중에) 처리됩니다. (executed lazily) 동작 수행의 순서 또한 다릅니다. Sequence 은 각각 하나의 element 에 대해 모든 단계를 수행합니다. Iterable 은 전체 collection 에 대해 각 단계의 수행을 완료하고 다음 단계로 넘어갑니다. 따라서, ..

Kotlin 2022.03.27

collection

Array 클래스 public 생성자가 하나만 있다. 이 생성자는 다음의 두 인자를 받는다. Int 타입의 size init, 즉 (Int) -> T 타입의 람다 val squares = Array(5) { i -> i*i } for( (index, item) in squares.withIndex()) { println("$index" + ": " + "$item") } listOf 변경 불가능한 컬렉션 (읽기 전용) mutableListOf 변경 가능한 컬렉션 (읽기/쓰기 가능) 변경 가능한 컬렉션(리스트, 세트, 맵)이 있을 때 해당 컬렉션의 읽기 전용 버전을 생성하고 싶다. 1. toList (toSet, toMap 메소드 사용) 2. 레퍼런스에 가변 리스트를 할당 빨간색 박스처럼 toList 를 ..

Kotlin 2022.03.27

reduce, fold

Kotlin 컬렉션에는 컬랙션 내의 데이터를 모두 모아 더하는(accumulate) 함수인 reduce()와 fold()가 있다. 사용방법 val numbers = (1..10).toList() // total의 초기값은 numbers[1]로 시작한다. val sumUsingReduce = numbers.reduce {total, num -> total + num } println(sumUsingReduce) // 55 // total의 초기값은 100으로 시작한다. val sumUsingFold = numbers.fold(100) { total, num -> total + num } println(sumUsingFold) // 155 Empty Collection * 컬렉션이 비어있을 가능성이 있다면 ..

Kotlin 2022.03.26

lateinit, lazy

lateinit 코틀린에서는 클래스 멤버내의 프로퍼티 변수는 선언 이후, 반드시 초기화를 하거나 init 블럭 내에서 초기화를 해야 합니다. 초기화 값이 마땅치 않을 때 nullable 타입형태로 null 로 초기화 한 뒤, 실제 데이터로 값을 적용하는 것도 일종의 초기화 방법입니다. 위 방법 대신,, lateinit 키워드를 사용하면 초기화를 미룰 수 있습니다. 하지만, lateinit 을 사용하기 위해서는 다음과 같은 제약이 있습니다. var 로 선언한 프로퍼티에만 사용할 수 있습니다. 클래스 몸체에 선언한 프로퍼티에만 사용할 수 있습니다. (주생성자의 프로퍼티에는 사용할 수 없습니다.) lateinit 사용한 변수는 setter()/getter()를 사용할 수 없습니다. 코틀린에서 기본적으로 제공하..

Kotlin 2022.03.26

Scope 함수(범위 지정 함수 - apply, with, let, also, run)

코틀린의 표준 라이브러리는 다양한 기능 과 편리한 기능으로 함수형 프로그래밍을 쉽게 적용할 수 있도록 도와줍니다. 그중에서도 apply, with, let, also, run 과 같은 범위 지정함수에 대해 알아보겠습니다. 이 5개의 함수는 전달받는 인자와 작동 방식, 결과가 매우 비슷하기 때문에 많은 경우에 서로를 대체 해서 사용할수도 있습니다. 이 함수들은 두가지 구성 요소를 가집니다. 수신 객체 (확장함수가 호출되는 대상이 되는 객체) 수신 객체 지정 람다 (lambda with receiver) apply 사용 규칙 수신 객체 람다 내부에서 수신 객체의 함수를 사용하지 않고 수신 객체 자신을 다시 반환 하려는 경우에 apply 를 사용합니다. 수신 객체 의 프로퍼티 만을 사용하는 대표적인 경우가 객..

Kotlin 2022.03.26

backing field <custom getter(), setter() 설정>

코틀린에서 객체의 프로퍼티에 접근은 변수에 직접 접근하는 것이 아니라 Accessor 메소드(getter & setter)를 통해서 이루어집니다. 프로퍼티를 선언할 때 별도로 getter & setter 메소드를 구현하지 않으면 해당 속성은 디폴트로 정의된 메소드가 생략되어 있습니다. 여기서, 프로퍼티로 이용할 수 있는 변수는 어떤 블록 { } 에도 포함되지 않는 최상위 레벨 변수와 클래스 내부에 선언한 멤버 변수입니다. 최상위 레벨 변수에도 getter or setter 를 적용할 수 있다는 의미입니다. 이때, var은 변경 가능한 속성이기에 getter & setter 메소드를 가질 수 있고, val의 경우 변경 불가능한 속성이기에 setter 메소드 없이 getter 메소드만 가질 수 있습니다. 기..

Kotlin 2022.03.26

val, const val

val 런타임 시 할당 val로 선언한 변수는 코틀린에서 프로퍼티로 get() 함수를 가지는 변수 해당 변수를 직접 변경할 수 없지만 get() 함수의 처리 방식에 따라 의도한 값과 다른 값이 나올 수 있음 즉, 항상 초깃값만 반환하지 않음 const val const val 는 컴파일 시간에 결정되는 상수이다. 런타임에 할당되는 val 와 달리 컴파일 시간 동안 할당이 되어야 한다. 즉, const 는 함수나 어떤 클래스의 생성자에게도 결코 할당 될 수 없고 오직 문자열이나 기본 자료형으로 할당되어야 한다. 때문에 const 로 선언을 하면 클래스의 프로퍼티나 지역변수로 할당 할 수 없게 된다. 때문에 일반적으로 companion object 안에 상수로 선언하게 된다. class Sample { co..

Kotlin 2022.03.25

람다, 고차함수, 함수합성, 클로저

Lambda 식 ? Value 처럼 다룰 수 있는 익명 함수 val lambdaA : returnType = { argument -> body } argument 는 하나일 경우 생략 가능하다. //val lambdaA : (Int) -> Int= { x : Int -> x*2 } val lambdaA : (Int) -> Int= { it*2 } return type 도 compiler가 추론 가능할 경우 생략 가능하다. val square : Int = { x : Int -> x * x } -> val square = { x : Int -> x * x } // 매개변수의 Int 로 타입추론이 가능하다. 고차함수 고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수다. 코틀린에서는 람다나 함수 참..

Kotlin 2022.03.25

NewsFeed - JSoup / Nested RecyclerView

관심있는 뉴스 정보를 매시간마다 서버로 모아 퇴근시에 한번에 보는 어플리케이션을 만들어 보려고 합니다. 서버의 필요성은 현재 찾지 못해서, 현재 시간대의 기사를 검색할 때마다 보여주는 앱으로 만들어 보았습니다. 주요 기능들은 아래와 같습니다. 1. 뉴스 키워드(키워드 최대갯수는 10개??), 뉴스 크롤링 시간(최소 2시간마다??) 설정 화면 (Settings Activity) 2. 뉴스 검색 결과를 parsing 해서 필요 정보(타이틀, URL, 뉴스시간정보 등)를 수집 3. 위에서 수집한 정보를 서버에 post 4. 서버에 post 한 결과를 가져와서 보여주는 화면 (NewsViewer Activity) --> 서버가 과연 필요한 것인가?? 뉴스가 시간별로 크게 달라질 것 같지는 않은데,, 고민해보겠습..

Kotlin 2022.03.16

3. Android - Location post service (feat. Alarm)

설정한 시간을 주기로 현재 위치를 서버로 post하는 어플리케이션을 생성하겠습니다. 아래 순서대로 해 보겠습니다. - 저장 주기 설정 - 알람 등록 - 현재 위치와 현재 시간 가져오기 - 저장 주기마다 값을 서버에 POST 하기 기본적인 UI는 안드로이드의 preference UI를 이용해서 서비스의 시작 시간과 제어 시간, 중심 위치등을 설정할 수 있게 합니다. 저장 주기 설정 TimePickerPreference를 설정합니다. TimePickerPreferenceDialog를 생성합니다. class TimePickerPreferenceDialog : PreferenceDialogFragmentCompat() { lateinit var mTimePicker: TimePicker override fun ..

Kotlin 2022.03.01

2. Android - JPA Client with location DB

지난 서버측 포스팅에 이어 클라이언트가 되는 안드로이드에서 값을 주기적으로 저장하고, 저장된 정보를 읽어와서 지도화면에 시간별로 출력해 보겠습니다. 개발에 필요한 내용 정리 1. 값 생성하기 현재 위치와 현재 시간 가져오기 저장 주기 설정 저장 주기마다 값을 서버에 POST 하기 2. 값 읽어오기 서버의 저장된 DB값을 ReadAll > RecyclerView로 list-up Item 선택시 지도로 보여주기 Item 복수 선택시 시간순서대로 이동 경로 보여주기 (화살표 등으로 표현) 전체 삭제하기 3. 확장판 저장하는 App(client1)에서는 백그라운드 서비스로 동작함 (ex. 자녀폰) 동작시키는 App(client2)에서는 client1을 on/off 하거나 설정을 변경할 수 있음 (ex. 부모폰)..

Kotlin 2022.03.01
반응형