코틀린 입문 스터디 (12) Conventions

mook2_y2
6 min readMar 4, 2019

--

스터디파이 코틀린 입문 스터디 (https://studypie.co/ko/course/kotlin_beginner) 관련 자료입니다.

코틀린 입문반은 Kotlin을 직접 개발한 개발자가 진행하는 Coursera 강좌인 “Kotlin for Java Developers” (https://www.coursera.org/learn/kotlin-for-java-developers) 를 기반으로 진행되며 아래는 본 강좌 요약 및 관련 추가 자료 정리입니다.

목차

(1) Introduction

(2) From Java to Kotlin

(3) Basics

(4) Control Structures

(5) Extensions

(6) 실습 : Mastermind game

(7) Nullability

(8) Functional Programming

(9) 실습 : Mastermind in a functional style, Nice String, Taxi Park

(10) Properties

(11) Object-oriented Programming

(12) Conventions

(13) 실습 : Rationals, Board

(14) Inline functions

(15) Sequences

(16) Lambda with Receiver

(17) Types

(18) 실습 : Game 2048 & Game of Fifteen

1. Operator overloading

  • Kotlin의 Conventions 란 언어의 내재된 구조처럼 보이는 기능 (ex: 산술 이항/단항 연산자, 할당 연산자, 비교 연산자, in , .. , iterator, destruction declaration 등)이 수행하는 역할을 메소드로 정의하므로써, 직접 구현한 클래스 또는 기존 클래스에 대해 이러한 기능을 오버로딩하여 사용할 수 있도록 하는 것입니다. 이를 통해 빈번하게 사용되는 기능을 직관적이고 간결한 문법으로 사용할 수 있도록 합니다.
  • 이 기능을 사용하기 위해서는 Convention을 제공하는 연산자 또는 기능에 대응된 메소드를 정의해주어야 하며 정의시에 operator 키워드를 붙어야 합니다.
  • 산술 연산자의 경우 a + ba.plus(b) , a — ba.minus(b) , a * ba.times(b) , a / ba.div(b) , a % ba.mod(b) 로 대응됩니다.
  • 단한 연산자의 경우 +aa.unaryPlus() , -aa.unaryMinus() , !aa.not() , ++a/a++a.inc() , --a/a--a.dec() 로 대응됩니다.

2. Conventions

  • 비교 연산자의 경우 a > ba.compareTo(b)> 0, a < ba.compareTo(b)< 0,a >= ba.compareTo(b)>= 0, a =< ba.compareTo(b) <= 0,a == b. a.equals(b)로 대응됩니다.
  • index를 통해 원소에 접근하는 square bracket ([ ] )의 경우 x[a, b]x.get(a,b), x[a, b] = cx.set(a,b,c) 로 대응됩니다.
  • 해당 원소가 map/list/range 등에 속하는지 확인하는a in cc.contains(a) 로 대응됩니다.
  • range를 생성하는 start .. endstart.rangeTo(end) 에 대응됩니다.
  • For 루프를 통해 Iterator를 구현하는 for (c in a) { }a.iterator()에 대응됩니다. Kotlin의 String이 Iterable 인터페이스를 구현하지 않은 Java.lang.String을 사용하면서도 이터레이트가 가능한 것은 이러한 구현 방식 때문입니다.
  • For 루프와 lambda에서 사용하는 destruction declaration 문법의 경우 val (a, b) = pval a = p.component1()val b = p.component2()대응됩니다. 앞서 배운 data class의 경우 이 component() 메소드를 자동으로 생성하기 때문에 destruction declaration을 사용할 수 있습니다. 한편, destruction declaration 문법을 사용할 때 호출하지 않는 변수는 _ 선언을 통해 사용되지 않음을 명시화할 수 있습니다.
  • 일반적으로 적용되지는 않지만 특정 모듈이나 알고리즘 내에서 의미를 가지는 convention의 경우 대응되는 메소드 정의시 private 또는 internal접근제어자 선언을 통해 가시성을 제어할 수 있습니다.
  • Java와의 상호운용성 측면에서 Java에서도 요구하는 문법을 만족하도록 메소드를 구현하면 Kotlin에서 Convention 기능을 사용할 수 있습니다.

3. Equality 실습 코드 작성시 고려할 점

  • data class에서 자동으로 생성하는 equals() 함수는 Non-nullable Receiver에 대해 정의되어 있으므로 Receiver가 null인 경우를 처리하기 위한 로직을 구현해야 합니다. <Receiver>?.equals(value) ?: (value === null)
  • 연산자 우선순위 관련하여 elvis operator 사용시 디폴트 값 정의 부분에 괄호 치는 것을 신경써야 합니다.

4. (Not) using operator overloading

  • Operator overloading은 매우 강력한 기능이지만 그에 따라 책임이 따르므로 제한된 범위 내에서 제공됩니다. 새로운 연산자를 개발하거나, 연산자 우선순위를 변경하는 것은 불가능하며, 허용된 연산자/Conventions에 대해 대응되는 메소드를 정의하는 방식으로 구현하도록 합니다.
  • 가능한 각 연산자/Conventions에 대해 일반적으로 합의된 의미 내에서 사용해야 하며 남용하는 것은 좋지 않다고 합니다.
  • Convention과 확장 함수를 통해 기존의 클래스/라이브러리에 대해서도 쉽게 기능을 확장할 수 있고, 편의성 기능과 클래스 핵심 멤버를 분리하여 코드 가독성을 높일 수 있습니다.

--

--