반응형

각 언어마다 코딩 컨벤션이 있습니다. 이를테면 파이썬은 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] 의 우측에 있는 체크박스를 체크해주시면 되겠습니다.

반응형
반응형