반응형

Kotlin 27

제네릭

제네릭이란 형식 타입 혹은 임의 타입입니다. 자바나 코틀린 같은 대부분 프로그래밍 언어는 변수(혹은 객체) 타입을 명확하게 선언해야 합니다. String, Int 등의 타입을 명시해야 하는데, 때로는 클래스, 함수, 변수 등을 선언할 때 타입을 예측할 수 없거나 하나의 타입으로 고정할 수 없는 경우가 있습니다. 그렇다고 타입을 선언하지 않을 수는 없습니다. 이때 사용하는 것이 제네릭입니다. 클래스나 함수, 변수 등을 선언할 때 제네릭으로 형식타입을 선언하고, 실제 이용할 때 정확한 타입을 부여합니다. 제네릭을 가장 쉽게 볼 수 있는 곳이 컬렉션 타입입니다. val array = arrayOf("Kim", 10, true) 배열에 대입하는 데이터 타입은 문자열이나 숫자 등 다양할 수 있습니다. 그런데, 코..

Kotlin 2022.05.08

data class

data class 란 특별한 로직의 함수 없이 데이터만 포함할 수 있는 VO(Value-Object) class 를 의미합니다. data class는 다음의 조건에 맞게 선언해야 합니다. 주 생성자(primary constructor)를 선언해야 하며, 주 생성자의 매개변수는 최소 하나 이상이어야 한다. 모든 주 생성자의 매개변수는 var 혹은 val 로 선언해야 한다. data class는 abstract, open, sealed, inner 등의 예약어를 추가할 수 없다. 위 조건에 맞지 않는 경우의 예를 보겠습니다. data class 가 유용한 것은 data class 에 선언한 데이터와 관련된 다양한 기능을 함수로 자동으로 제공하기 때문입니다. equals() / hashCode() --> A..

Kotlin 2022.05.06

연산자 함수, 오버로딩

코틀린에서는 연산자(단항 연산자, 증감 연산자, 산순연산자, in 연산자, 인덱스 접근 연산자, 호출 연산자, 복합 대입 연산자, 논리 연산자, 비교 연산자 등)마다 대응하는 함수가 있습니다. 연산자 대응하는 메소드 주의사항 +x x.unaryPlus() -x x.unaryMinus() !x x.not() x + y x.plus(y) x - y x.minus(y) x * y x.times(y) x / y x.div(y) x % y x.rem(y) ++x x.inc() x는 할당 가능해야 함 x++ x.inc() x는 할당 가능해야 함 --x x.dec() x는 할당 가능해야 함 x-- x.dec() x는 할당 가능해야 함 x == y x.equals(y) x != y !(x.equals(y)) x < y..

Kotlin 2022.05.05

위임자 Delegates (observable, vetoable )

