Kotlin 코딩 컨벤션 가이드
Kotlin을 사용하여 더 깔끔하고 일관된 코드를 작성하기 위한 고급 코딩 컨벤션을 소개합니다.
아래글은 공식 홈페이지를 참고하였습니다.
https://kotlinlang.org/docs/coding-conventions.html
람다 표현식
람다 표현식에서는 중괄호와 화살표 주위에 공백을 사용합니다. 단일 람다를 인자로 받는 함수 호출 시, 가능하면 괄호 밖에 람다를 배치합니다.
list.filter { it > 10 }
람다에 레이블을 할당할 때는 레이블과 여는 중괄호 사이에 공백을 넣지 않습니다:
fun foo() {
ints.forEach lit@{
// ...
}
}
여러 줄의 람다에서 매개변수 이름을 선언할 때는 첫 줄에 이름을 두고, 화살표와 줄바꿈을 따라 배치합니다:
appendCommaSeparated(properties) { prop ->
val propertyValue = prop.get(obj) // ...
}
매개변수 목록이 너무 길어 한 줄에 맞지 않으면 화살표를 별도의 줄에 배치합니다:
foo {
context: Context,
environment: Env
->
context.configureEnv(environment)
}
후행 쉼표(Trailing commas)
후행 쉼표는 요소 시리즈의 마지막 항목 뒤에 오는 쉼표 기호입니다:
class Person(
val firstName: String,
val lastName: String,
val age: Int, // 후행 쉼표
)
후행 쉼표 사용의 장점:
- 버전 관리 시 차이점을 더 명확하게 보여줍니다.
- 요소 추가 및 재정렬이 쉬워집니다.
- 코드 생성을 단순화합니다.
Kotlin 스타일 가이드는 선언 부분에서 후행 쉼표 사용을 권장하며, 호출 부분에서는 개발자의 판단에 맡깁니다.
문서화 주석
긴 문서화 주석의 경우, 여는 /**
를 별도의 줄에 배치하고 각 후속 줄을 별표로 시작합니다:
/**
* 이것은 여러 줄에 걸친
* 문서화 주석입니다.
*/
짧은 주석은 한 줄에 배치할 수 있습니다:
/** 이것은 짧은 문서화 주석입니다. */
일반적으로 @param
과 @return
태그 사용을 피하고, 대신 매개변수와 반환 값에 대한 설명을 문서화 주석에 직접 포함시킵니다:
/**
* 주어진 [number]의 절대값을 반환합니다.
*/
fun abs(number: Int): Int { /*...*/ }
언어 기능의 관용적 사용(Idiomatic use of language features)
불변성(Immutability)
가능한 한 불변 데이터를 선호합니다. 초기화 후 수정되지 않는 지역 변수와 프로퍼티는 항상 val
로 선언합니다.
불변 컬렉션 인터페이스를 사용하여 변경되지 않는 컬렉션을 선언합니다:
// 좋음: 불변 컬렉션 타입 사용
fun validateValue(actualValue: String, allowedValues: Set<String>) { ... }
// 좋음: listOf()는 List<T>를 반환
val allowedValues = listOf("a", "b", "c")
기본 매개변수 값
오버로드된 함수를 선언하는 대신 기본 매개변수 값을 가진 함수를 선언하는 것이 좋습니다:
// 좋음
fun foo(a: String = "a") { /*...*/ }
타입 별칭
코드베이스에서 여러 번 사용되는 함수형 타입이나 타입 매개변수가 있는 타입의 경우, 타입 별칭을 정의하는 것이 좋습니다:
typealias MouseClickHandler = (Any, MouseEvent) -> Unit
typealias PersonIndex = Map<String, Person>
조건문
try
, if
, when
의 표현식 형태를 사용하는 것이 좋습니다:
return if (x) foo() else bar()
return when(x) {
0 -> "zero"
else -> "nonzero"
}
루프
가능한 한 고차 함수(filter
, map
등)를 루프 대신 사용합니다. 단, forEach
는 예외이며, 일반 for
루프를 대신 사용하는 것이 좋습니다.
범위 루프
개방형 범위에 대해 루프를 돌릴 때는 ..<
연산자를 사용하세요:
for (i in 0..n - 1) { /*...*/ } // 나쁨
for (i in 0..<n) { /*...*/ } // 좋음
문자열 처리
- 문자열 연결 대신 문자열 템플릿을 선호합니다.
- 일반 문자열 리터럴에
\n
이스케이프 시퀀스를 포함시키는 대신 여러 줄 문자열을 사용합니다. - 여러 줄 문자열에서 들여쓰기를 유지하려면 내부 들여쓰기가 필요하지 않은 경우
trimIndent
를, 내부 들여쓰기가 필요한 경우trimMargin
을 사용합니다:
println("""
Not
trimmed
text
"""
)
println("""
Trimmed
text
""".trimIndent()
)
val a = """Trimmed to margin text:
|if(a > 1) {
| return a
|}""".trimMargin()
println(a)
함수 vs 프로퍼티(Functions vs properties)
인수가 없는 함수는 읽기 전용 프로퍼티와 교환 가능할 수 있습니다. 다음과 같은 경우 함수 대신 프로퍼티를 선호합니다:
- 예외를 발생시키지 않음
- 계산 비용이 적음 (또는 첫 실행 시 캐시됨)
- 객체 상태가 변하지 않았다면 호출마다 같은 결과를 반환
확장 함수(Extension functions)
확장 함수를 자유롭게 사용하세요. 객체를 주로 다루는 함수가 있다면 해당 객체를 수신자로 받는 확장 함수로 만드는 것을 고려하세요. API 오염을 최소화하기 위해 확장 함수의 가시성을 가능한 한 제한하세요.
중위 함수(Infix functions)
두 객체가 비슷한 역할을 하는 경우에만 함수를 infix
로 선언하세요. 좋은 예: and
, to
, zip
. 나쁜 예: add
.
수신자 객체를 변경하는 메서드는 infix
로 선언하지 마세요.
팩토리 함수(Factory functions)
클래스의 팩토리 함수를 선언할 때 클래스 이름과 같은 이름을 사용하지 마세요. 팩토리 함수의 특별한 동작을 명확히 하는 고유한 이름을 사용하세요:
class Point(val x: Double, val y: Double) {
companion object {
fun fromPolar(angle: Double, radius: Double) = Point(...)
}
}
플랫폼 타입(Platform types)
플랫폼 타입의 표현식을 반환하는 공개 함수/메서드는 Kotlin 타입을 명시적으로 선언해야 합니다:
fun apiCall(): String = MyJavaApi.getProperty("name")
플랫폼 타입의 표현식으로 초기화된 모든 프로퍼티(패키지 수준 또는 클래스 수준)는 Kotlin 타입을 명시적으로 선언해야 합니다:
class Person {
val name: String = MyJavaApi.getProperty("name")
}
fun main() {
val name = MyJavaApi.getProperty("name")
println(name)
}
스코프 함수 apply/with/run/also/let
Kotlin은 주어진 객체의 컨텍스트에서 코드 블록을 실행하기 위한 일련의 함수(let
, run
, with
, apply
, also
)를 제공합니다. 적절한 스코프 함수 선택에 대한 지침은 스코프 함수를 참조하세요.
이러한 고급 코딩 관행을 따르면 Kotlin 코드의 가독성, 유지보수성, 효율성을 크게 향상시킬 수 있습니다. 이는 개인 프로젝트뿐만 아니라 팀 프로젝트에서도 일관성 있는 코드 작성에 도움이 될 것입니다.
라이브러리를 위한 코딩 컨벤션
라이브러리 작성 시 API 안정성을 보장하기 위해 추가적인 규칙을 따르는 것이 좋습니다:
- 항상 멤버 가시성을 명시적으로 지정합니다.
- 항상 함수 반환 타입과 프로퍼티 타입을 명시적으로 지정합니다.
- 모든 공개 멤버에 대해 KDoc 주석을 제공합니다 (새로운 문서가 필요 없는 오버라이드 제외).
이 가이드라인을 따르면 Kotlin 코드의 일관성과 가독성을 크게 향상시킬 수 있습니다. 또한 다른 개발자들과의 협업을 더욱 원활하게 만들어 줄 것입니다.
이 블로그의 다른 글 :
2024.08.09 - [개발&프로그래밍] - [kotlin] 코딩 컨벤션 (coding conventions)
[kotlin] 코딩 컨벤션 (coding conventions)
Kotlin 코딩 컨벤션 가이드 Kotlin 프로그래밍 언어를 사용할 때 따라야 할 코딩 컨벤션에 대한 종합적인 가이드입니다.이 가이드라인을 따르면 코드의 일관성과 가독성을 높일 수 있습니다. 이
observerlife.tistory.com
2024.08.09 - [개발&프로그래밍] - [kotlin] 자주 사용되는 관용구(idiom) 모음
[kotlin] 자주 사용되는 관용구(idiom) 모음
이 글은 Kotlin 프로그래밍 언어에서 자주 사용되는 관용구(idiom)들의 모음입니다.각 관용구에 대한 설명과 예제 코드를 함께 설명합니다.공식 홈페이지 kotlinlang.org의 내용을 참고합
observerlife.tistory.com
2024.08.07 - [개발&프로그래밍] - [kotlin] 입문시 알아야 할 8가지 핵심 문법
[kotlin] 입문시 알아야 할 8가지 핵심 문법
Kotlin의 주요 문법 특징들을 간략히 정리한 것입니다.각 항목은 Kotlin의 간결하고 표현력 있는 코드 작성을 지원하는 특징들을 보여줍니다. 아래 문서는 kotlinlang.org 공식 홈페이지를 참조합니다.
observerlife.tistory.com
2024.08.07 - [개발&프로그래밍] - [kotlin] 입문시 알아야 할 7가지 핵심 문법
[kotlin] 입문시 알아야 할 7가지 핵심 문법
Kotlin의 기본적인 문법 요소들을 간략하게 설명하고 있습니다.각 항목은 Kotlin 프로그래밍의 기초를 이해하는 데 중요한 개념들을 포함하고 있습니다. 아래 문서는 kotlinlang.org 공식 홈페이지를
observerlife.tistory.com
'개발&프로그래밍' 카테고리의 다른 글
[kotlin] 타입 체크와 캐스팅 (0) | 2024.08.11 |
---|---|
[Kotlin] 숫자 타입과 연산 가이드 (4) | 2024.08.10 |
[kotlin] 코딩 컨벤션 (coding conventions) (0) | 2024.08.09 |
[kotlin] 자주 사용되는 관용구(idiom) 모음 (0) | 2024.08.09 |
[kotlin] 입문시 알아야 할 8가지 핵심 문법 (0) | 2024.08.07 |
댓글