본문 바로가기

개발/Kotlin

(5)
Item 49. Consider using inline classes 함수 뿐만 아니라 하나의 값만 가지고 있는 객체는 inline으로 나타낼 수 있다. inline class Name(proivate val value: String) { // ... } 이러한 클래스는 가능한 경우에 언제든 변경될 수 있다. val name: Name = Name("Marcin") // During compilation replaced with code similar to: val name: String = "Marcin" inline class Name(private val value: String) { // ... fun greet() { print("Hello, I am $value") } } // Code val name: Name = Name("Marcin") name.greet..
Item 42: Respect the contract of equals Kotlin에서는 java의 object와 같이 모든 객체는 Any를 상속받는다. 이 Any에는 몇가지 잘 설계된 contract들이 있다. - equals - hashCode - toString Equality Kotlin에서는 2가지의 Equality가 있다. - Structural equality equals method나 == 연산자를 통해 체크가 된다. a == b는 a.equals(b)와 같다. (nullable이면 a?.equals(b) ?: (b === null) - Referential equality === 연산자를 통해 체크된다. 양 쪽이 같은 오브젝트를 가리킬 때만 true를 return한다. equals는 Any에 구현되어 있기 때문에 모든 객체에서 사용가능하지만 다른 타입의 객체..
Item 35: Consider defining a DSL for complex object creation Kotlin의 기능들은 Domain Specific Language (DSL)을 만드는 데에 도움을 준다. 이러한 DSL은 복잡한 object 혹은 계층적인 구조의 object를 만들 때 유용하다. 이것들은 정의하기는 쉽지 않지만, 한 번 정의해두면 보일러플레이트나 복잡도를 없애주고 개발자의 의도를 명확하게 드러내준다. DSL을 사용하는 다양한 예시가 있지만, 그 중 많이 사용하는 Gradle DSL을 Gradle configuration을 정의할 때 사용할 수 있다. 복잡하고 계층적인 데이터 구조를 만드는 것이 DSL로 더 쉬워졌다. DSL에서도 코틀린이 제공하는 모든 것들을 사용할 수 있고, Groovy와는 다르게 type-safe하다. 자기만의 DSL 정의하기 DSL을 만들기 전에 함수 타입의 개념..
Item 28: Specify API stability 매번 다른 인터페이스와 마주하게 된다면 어렵고 힘들 것이다. 이는 프로그래밍에도 똑같다. 그래서 안정적이고 표준적인 Application Programming Interface (API)가 필요하다. 1. API가 바뀌고 개발자들이 update를 받으면, 그들의 코드를 수동으로 수정해야한다. 이 API에 여러 의존적인 요소들이 많으면 문제가 될 가능성이 높다. 외부 라이브러리로 제공될 경우 어디서 어떻게 사용하는지 모르기 때문에 힘들다. 유저 입장에서도 라이브러리의 API가 조금 바뀌면 사용하는 코드의 많은 곳을 수정해야할 수도 있다. 유저가 이러한 변화를 꺼리면 예전 버전을 오랫동안 사용하게 된다. 오래된 버전을 사용하게 되면 나중에는 업데이트를 하는 것이 점점 더 어려워지는 악순환으로 이어진다. 2...
Item 21: Use property delegation to extract common property patterns 코드 재사용을 지원하도록 코틀린이 소개한 한 가지 새로운 기능은 Property delegation이다. 이를 사용한 두 가지 예시를 살펴보자. 첫 번째로 코틀린에서는 stdlib 내부에 lazy라는 함수가 있다. 이것은 lazy property pattern을 구현한 property delegate를 return 한다. val value by lazy { createValue() } 이렇게 사용하면 value라는 property가 사용되는 시점에 createValue가 호출된 뒤에 초기화 된다. 두 번째는 observer 패턴이다. 안에 있는 데이터가 바뀌면 그에 맞춰서 item들을 다시 그려야 하는 상황이 있거나 모든 변화에 대한 로그를 남겨야한다고 생각해보면 stdlib의 observable 패턴을..