본문 바로가기

Language

제네릭, 그리고 변성(Variance)에 대한 고찰 (2) - Kotlin 지난 포스트에서 이야기한 'PECS' 공식은 어찌보면 난해하다. 한정적 와일드 카드 타입 파라메터에 사용하는 `extends` 와 `super` 키워드에 의해서 탄생한 용어이기 때문이다. 게다가 자바에는 상속, 상위 클래스를 지칭하는 같거나 비슷한 키워드가 있어서 더 혼란스럽다. 'PECS' 에서 말하는 `extends` 키워드와 상속을 나타내는 그것은 의미가 다르다! 코틀린은 많은 부분에서 자바보다 나은점을 보여준다. 특히나 지금 이야기하고 있는 변성에 관련한 키워드도 그 중 하나인데, 무척 직관적인 `out` 과 `in` 이라는 키워드로 'PECS' 공식을 표현하기 때문이다. 공변, 반공변의 원리와 이해는 지난 포스트에서 충분히 설명했으므로, 지금부터는 코틀린 변성의 키워드 중심으로 간단히 짚고 넘어.. 더보기
제네릭, 그리고 변성(Variance)에 대한 고찰 (1) - Java 공변 가령, 타입 `S`와 `T`가 있고, `T` 는 `S` 의 하위 타입이라고 하자. 특정 컨테이너 `C` 에 먼저 언급한 타입을 타입 파라메터로 전달한 제네릭, `C` 는 `C` 의 하위 타입인가? 이것이 성립되면 해당 언어는 공변적이라고 한다. 자바를 생각해보자. 자바는 애초에 공변, 반공변을 지원하지 않지만, 지원하는 것처럼(?) 보여주는 컴파일러 트릭을 사용한다. ` 더보기
[Kotlin] 함수 프로그래밍 분야에서 함수라는 말은 어떤 '입력'에 대해 '출력'을 반환하는 일련의 코드 조각을 나타내는데, 이것은 우리가 잘 알고 있는 수학적인 정의와도 유사하다. 메서드 또한 이러한 개념에서 함수이지만, 이것은 객체지향 문맥에서 주로 쓰이는 용어이다. 다시 말하자면, 수신객체에 보내는 '메시지'라고 하는 것이 올바르다. 이와 관련된 것은 'Message passing' 과 관련된 문서를 찾아보자. 이제 코틀린에서 말하는 함수 또는 메서드의 중요 개념들을 정리해 보도록 하겠다. (이하 코틀린 문맥에서 '함수'로 통일) 최상위(Top level) 함수 각자 이해하기에 따라 다를 수 있지만 서두에 언급한 것과 같은 맥락에서, 함수라는 것은 어떠한 수신객체도 없다. 자바 또한 이러한 개념을 이용해 메서드를 작.. 더보기
[Kotlin] Property와 Data Class 비즈니스 도메인을 자바로 개발하다 보면, 흔히 'Value Object' 라고도 불리는 - 물론 단순히 값을 저장하는 객체의 의미는 아니지만 - 자바 빈즈(Java Beans) 컴포넌트를 작성해야 할 때가 많다. 이 자바 빈즈에는 귀찮은 규약이 하나 있는데, 접근자(Getter)와 수정자(Setter)가 바로 그것이다. 물론, IDE의 자동완성 기능이라던가, 해당 메서드들 뿐만 아니라 품질 좋은 `equals`와 `hashcode`그리고 `toString` 메서드까지 생성해주는 'Lombok' 이라는 녀석 덕분에 많은 개발자들이 조금 이나마 타이핑을 덜 하게 되기는 했다. 다만 이러한 것들을 언어의 런타임 레벨에서 지원하지 않는다는 것은 자바의 한계를 보여준다. 프로퍼티 코틀린에서는 언어 자체에서 이를 .. 더보기
Intellij + Kotlin + Gradle 개발환경 구성 이 포스팅에서는 `IntelliJ` 기반으로 코틀린으로 개발하기 위한 기본적인 설정을 정리한다. 각 버전 정보는 아래와 같다. IntelliJ : 2020.1.1 (#IU-201.7223.91) Kotlin : 1.3.72 Gradle : 5.6.4 프로젝트 생성 'build.gradle' 파일 작성 buildscript { ext.kotlin_version = '1.3.72' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenC.. 더보기