본문 바로가기

코틀린

(34)
코틀린(Kotlin) - 지연 계산(lazy) 컬렉션 연산 : Sequence 컬렉션 API 중, map이나 filter 같은 함수는 결과 컬렉션을 즉시 생성합니다. 이것은 즉, 컬렉션 함수를 연쇄하면 매 단계마다 중간 계산 결과를 새로운 컬렉션에 임시로 저장하고 있다는 말입니다. 반면에, 시퀀스(sequence)를 사용하면 중간 임시 컬렉션을 사용하지 않고도 컬렉션 연산을 연쇄할 수 있습니다. 간단한 예로, 성이 '김'씨인 사람만 추려내는 예제를 살펴보도록 하겠습니다. /* 김씨인 사람만 추리기 */ people.map(Person::name).filter { it.startsWith("김") } 코틀린 레퍼런스 문서에는 filter와 map이 리스트를 반환한다고 명시되어 있는데요, 이 말은 이 연쇄 호출이 리스트를 총 2개 만든다는 것을 알 수 있습니다. 한 리스트는 map의 ..
코틀린(Kotlin) - 컬렉션 API : filter, map, all, any, count, find, groupBy, flatMap, flatten 람다 함수형 프로그래밍은 컬렉션(Collection)을 다룰 때 상당히 편리하고 막강합니다. 대부분의 작업에 라이브러리 함수를 활용할 수 있고, 그로 인해 코드를 아주 간결하게 만들 수 있습니다. 그러므로 이번에는, 컬렉션을 다루는 코틀린 표준 라이브러리들을 살펴보도록 하겠습니다. 참고로, 코틀린에서 제공하는 컬렉션 API는 새롭게 추가된 것이 아닌, 기존의 java, C#, 그루비, 스칼라 등 람다를 지원하는 대부분의 언어에서 사용하는 것들과 동일합니다. 필수적인 함수 : filter, map filter와 map은 컬렉션을 활용할 때 기반이 되는 함수로, 대부분의 컬렉션 연산을 이 두 함수를 통해 표현할 수 있습니다. filter filter 함수는 컬렉션을 iteration 하면서 주어진 람다에 각..
코틀린(Kotlin) - 초간단 파일 저장 방법! fun saveFile(inputStream: InputStream, filePath: String) { //저장할 파일 val saveFile = File(filePath) saveFile.outputStream().use { fileOutput -> inputStream.copyTo(fileOutput) } } 기존에 루프(Loop)를 돌면서 버퍼를 읽는 방식 대신, 코틀린에서 지원하는 copyTo() 기능으로 아주 간편하게 바이트를 복사할 수 있고, use() 함수가 I/O resource를 자동으로 관리해주기 때문에, 초간단하게 파일 저장 코드를 구현할 수가 있습니다! 확장 함수를 이용해서, 더 멋지게 만들기! 코틀린에는 마치 기존 클래스에 구현된 기능인 것처럼 추가적인 함수를 커스텀하여 사용할 ..
코틀린(Kotlin) - 람다 식과 멤버 참조 코틀린의 람다는 자바8의 람다식과 개념이 매우 비슷합니다. 람다를 쉽게 설명하자면, 값처럼 여기저기 전달할 수 있는 동작의 모음(?)이라고 할 수 있습니다. 기본적으로 람다식은 자바8부터 사용이 가능하고, 안드로이드에서 제대로 된 Functional Interface를 사용하려면 N(Nougat 7.0) OS 이상이어야만 합니다. 하지만, 코틀린에서는 이런 제한과 상관없이 람다식을 사용할 수 있다는게 큰 장점이지 아닐까 싶습니다. 추가로, 람다식은 기본적으로 편리한 Lambda API들을 제공하기 때문에, 안드로이드 스튜디오에서 개발할 때 자동완성 기능을 이용해서 먼저 해당 API를 살펴본다면, 훨씬 더 간결하고 직관적인 코드를 짤 수 있을 것 같습니다. 람다 소개 : 코드 블록을 함수 인자로 넘기기 "..
코틀린(Kotlin) - object 키워드 : 싱글톤, static 멤버, 객체 식 선언 코틀린에서는 "object" 키워드를 다양한 상황에서 사용하지만 그 상황마다의 공통점이, 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다는 점입니다. 이러한 object 키워드를 사용하는 여러 상황을 살펴보도록 하겠습니다. 객체 선언 : 싱글톤 쉽게 만들기 (object) 객체지향 프로그래밍을 설계하다 보면, 인스턴스가 하나만 필요한 클래스의 유용한 경우가 많습니다. 자바에서는 다음과 같이, 보통 클래스의 생성자를 private으로 선언하고, static 변수에 클래스 객체를 저장하는 패턴으로 구현합니다. /** 자바에서의 일반적인 싱글톤 패턴 */ public class DataRepository { private static DataRepository INSTANCE; private DataRe..
코틀린(Kotlin) - 데이터 클래스와 클래스 위임(by) 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드 할 수 있고, 코틀린은 이런 메소드 구현을 자동으로 생성해줄 수 있습니다. 데이터 클래스 어떤 클래스에 대해 toString, equals, hashCode를 수행하려면 반드시 오버라이드해야 합니다. 다행히도 인텔리J IDE는 자동으로 이런 메소드를 정의해주기도 합니다. 하지만, 코틀린은 더 편리합니다! 이제 이런 메소드를 IDE를 통해 생성할 필요도 없이 "data" 라는 키워드를 클래스 앞에 붙이면 위와 같이 필요한 메소드들을 컴파일러가 자동으로 만들어줍니다! 이렇게 "data" 가 붙은 클래스를 "데이터 클래스" 라고 부릅니다. /** Client를 데이터 클래스로 선언하기 */ data class C..
코틀린(Kotlin) - 생성자와 프로퍼티를 갖는 클래스 선언 자바에서는 생성자를 하나 이상 선언할 수 있고, 코틀린도 비슷하지만 한 가지 바뀐 부분이 있습니다. 코틀린은 주생성자(primary, 클래스 본문 밖에서 정의)와 부생성자(secondary, 클래스 본문 안에서 정의)로 구분됩니다. 또한, 코틀린에서는 초기화 블록(init block)을 통해 초기화 로직을 추가할 수 있습니다. 클래스 초기화 : 주 생성자와 초기화 블록 class User(val name: String) 보통 클래스의 모든 선언은 중괄호{} 사이에 들어가지만, 이 클래스의 선언에는 중괄호가 없고 괄호 사이에 val 선언만 존재합니다. 이렇게 클래스 이름 뒤에 오는 괄호에 들어가는 코드를 주생성자(primary constructor) 라고 부릅니다. 주생성자는 생성자 파라미터를 지정하고, ..
코틀린(Kotlin)의 Scope Function(let, with, run, apply, also) 정리 Scope Function 이라는 함수명에서 알 수 있듯이, 이 함수들을 람다식을 이용해서 호출하면 일시적인 Scope(범위)가 생기게 되고, 이 범위 안에서는 전달된 객체에 대해 "it" 또는 "this" 라는 Context Object를 통해서 접근하게 됩니다. 두 가지 차이점 Scope Function에는 서로 다른 두 가지 주요 차이점이 있습니다. - Context Object를 참조하는 방법 (this, it) - Return value Context Object: this or it Scope Function 람다식 내에서 Context Object는 실제 객체명 대신, "it" 또는 "this" 키워드로 접근하게 됩니다. class Person (var name: String, var age..