Revisiting types estevez cover

Kotlin 타입의 재발견

소개 (0:00)

저는 Francisco Paco Esteres입니다. 이번 강연에서는 Kotlin의 타입과 사용법에 대해 말씀드리겠습니다.

기존 객체 중심 프로그래밍 / 데이터 (0:41)

고전적인 객체 지향 프로그래밍에서는 클래스가 데이터와 동작 모두를 캡슐화합니다.

Java에서 데이터를 표현할 때는 주의해야 합니다. 클래스가 자바빈즈와 같은 특정 표준을 지켜야 하므로 null 필드나 null이 아닌 필드를 가질 수도 있고 어느 타입의 생성자도 가질 수 있습니다. 즉, 모든 값을 가진 빈 생성자도 있을 수 있습니다. 따라서 제대로 동작하려면 이런 방대한 세부 사항에 따른 클래스를 만들어야 합니다.

이런 개발 뉴스를 더 만나보세요

또한 불변에 연관된 문제도 있습니다. 멀티 스레드 패러다임에 좀 더 가까워질수록 이런 문제가 커집니다. 만약 변경 가능한 모델이 스레드 사이에서 공유되면 일관성 문제에 부딪힐 수 있으므로 이런 경우로 고려해야 합니다.

타입 (2:27)

타입은 캡슐화된 연산의 유한 집합입니다. 타입은 값이나, 값과 관련된 행동의 표현을 정의합니다. 이는 클래스로 표현될 수도 있지만, 어떤 경우에는 언어적인 지원이 필요합니다. 가장 중요한 점은 타입을 컴파일 타임에 검사할 수 있다는 것입니다.

Kotlin에서 사용 가능한 타입들 (4:02)

원시 타입(Primitives)

Kotlin에는 유형 강제가 있으므로 모든 것이 암시적이지 않습니다. 따라서 예기치 않은 동작을 하는 방식, 즉 정수와 부동소수점을 합하거나, 정수와 부동소수점으로 나눗셈할 수 없습니다.

또한, 기본 타입과 래핑된 유형이 구별되지 않습니다. 이 둘을 구별하는 것 등의 모든 것은 내부적으로 동작하며 단 하나의 유형만을 씁니다.

함수

함수는 런타임 객체로 Kotlin에서 일 등급(first class) 지원을 받습니다. 애플리케이션 내부에서 전달되는 값이나 변수와 같은 함수 클래스를 가질 수 있습니다. 또한, :: 오퍼레이터를 사용해서 각 함수나 메서드의 인스턴스를 만들 수 있습니다.

User Manager라는 클래스가 있고 다른 곳에서 이 클래스의 get을 사용하고 싶다면 ::parameter를 설정해서 인스턴스를 생성할 수 있습니다.

컬렉션과 컴비네이터(6:20)

컬렉션과 컴비네이터에는 느슨한 타입(loose types), 배열, 맵, 집합이 있습니다. 이는 오리지널 Java 클래스 위에 구현되므로 Java와 상호 운영할 수 있습니다.

컬렉션에는 뮤터블과 이뮤터블, 두 가지 타입이 있습니다. Java에서는 메서드가 이뮤터블 컬렉션을 호출하는 경우 예외가 발생하므로 뮤터블과 이뮤터블 리스트의 인터페이스를 따로따로 만들어야 했었죠.

예를 들어 listOf로 이뮤터블 컬렉션을 만들고 immutableCollection를 사용하면서 add를 호출하면, add가 유효한 오퍼레이션이 아니라는 에러가 보입니다.

이뮤터블 컬렉션에는 맵이나 필터와 같은 오퍼레이션이 있습니다. 어떤 것을 다른 것으로 변환하는 함수를 전달할 수 있고 그 결과로 함수는 람다를 갖게 됩니다.

클래스 (12:12)

데이터 클래스

데이터 클래스를 사용하면 생성자에 여러 가지 값을 전달할 수 있으며, 매개 변수 수에도 제한이 없어지며, 매개 변수가 클래스 내부를 채울 수 있습니다.

Kotlin의 타입 시스템으로 인해 Null 허용 타입과 Null 비허용 타입 사이에는 차이점이 있습니다. 끝에 ?가 있는 타입은 Null 허용입니다.

선택 값을 사용해서 클래스를 인스턴스화할 수도 있습니다. 예를 들어 이름, 나이, 위치를 속성으로 가진 클래스라면 새로운 인스턴스에 위치와 이름만 가질 수도 있습니다. 이를 위한 생성자 패턴이 직접 객체 안에 들어갈 수도 있습니다.

열거형

각 열거형에는 값과 위치가 지정되며 리플랙션을 통해 각 요소에 접근할 수도 있습니다.

Sealed 클래스 (16:17)

Java에서는 사용할 수 없긴 하지만, Sealed 클래스 자체는 새로운 개념은 아니며 이미 다른 언어에서는 존재했던 개념입니다. 이전에는 union type, Archer break data type, tack union 등으로 불렸었죠. 구현이 조금씩 다르지만 같은 개념입니다.

Sealed 클래스를 사용하면 컴파일러가 확인한 컨텍스트에서 실행을 정의하고 데이터를 일반적인 동작과 구분할 수 있습니다.

시연 (19:09)

위 플레이 버튼을 누르고 19:09부터 강연자의 시연 영상을 확인해 보세요!

다음: Realm Java의 새로운 기능을 만나 보세요!

General link arrow white

컨텐츠에 대하여

2016년 10월에 진행한 Mobilization 행사의 강연입니다. 영상 녹화와 제작, 정리 글은 Realm에서 제공하며, 주최 측의 허가 하에 이곳에서 공유합니다.

Francisco Estevez

Paco Estevez는 낮에는 페이스북의 안드로이드 개발자로 일하며 밤에는 오픈 소스에 공헌하고 있습니다. RxJava로 하는 리액티브 프로그래밍이나 Kotlin의 함수형 접근 등 안드로이드의 새로운 패러다임과 기술 부분의 얼리 어댑터입니다.

4 design patterns for a RESTless mobile integration »

close