디자인 패턴에서 Delegate Pattern이란 어떠한 기능을 자기 자신이 처리하지 않고 다른 객체에 일을 위임시켜 그 객체가 일을 처리하게끔 하는 것입니다. 코틀린의 Delegates를 활용하면 여러 가지 일을 간단하게 처리할 수가 있습니다. observable 프로퍼티 값이 변경되는 순간을 감지하는 방법이 있습니다. 코틀린에서는 프로퍼티 값이 변경되는 순간, 개발자가 준비한 코드를 실행 할 수 있습니다. Delegates.observable() 코드를 보면 initialValue와 onChange 함수를 인자로 사용됩니다. public inline fun observable(initialValue: T, crossinline onChange: (property: KProperty, oldValue:..

Kotlin 2022.05.05

전개 연산자 *

코틀린에서는 배열 데이터를 단순 나열할 때 사용하는 전개연산자가 있습니다. 아래와 같이 사이즈가 10인 배열이 있고, 각 배열의 값을 array0[index] 값으로 하나씩 옮겨닮을 때 사용됩니다. val array0 = Array(10) { it -> it * 2 } val list0 = listOf(*array0) print(list0) 출력값 : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 전개 연산자를 사용자 정의 함수에 사용할 수 있습니다. 전개 연산자로 호출할 함수는 매개변수를 vararg로 선언해야 합니다. 함수 정의 fun printArray(vararg a:Any) { val iterator = a.iterator() while(iterator.hasNext()) { ..

Kotlin 2022.05.05

생성자 (constructor)

코틀린은 주생성자(primary constructor)와 부생성자(secondary constructor)로 구분합니다. 초기화 블럭을 통해 초기화 로직을 추가할 수도 있습니다. 주 생성자 : 주로 사용하는 간략한 생성자로, 클래스 본문 밖에서 정의 부 생성자 : 클래스 본문 안에서 정의 주 생성자 클래스 초기화: 주생성자와 초기화 블록 class User(val nickname: String) 이렇게 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 주 생성자(primary constructor)라고 부릅니다. 사실, 괄호 앞에 constructor keyword 가 생략되었습니다. 주 생성자는 생성자 파라미터를 지정하고, 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의하는 두 가지 목적에 쓰입니다...

Kotlin 2022.04.30

생성자 역할을 하는 Factory 함수

객체를 만드는 일반적인 방법은 생성자를 사용하는 방법이지만, 팩토리 패턴을 이용한 객체를 생성할 수도 있습니다. 팩토리 매소드 패턴? 생성자로 직접 객체를 생성하는 것이 아니라, 메소드를 통해 객체를 생성하는 코딩 패턴 fun makeListView(config: Config) : ListView { val items = return ListView(config)// 오후9시) 야간타임 라이더 = new 야간타임("김찬정") else println("야간타임 라이더 생성불가") ... 다양한 타입의 라이더객체를 생성할 경우 분기 처리가 필요하며 야간타임 라이더 객체는 오후 9시 이후만 생성 할 수 있습니다.(객체성성 조건 로직) 다음은 팩토리 메소드 패턴을 적용한 예시입니다. 라이더생성(타입) 라이더 라..

Kotlin 2022.04.30

FrameLayout size/margin 동적변경

FrameLayout 의 layout size를 코드상에서 동적으로 변경해야 할 때가 있습니다. 아래와 같이 FrameLayout 이 TextView 등으로 구성되어 있는데, 해당 값이 비어 있는 경우 layout의 높이를 수정해야 합니다. 아래와 같이 빈 공간이 보여 부자연 스럽게 됩니다. 코드 상에서 아래와 같이 수정을 해 줍니다. 하드 코딩된 값은 layout.xml 에 정의된 값을 불러주어 하나의 리소스로 관리해야 합니다. val width = frameLayout.layoutParams.width val marginLeft = frameLayout.marginLeft val marginRight = frameLayout.marginRight val marginTop = frameLayout.ma..

Kotlin 2022.04.24

SubsamplingScaleImageView

SubsamplingScaleImageView는 Image Zoom in/out 이 가능한 라이브러리입니다. 이전에 포스팅한 NewsFeed 앱에서 주식차트를 넣어주다보니 해당 기능이 필요해서 포스팅합니다. https://kakaroo.tistory.com/57 NewsFeed - JSoup / Nested RecyclerView 관심있는 뉴스 정보를 매시간마다 서버로 모아 퇴근시에 한번에 보는 어플리케이션을 만들어 보려고 합니다. 서버의 필요성은 현재 찾지 못해서, 현재 시간대의 기사를 검색할 때마다 보여주는 kakaroo.tistory.com 먼저, 라이브러리를 사용할 수 있게 build.gradle에 추가해 줍니다. //image view 확대 implementation 'com.davemorris..

Kotlin 2022.04.23

object, companion object

보통, 클래스로부터 생성되는 객체(서로 연관 있는 변수(속성) 들을 묶어놓은 데이터 덩어리)는 heap에 저장이 됩니다. 객체를 참조하는 변수는 stack 영역에 생성되어 그 객체의 주소를 가지고 있습니다. val d1 = MyClass() //MyClass 객체는 Heap 영역에 생성되고, stack 영역에 변수 d1에 대한 메모리를 확보하고, MyClass 의 주소를 갖게 됩니다. Stack 영역은 컴파일 시점에 크기가 결정되는 영역 (매개변수, 지역변수 등), Heap 영역은 런타임에 크기가 결정되는 영역이다. (동적할당, 객체 등) object 키워드에 대해 알아 보겠습니다. 익명 객체 //object 키워드가 우변에 있을 경우 익명객체 //MyFunc 함수 호출시에 heap에 생성되었다가 함수가..

Kotlin 2022.04.15

확장함수 (Extension Function)

Java에서는 상속해서 overriding을 통해 함수를 재정의해서 사용하였습니다. 코틀린에서는 상속을 통한 확장과는 다른 방법으로 클래스를 확장합니다. fun 클래스이름.메소드이름(매개변수...) { //확장하게 되는 클래스를 receiver type 이라고 한다. // this 로 받을 수 있다. 이를 receiver object 라고 한다. } fun main(args: Array) { val l = mutableListOf(1, 2, 3) l.swap(1,2) } fun MutableList.swap(index1 : Int, index2 : Int) { val tmp = this[index1] this[index1] = this[index2] this[index2] = tmp } 타입을 Gener..

Kotlin 2022.04.14

코루틴(Coroutine)

코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴입니다. 코루틴은 Kotlin 버전 1.3에 추가되었으며 다른 언어에서 확립된 개념을 기반으로 합니다. https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html kotlinlang.org 기능 코루틴은 Android의 비동기 프로그래밍에 권장되는 솔루션입니다. 주목할 만한 기능은 다음과 같습니다. 경량: 코루틴을 실행 중인 스레드를 차단하지 않는 정지를 지원하므로 단일 스레드에서 많은 코루틴을 실행할 수 있습니다. 정지는 많은 동시 작업을 지원하면서도 차단보다 메모리를 절약합니다. 메모리 누수 감소: 구조화된 동시 실행을 사용하여..

Kotlin 2022.04.03

BlogViewer (feat. JSoup Crawling)

Tistroy 에 게시된 글을 crawling 을 통해 cardview 형태로 만들어보겠습니다. 전체적인 UI는 아래 게시글을 재사용하겠습니다. https://kakaroo.tistory.com/57 NewsFeed - JSoup / Nested RecyclerView 관심있는 뉴스 정보를 매시간마다 서버로 모아 퇴근시에 한번에 보는 어플리케이션을 만들어 보려고 합니다. 서버의 필요성은 현재 찾지 못해서, 현재 시간대의 기사를 검색할 때마다 보여주는 kakaroo.tistory.com Tistory 게시글의 소스는 아래와 같습니다. HTML 삽입 미리보기할 수 없는 소스 Viewer에 구성될 요소들은 카테고리, 카테고리 URL, 게시글 제목, 게시글 날짜, 게시글 URL, 게시글 본문 입니다. 티스토리의..

Kotlin 2022.04.03

inline 함수

인라인(inline) 키워드는 자바에서는 제공하지 않는 코틀린만의 키워드입니다. 이러한 인라인 키워드를 이용하여 함수를 만들고 이를 잘 활용한다면 다양한 이득을 얻을 수 있는 경우가 있습니다. 하나씩 알아보도록 하겠습니다. A 함수에서 B 함수를 호출하면 B 함수로 진입하게 됩니다. 이때, A 함수에서 B 함수로 넘어가면서 발생하는 오버헤드가 있습니다. 이 과정은 큰 힘을 들이지는 않지만, 경우에 따라서는 속도에 유의미한 영향을 끼치기도 합니다. 아래 함수를 살펴보겠습니다. main 함수 -> sum 함수 -> main 함수 -> sum 함수 -> ... 이런식으로 오버헤드가 발생합니다. 함수 선언 앞에 inline 키워드를 붙이면 컴파일 될 때 해당 함수 코드가 호출되는 곳에 복사가 됩니다. for 문..

Kotlin 2022.04.01
반응형