반응형

분류 전체보기 108

생성자 (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

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
반응형