각 언어마다 코딩 컨벤션이 있습니다. 이를테면 파이썬은 PEP8 스타일 가이드를 따르길 권장하고 있죠.(파이썬 코딩 스타일 가이드 - PEP8)
코틀린도 역시나 이러한 코딩 스타일(컨벤션)을 가지고 있습니다. 이번 포스팅에서는 코틀린에서 공식적으로 권하고 있는 스타일을 소개해드리겠습니다.
클래스 레이아웃(Class Layout)
자바에서 일반적인 class layout이 멤버 변수 - 생성자 - 메소드 순이었다면, 코틀린에서는 일반적으로 아래와 같은 순서를 따릅니다.
- Property 선언과 초기화 블럭(intializer blocks)
- 추가적인 생성자
- 메소드 정의
- 컴패니언 오브젝트(Companion object)
여러 개의 메소드의 순서를 정할 때는 알파벳이나 가독성을 기준으로 정렬하거나 해당 클래스의 고유 메소드와 extension 메소드를 분리하지 않고, 전체적으로 메소드들을 놓고 봤을 때 관련되어 있는 메소드들끼리 묶고, 위에서부터 아래로 읽었을 때 로직에 대한 이해를 쉽게 따라갈 수 있도록 정렬하는 것이 좋습니다.
중첩 클래스(Nested Class)의 경우 그 클래스를 사용하는 메소드의 바로 다음에 오게끔 하는 것이 좋고, 만약 그 클래스를 내부에선 참조하지 않고 외부에서만 참조할 경우 클래스의 마지막 부분에 companion object로 구현하는 것을 권장합니다.
네이밍 룰(Naming rules)
코틀린에서 패키지와 클래스 네이밍 하는 규칙은 꽤 간단합니다.
- 패키지의 이름은 항상 소문자로 하고, 밑줄을 사용하지 않습니다. 두 개 이상의 단어를 한 번에 사용하는 것을 권장하지는 않지만, 만약 사용을 해야겠다면 두 번째 단어부터 앞글자만 대문자로 하는 카멜 케이스(Camel case)를 사용하면 되겠습니다.
ex ) org.example.project / org.example.myProject - 클래스 또는 오브젝트(object)의 이름의 이름은 맨 앞글자를 대문자로 하며, 앞서 말한 카멜 케이스를 따릅니다.
ex)
open class SampleName { /* ... */ }
object MoreSampleName : SampleName() { /* ... */ }
- 함수 이름과 파라미터, 지역 변수는 모두 첫 단어의 맨 앞글자는 항상 소문자로 하고 이후로는 카멜 케이스를 따릅니다. (클래스의 인스턴스를 생성해주는 팩토리 함수의 경우 예외로 맨 앞글자를 대문자로 합니다.)
- 테스트 코드의 경우 Backtick(`)으로 감싼다면 메소드 이름에 space가 허용됩니다.(단, 안드로이드 런타임 환경에선 인식 안됩니다.) 그리고 테스트 코드에 한정하여 밑줄(_)도 허용합니다.
- 상수의 경우 get 함수로 호출하지도 않고, const와 함께 쓰이거나 top-level에서 val과 함께 주소뿐만 아니라 값까지도 불변으로 사용할 경우에 밑줄(_)과 함께 대문자로만 표기합니다.
const val MAX_COUNT = 8
val USER_NAME_FIELD = "UserName"
- properties 중에서도 싱글톤 오브젝트를 참조하는 경우 object 네이밍 스타일처럼 카멜 케이스를 따릅니다.
val PersonComparator: Comparator<Person> = /*...*/
Formatting
- 코틀린에서는 들여쓰기(indention)에 탭(tab)을 사용하지 않고, 4 spaces를 사용하길 권장합니다.
- 중괄호의 경우 엔터 치지 않고 라인의 끝에 붙입니다.
if (elements != null) {
for (element in elements) {
// ...
}
}
- if, while, for 등 제어문과 그 제어문을 여는 소괄호() 사이에는 한 칸 띄어쓰기를 합니다.
(단, 생성자나 메소드는 소괄호를 붙입니다.) - 콜론(:)은 supertype을 상속하거나 interface를 구분하는 경우, object 뒤에 사용되는 경우에는 한 칸 띄어쓰기를 하고, 변수의 타입이나 함수의 리턴 타입을 정의할 때는 콜론 앞을 붙여 쓴다.
abstract class Foo<out T : Any> : IFoo {
abstract fun foo(a: Int): T
}
class FooImpl : Foo() {
constructor(x: String) : this(x) { /*...*/ }
val x = object : IFoo { /*...*/ }
}
인텔리J에서 코틀린 코딩 스타일 적용하기
이러한 코딩 컨벤션을 잘 적용하고 있는지에 대해 IDE 수준에서 검사가 가능합니다. (역시 젯브레인...)
IntelliJ를 켜시면 (윈도우를 기준으로 했을 때) 좌측 상단에 있는 [File] 누르셔서 [Settings] - [Editor] - [Code Style] - [Kotlin] 순서로 들어가시면 우측 상단 모서리에 set from... 이 보일 겁니다. 그걸 누르셔서 [Predefined style] - [Kotlin style guide]를 누르시고 apply 하시면 됩니다.
혹시나 '나는 좀 더 타이트하게 검사를 해줬으면 좋겠다!' 즉, 내가 컨벤션을 지키지 않았을 경우 IDE가 알려줬으면 좋겠다 하시는 분들은 앞서 들어갔던 [Editor] 에서 [Inspection] - [Kotlin] - [Style issues] 를 클릭하신 후에 [File is not formatted according to project settings] 의 우측에 있는 체크박스를 체크해주시면 되겠습니다.
'Kotlin' 카테고리의 다른 글
코틀린의 Property와 Field 파헤치기(var, val, getter & setter) (2) | 2019.11.13 |
---|---|
코틀린(kotlin)과 불변성(immutability) (1) | 2019.10.14 |
코틀린(Kotlin)과 함수형 프로그래밍 (2) | 2019.10.04 |
"lambda arguments should be moved out of parentheses" 경고 해결하기 (0) | 2019.10.03 |
코틀린(Kotlin)의 데이터 클래스(data class) (0) | 2019.09.25 |