[코틀린으로 배우는 함수형 프로그래밍] 2장 7-11 에 해당하는 코틀린 문법에 대한 내용입니다.

출처: https://blog.insightbook.co.kr/2019/12/12/%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/

2.7 객체분해(destructuring declaration)

위의 문법에서 User 인스턴스의 값을 name, age 로 객체 분해를 합니다.

만약 일부만 변수로 할당하고 나머지는 무시하고 싶다면 언더스코어(‘_’)를 사용합니다. ex) val (name, _ ) = User(“흄즈", 33)

for문을 이용하여 리스트를 객체 분해할 수 도 있습니다.

map1 의 경우 저장된 키와 값을 name, order에 할당했습니다. 코틀린에서 객체 분해가 가능한 이유는 내부적으로 선언된 componentN 함수가 객체 분해시 사용되기 때문입니다. map의 경우 component1이 key, component2가 value에 값을 반환하도록 작성되어 있습니다.

2.8 컬렉션 (collection)

일반적으로 함수형 프로그래밍에서는 불변자료구조를 사용합니다. 이는 객체 상태변화를 미연에 방지해서 side effect를 근본적으로 방지합니다. 코틀린에서는 불변과 가변 자료구조를 분리해서 제공하고 있습니다.

불변: List, Set, Map

가변: Mutable, MutableSet, MutableMap ( 접두사에 Mutable이 붙음 )

불변자료형 List

가변자료형 Mutable List

변경 가능한 컬렉션은 외부에서 상태 변경될 수 있기 때문에 항상 컬렉션의 상태에 대한 검증을 필요로 합니다. 이러한 검증작업은 다중 스레드 개발에서 동시성 문제를 다룰때 더 어렵습니다.

map

맵은 키와 값인 Pair를 여러개 가진 자료구조입니다.

Pair를 생성할때는 소스코드와같이 Pair(1 to “One”) 또는 Pair(1, “One”) 문법을 사용하고 데이터를 추가하고 싶다면 plus 함수를 사용합니다.(원본배열을 변경하지않음)

2.9 제네릭(generic)

제네릭은 객체내부에서 사용할 타입을 외부에서 정하는 기법입니다. 제네릭을 사용하면 클래스를 선언할때 타입을 확정짓지 않고 클래스가 객체화 되는 시점에 타입이 결정됩니다.

제네릭을 사용해 클래스를 일반화하면 재사용성이 높아집니다. 위와 같이 제네릭을 사용하면 val vox = Box<String>(“kotlin”)과 같이 작성하지 않아도 됩니다.

모든 타입에 작동하는 함수를 작성할 수 도 있다.

2.10 코틀린 표준 라이브러리 (let, with, apply, run, also, use)

let: block함수에서 it을 사용해서 person객체에 접근하고 블록의 반환값을 반환합니다.

with: person객체를 함수의 입력으로 받고, 블록내에서 프로퍼티에 바로 접근하고 블록의 반환값을 반환합니다.

run: 확장하여 사용하였기 때문에 객체로 부터 연속적으로 사용가능합니다. 그리고 람다 리시버로 값을 받기때문에 it, this 없이 객체 프로퍼티에 사용가능하고 블록의 반환값을 반환합니다.

apply: 확장하여 사용하였기때문에 객체로 부터 연속적으로 사용가능가능합니다. 그리고 람다 리시버로 값을 받기때문에 it, this 없이 객체 프로퍼티에 사용가능하고 객체자체를 반환합니다.

also: it을 통해 프로퍼티에 접근하고 객체 자체를 반환합니다. apply와 동일하게 객체 자체를 변경할때만 사용합니다.

use: 자원을 사용한후 클로즈합니다.

2.11 변성(variance)

변성은 제네릭을 포함한 타입의 계층 관계에서 타입의 가변성을 처리하는 방식입니다.

무공변(invariant): 타입 S가 T의 하위 타입일때 Box[S]와 Box[T] 사이에 상속 관계가 없는것

Box은 매개변수화된 타입 T를 가진 타입이고 Kotlin < JVM < Language 상속관계가 존재합니다. 인스턴스를 선언할때에 languageBox, jvmBox, kotlinBox사이에는 상속관계가 존재하지 않는데 JVM에서 각 타입에 대한 정보는 Box안에 담김니다. 이정보는 컴파일 타임에 타입 유효성을 체크하는데 사용되지만 런타임에는 제네릭 타입의 인스턴스에 대한 정보는 가지고 있지 않아 상속관계가 없는 완전히 다른타입으로 인식하게 됩니다. 따라서 상속관계를 가지고 있지 않기 때문에 invariant 함수에는 jvmBox외에 입력으로 들어갈 수 없고 Box<JVM>의 변성은 무공변이 됩니다.

공변(covariant): 타입 S가 T의 하위 타입일때 Box[S] 가 Box[T] 하위 타입인것

코틀린에서는 공변을 <out T>로 선언합니다.

반공변(contravariant): 타입 S가 T의 하위 타입일때 Box[T] 가 Box[S] 하위 타입인것

코틀린에서는 공변을 <in T>로 선언합니다.

지금까지 코틀린 문법에 대해서 알아보았습니다. 다음시간에는 함수형프로그래밍의 본격적인 내용으로 찾아뵙도록 하겠습니다. 감사합니다.

Get to know us better!
Join our official channels below.

Telegram(EN) : t.me/Humanscape
KakaoTalk(KR) : open.kakao.com/o/gqbUQEM
Website : humanscape.io
Medium : medium.com/humanscape-ico
Facebook : www.facebook.com/humanscape
Twitter : twitter.com/Humanscape_io
Reddit : https://www.reddit.com/r/Humanscape_official
Bitcointalk announcement : https://bit.ly/2rVsP4T
Email : support@humanscape.io

--

--