목록Kotlin (81)
안드로이드 개발자 노트
추상화를 통해 변화로부터 코드를 보호하는 행위가 어떤 자유를 가져오는지 살펴보겠습니다. 상수 리터럴을 상수 프로퍼티로 변경하면 해당 값에 의미있는 이름을 붙일 수 있으며, 상수의 값을 변경해야 할 때 훨씬 쉽게 변경할 수 있습니다. fun isPasswordValid(text: String): Boolean { if (text.length < 7) return false //... } 여기서 숫자 7은 사실 '비밀번호의 최소 길이'를 나타냅니다. const val MIN_PASSWORD_LENGTH = 7 fun isPasswordValid(text: String): Boolean { if (text.length < MIN_PASSWORD_LENGTH) return false //... } 이처럼 상수로..
계층이 잘 분리되면 어떤 계층에서 작업할 때 그 아래의 계층은 이미 완성되어 있으므로, 전체를 이해할 필요없이 해당 계층만 생각하면 됩니다. 추상화 레벨 계층 레벨이 높아질 수록 물리 장치와 프로세서로부터 멀어집니다. 높은 레벨일 수록 걱정해야 하는 세부적인 내용들이 적어져서 단순함을 얻지만, 제어력을 잃을 수 있습니다. 예를 들어 C언어는 메모리 관리를 직접 할 수 있지만, 자바는 가비지 컬렉터가 자동으로 메모리를 관리해 줍니다. 따라서 자바는 메모리 사용을 최적화하는 것이 힘듭니다. 추상화 레벨 통일 코드도 추상화를 계층처럼 만들어서 사용할 수 있으며, 이를 위한 기본적인 도구가 바로 함수입니다. 함수도 높은 레벨과 낮은 레벨을 구분해서 사용해야 한다는 원칙(Single Level of Abstrac..
정리 코틀린은 멀티 플랫폼을 지원하기 때문에 코틀린 코드를 서로 다른 플랫폼(웹 백엔드 & 프런트엔드, Android & IOS 등등)에서 공유가 가능하다. 공통 논리 또는 공통 알고리즘을 모듈화해서 서로 다른 플랫폼에서 재사용할 수 있다.
다음과 같은 제네릭 클래스가 있다고 합시다. class Cup 위의 코드에서 타입 파라미터 T는 variance 한정자(out 또는 in)가 없으므로, 기본적으로 invariant(불공변성)입니다. invariant(불공변성)라는 것은 제네릭 타입으로 만들어지는 타입들이 서로 관련성이 없다는 의미입니다. 예를 들어 Cup와 Cup, Cup와 Cup은 어떠한 관련성도 갖지 않습니다. fun main() { val anys: Cup = Cup() // Error: type mismatch val nothing: Cup = Cup() // Error: type mismatch } 만약에 어떤 관련성을 원한다면, out 또는 in이라는 variance 한정자를 붙입니다. out은 타입 파라미터를 covarian..
다음 코드처럼 프로퍼티와 파라미터가 같은 이름을 가질 수 있습니다. class Forest(name: String) { fun addTree(name: String) { //... } } 이렇게 되면 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리게되며, 이를 섀도잉이라고 부릅니다. 섀도잉 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생합니다. interface Tree class Birch : Tree class Sqruce : Tree class Forest { fun addTree(tree: T) { //... } } 이렇게 코드를 작성하면, Forest와 addTree의 타입 파라미터가 독립적으로 동작합니다. val forest = Forest() forest.addTree(..
아규먼트(argument)로 함수에 값을 전달할 수 있는 것처럼, 타입 아규먼트를 사용하면 함수에 타입을 전달할 수 있습니다. 타입 아규먼트를 사용하는(타입 파라미터를 갖는) 함수를 제네릭 함수라고 부릅니다. 예를 들어, slice 함수는 타입 파라미터 T를 갖습니다. public fun List.slice(indices: IntRange): List { if (indices.isEmpty()) return listOf() return this.subList(indices.start, indices.endInclusive + 1).toList() } 타입 파라미터는 컴파일러에 타입과 관련된 정보를 제공하여 컴파일러가 타입을 정확하게 추측할 수 있게 해줍니다. 제네릭은 기본적으로 List 또는 Set처럼 ..
코틀린은 코드 재사용과 관련해서 프로퍼티 위임이라는 새로운 기능을 제공합니다. 프로퍼티 위임을 사용하면 일반적인 프로퍼티의 행위를 추출해서 재사용할 수 있습니다. 대표적인 예로 지연 프로퍼티가 있으며, 코틀린의 stdlib는 lazy 프로퍼티 패턴을 쉽게 구현할 수 있게 lazy 함수를 제공합니다. val value by lazy { createValue() } 프로퍼티 위임을 사용하면, 변화가 있을 때 이를 감지하는 observable 패턴을 쉽게 만들 수 있습니다. val items: List by Delegates.observable(listOf()) { _, _, _ -> notifyDataSetChanged() } val key: String? by Delegates.observable(null..
많은 개발자는 같은 알고리즘을 여러 번 반복해서 구현합니다. 여기서 말하는 알고리즘은 비즈니스 로직을 포함하는 특정 프로젝트에 국한된 것이 아닌, 수학적인 연산, 수집 처리처럼 별도의 모듈 또는 라이브러리로 분리할 수 있는 부분을 의미합니다. 예를 들어 Iterable.sorted와 같이 이미 있는 것을 활용하면, 단순하게 코드가 짧아진다는 것 이외에도 다양한 장점이 있습니다. 코드 작성 속도가 빨라진다. 호출을 한 번 하는 것이 알고리즘을 만드는 것보다 빠르다. 구현을 따로 읽지 않아도, 함수의 이름 등만 보고도 무엇을 하는지 확실하게 알 수 있다. 직접 구현할 때 발생할 수 있는 실수를 줄일 수 있다. 제작자들이 한 번만 최적화하면, 이러한 함수를 활용하는 모든 곳에 최적화의 헤택을 받는다. 표준 라..
"프로젝트에서 이미 있던 코드를 복사해서 붙여넣고 있다면, 무언가가 잘못된 것이다" 필자가 생각하는 프로그래밍의 가장 큰 규칙이며, 이를 'knowledge를 반복하여 사용하지 말라'라는 규칙으로 표현하고 있습니다. knowledge는 '의도적인 정보'를 뜻하며, 코드 또는 데이터로 표현할 수 있습니다. 또한, knowledge는 알고리즘의 작동 방식, UI의 형태, 원하는 결과 등 모든 의도적인 정보를 말합니다. 프로그램에서 중요한 knowledge를 크게 두 가지 뽑는다면, 다음과 같습니다. 로직(logic): 프로그램이 어떠한 식으로 동작하는지와 프로그램이 어떻게 보이는지 공통 알고리즘(common algorithm): 원하는 동작을 하기 위한 알고리즘 둘의 가장 큰 차이점은 시간에 따른 변화입니다..
코딩 컨벤션이란 읽고 관리하기 쉬운 코드를 작성하기 위한 일종의 코딩 스타일 규약입니다. 코틀린은 굉장히 잘 정리된 코딩 컨벤션을 갖고 있습니다. 코틀린뿐만 아니라, 어떤 개발 언어든 공식적인 컨벤션을 따르는게 좋습니다. 어떤 프로젝트를 접해도 쉽게 이해할 수 있다. 다른 외부 개발자도 프로젝트의 코드를 쉽게 이해할 수 있다. 다른 개발자도 코드의 작동 방식을 쉽게 추측할 수 있다. 코드를 병합하고, 한 프로젝트의 코드 일부를 다른 코드로 이동하는 것이 쉽다. IntelliJ 에서 설정이나 도구, 플러그인을 활용해 코틀린 컨벤션 검사를 할 수 있습니다. Setting ➡ Editor ➡ Code Style ➡ Kotlin 클릭 우측 상단 Set from... ➡ 원하는 스타일 가이드를 지정 Style i..