Kotlin
-
33장 - 생성자 대신 팩토리 함수를 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 19. 00:01
클라이언트가 클래스의 인스턴스를 만들게 하는 다양한 방법을 알아보겠습니다. 가장 일반적인 방법 - 생성자 class MyLinkedList{ val head: T, val tail: MyLinkedList? } val list = MyLinkedList(1, MyLinkedList(2, null)) 하지만 굉장히 다양한 생성 패턴이 존재하며, 별도의 함수를 통해 생성할 수 있습니다. 팩토리 함수 fun myLinkedListof( vararg elements: T ): MyLinkedList? { if(elements.isEmpty()) return null val head = elements.first() val elementsTail = elements.copyOfRange(1, elements.si..
-
32장 - 추상화 규약을 지켜라Kotlin/Effective Kotlin 요약 2023. 3. 18. 00:01
규약과 위반 규약은 개발자들의 단순한 합의에 불과합니다. 따라서 한쪽에서 규약을 위반할 수도 있습니다. 간단한 예시로 리플렉션을 활용하면 private property의 값을 변경할 수 있습니다. 하지만 이를 위반하면 안 됩니다. 프로젝트에서 규약을 위반하는 경우 이는 내부에 시한폭탄을 설치한 것과 같습니다. 상속된 규약 모든 클래스는 equals와 hashCode 메서드를 가진 Any 클래스를 상속받습니다. 이러한 메서드는 모든 우리가 반드시 존중하고 지켜야 하는 규약을 갖고 있습니다. 이를 지키지 않는다면 HashSet과 함께 사용할 때 제대로 동작하지 않을 수 있습니다.
-
31장 - 문서로 규약을 정의하라Kotlin/Effective Kotlin 요약 2023. 3. 17. 00:01
아이템 27에서 추상화를 통해 메시지를 출력하는 함수를 만들었습니다. fun Context.showMessage( message: String, duration: MessageLength = MessageLength.Long ){ val toastDuration = when(duration){ SHORT -> LENGTH.LENGTH_SHORT LONG -> LENGTH.LENGTH_LONG } Toast.makeText(this, message, toastDuration).show() } enum class MessageLength {SHORT, LONG} 이때 showMessage라는 함수이름을 통해 토스트가 아니라 다른 타입으로도 출력할 수 있도록 이름을 붙였습니다. 하지만 다른 개발자는 이 코드를..
-
30장 - 요소의 가시성을 최소화하라Kotlin/Effective Kotlin 요약 2023. 3. 16. 00:01
가시성과 클래스 클래스는 만족해야 하는 상태에 대한 규약들이 존재합니다. 이런 규약을 모르는 사람은 클래스의 상태를 마음대로 변경할 수 있습니다. 이렇게 되면 클래스의 불변성이 무너질 가능성이 있습니다. 일반적으로 코틀린에서는 구체 접근자의 가시성을 제한해서 모든 프로퍼티를 캡슐화하는 것이 좋습니다. 가시성이 제한될 수록 클래스의 변경을 쉽게 추적할 수 있으며, 프로퍼티의 상태를 더 쉽게 이해할 수 있습니다. 이로 인해 동시성을 처리할 때도 더 안전해집니다. 가시성 한정자 - public(디폴트) : 어디에서나 볼 수 있음 - private : 클래스 내부에서만 볼 수 있음 - protected : 클래스와 서브클래스 내부에서만 볼 수 있음 - internal : 모듈 내부에서만 볼 수 있음 예를 들어 ..
-
29장 - 외부 API를 랩해서 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 15. 00:01
외부 API를 warp 해서 사용하면 얻는 자유와 안정성 - 문제가 있다면 래퍼만 변경하면 되어, API 변경에 쉽게 대응할 수 있다 - 프로젝트 스타일에 맞춰 API의 형태를 조정할 수 있다 외부 API를 warp해서 얻는 단점 - 래퍼를 따로 정의해야 한다. - 래퍼는 프로젝트 내부에서만 유효하며, 어떤 래퍼들이 존재하는지 따로 확인해야 한다 결론 장단점을 잘 이해하고 라이브러리가 얼마나 안정적인지, 사용자에게 인기가 많은지에 따라 API를 랩 할지 말지 잘 결정해야 합니다. 만약 인기가 없고 새로 만들어진 라이브러리라면 신중하게 사용을 결정하고, 사용하기로 했다면 클래스와 함수로 랩 하는 것을 고려하기 바랍니다.
-
28장 - API 안정성을 확인하라Kotlin/Effective Kotlin 요약 2023. 3. 14. 00:01
표준과 안정성 세상의 자동차의 운전법이 모두 다르다면 운전하기 전에 운전 방법을 계속 배워야 합니다. 이처럼 일시적으로 사용되는 인터페이스를 배우는 일은 귀찮은 일입니다. 따라서 운전 방법은 안정적이면서 표준적인 것이 좋습니다. 프로그래밍에서도 최대한 안정적이고 표준적인 API를 선호합니다. 하지만 좋은 API를 한 번에 설계할 순 없습니다. API 제작자는 이를 계속해서 개선해나가기 원합니다. 보통은 이에대한 해결책으로 버저닝을 통해 관리합니다. 또한 사용자에게 API에 대한 정보를 제공하는 것도 중요합니다. 예를 들어 Experimental 메타 어노테이션을 붙이면 해당 요소가 안정적이지 않다는 것을 알려줍니다. 또한 Deprecated 어노테이션을 활용하여 해당 API를 통해 변경될 것을 미리 알려..
-
27장 - 변화로부터 코드를 보호하려면 추상화를 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 13. 00:01
물 위를 걷는 것과 명세서로 소프트웨어를 개발하는 것은 쉽다. 둘 다 동결되어 있다면.. 함수와 클래스 등의 추상화로 실질적인 코드를 숨기면, 사용자가 세부 사항을 알지 못해도 괜찮다는 장점이 있습니다. 추상화의 다양한 사례 1단계 : 상수 리터럴(매직넘버)은 아무것도 설명하지 않습니다. 이를 상수로 빼어낸다면 훨씬 쉽게 이해할 수 있습니다. //지양 if(text.length < 7) return false //지향 const val MIN_PASSWORD_LENGTH = 7 if(text.length < MIN_PASSWORD_LENGTH) return false 2단계 : 함수 토스트 메시지를 자주 출력해야 한다면 다음과 같은 코드를 작성할 수 있습니다. Toast.makeText(this, mes..
-
26장 - 함수 내부의 추상화 레벨을 통일하라Kotlin/Effective Kotlin 요약 2023. 3. 12. 00:01
추상화란? 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말합니다. 추상화와 자동차 예시 자동차 내부에서는 엔진, 알터네이터, 서스펜션 등의 여러 가지 요소들이 함께 자동차가 움직일 수 있게 만듭니다. 운전을 할 때 이런 요소들을 실시간으로 이해하고 조정해야 한다면, 자동차 운전은 굉장히 힘들 수 있습니다. 하지만 운전자는 자동차를 조종하는 인터페이스(핸들과 페달 등)를 사용하는 방법만 알면 됩니다. 가솔린 자동차, 천연가스 자동차, 경유 자동차, 전기 자동차 모두 운전 방법이 대부분 같습니다. 자동차가 내부적으로 여러 반도체와 특수한 시스템을 도입해도, 운전자는 상관없이 운전할 수 있습니다. 자동차는 굉장히 잘 만들어진 인터페이스로 굉장히 ..