형식지정
1. 중괄호
1.1. 비어 있지 않은 블록
- ' { ' 는 같은 줄에 위치하며, ' } ' 는 새 줄에 작성
- 항상 중괄호 {}를 사용하는 것이 권장
- 올바른 예시
if (condition) {
doSomething()
} else {
doAnotherThing()
}
- 잘못된 예시
if (condition)
doSomething() // WRONG! 중괄호 필요
1.2. 빈 블록
- 빈 블록 {}은 줄바꿈하여 작성
- 한 줄 {} 사용 금지
- 올바른 예시
try {
doSomething()
} catch (e: Exception) {
} // Okay
- 잘못된 예시
try {
doSomething()
} catch (e: Exception) {} // WRONG!
2. 표현식
- 표현식이 하나만 있을 경우 =를 사용하여 단순화 가능
- 올바른 예시
fun add(a: Int, b: Int): Int = a + b
- 잘못된 예시
fun add(a: Int, b: Int): Int {
return a + b // 중괄호 없이 가능
}
3. 들여쓰기
- 4칸 공백 사용
- 블록이 열릴 떄마다 들여쓰기 증가
- 올바른 예시
if (condition) {
for (i in 0..5) {
println(i)
}
}
4. 한 줄에 한 구문
- 세미콜론(;) 사용 금지
- 각 구문을 개별 줄로 작성
- 올바른 예시
val x = 5
val y = 10
- 잘못된 예시
val x = 5; val y = 10 // WRONG!
5. 줄바꿈
- 한 줄 최대 100자 제한
- 100자를 초과하면 적절한 위치에서 줄바꿈
6. 줄바꿈 위치
- 연산자(+, -, *, /, %, =) : 연산자 뒤에서 줄바꿈
- .(?., ::) : 점 뒤에서 줄바꿈
- , : 쉼표 뒤에서 줄바꿈
- 람다 화살표 (->) : 화살표 앞에서 줄바꿈
- 올바른 예시
val result = listOf(1, 2, 3)
.map { it * 2 }
.filter { it > 2 }
7. 함수
7.1. 함수 선언
- 한 줄에 들어가지 않으면 매개변수를 각 줄에 정렬
- 올바른 예시
fun <T> Iterable<T>.joinToString(
separator: CharSequence = ", ",
prefix: CharSequence = "",
postfix: CharSequence = ""
): String {
// …
}
7.2. 표현식 함수
- 단일 표현식의 경우 = 사용
- 올바른 예시
fun double(x: Int) = x * 2
8. 속성
- 한 줄에 들어가지 않으면 = 뒤에서 줄바꿈
- 올바른 예시
private val defaultCharset: Charset? =
EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(file)
9. 공백
9.1. 수직 공백
- 관련 없는 코드 사이에는 한 줄의 공백 유지
- 함수와 함수 사이에는 한 줄 공백 추가
- 올바른 예시
fun firstFunction() {
// ...
}
fun secondFunction() {
// ...
}
9.2. 수평 공백
- 연산자와 예약어 뒤에는 공백 추가
- 올바른 예시
val sum = a + b // Okay
- 잘못된 예시
val sum = a+b // WRONG!
10. 특정 구성
10.1 Enum 클래스
- 한 줄로 가능하면 한 줄 사용
- 각 상수를 별도 줄에 작성할 경우 빈 줄 없이 작성
- 올바른 예시
enum class Answer { YES, NO, MAYBE }
enum class Answer {
YES,
NO,
MAYBE {
override fun toString() = """¯\_(ツ)_/¯"""
}
}
10.2 주석
- 코드와 주석 사이에 공백 추가
- 올바른 예시
// This is a comment
val value = 42
10.3. 암시적 반환/속성 유형
- 명확한 타입을 작성하는 것이 가독성에 유리
- 한 줄 함수는 타입 생략 가능
- 올바른 예시
val name = "Kotlin" // Okay
fun square(x: Int) = x * x // Okay
- 생략 안할경우
fun square(x: Int): Int = x * x // 타입 생략 가능
11. 이름 지정
11.1. 패키지 이름
- 소문자, 언더스코어 없이 작성
package com.example.myapp
11.2 유형 이름
- 대문자로 시작하는 카멜케이스 (PascalCase)
class MyClass
interface MyInterface
11.3. 함수 이름
- 소문자로 시작하는 카멜케이스 (camelCase)
fun doSomething() { /* ... */ }
11.4. 상수 이름
- 대문자 + 언드스코어 (UPPER_SNAKE_CASE)
const val MAX_SIZE = 100
11.5. 상수가 아닌 이름
- 소문자로 시작하는 카멜케이스 (camelCase)
val userCount = 10
11.6. 지원 속성
- _로 시작하는 네이밍 사용
private var _table: Map<String, Int>? = null
val table: Map<String, Int>
get() = _table ?: emptyMap()
11.7. 유형 변수 이름
- 단일 대문자, 필요에 따라 단일 숫자가 뒤에 온다. (T, E, X, T2)
- 클래스에 사용된 형식으로 된 이름, 대문자 T가 뒤에 온다.(RequestT, FooBarT)
class Box<T>(val item: T)
공식 문서 : https://developer.android.com/kotlin/style-guide?hl=ko#formatting
'Kotlin' 카테고리의 다른 글
Kotlin 스타일 가이드 - 1 (0) | 2025.02.07 |
---|---|
Kotlin 변수 데이터 유형 (0) | 2025.02.06 |