들여 쓰기
들여 쓰기에는 공백 4개를 사용하십시오. 탭을 사용하지 마십시오.
중괄호의 경우 구성이 시작되는 줄 끝에 여는 중괄호를 배치하고 여는 구성과 수평으로 정렬 된 별도의 줄에 닫는 중괄호를 배치합니다.
if (elements != null) {
for (element in elements) {
}
}
i) Kotlin에서 세미콜론은 선택 사항이므로 줄 바꿈이 중요합니다. 언어 디자인은 Java스타일 중괄호를 가정하며 다른 형식화 스타일을 사용하려고 하면 놀라운 동작이 발생할 수 있습니다.
수평 공백
- 이항 연산자 (a + b) 주위에 공백을 두십시오. 예외: "범위"연산자 (0..i)주위에 공백을 두지 마십시오.
- 단항 연산자 (a++)주위에 공백을 두지 마십시오.
- 제어 흐름 키워드 (if, when, for 및 while)와 해당 여는 괄호 사이에 공백을 넣습니다.
- 기본 생성자 선언, 메서드 선언 또는 메서드 호출에서 여는 괄호 앞에 공백을 두지 마십시오.
class A(val x: Int)
fun foo(x: Int) { ... }
fun bar() {
foo(1)
}
- (, [ 또는 ], ) 뒤에 공백을 넣지 마십시오.
- . or ?. 주위에 공백을 두지 마십시오 : foo.bar().filter{ it > 2 }.joinToString(), foo?.bar()
- // 뒤에 공백을 넣으십시오.
- 유형 매개 변수를 지정하는 데 사용되는 꺽쇠 괄호 주위에 공백을 두지 마십시오. class Map<K, V> { ... }
- :: 주변에 공백을 두지 마십시오. Foo::class, String::length
- ? nullable 유형을 표시하는데 사용 되기 전에 공백을 두지 마십시오. Stirng?
일반적으로 어떤 종류의 수평 정렬도 피하십시오.
식별자의 이름을 길이가 다른 이름으로 바꾸는 것은 선언이나 사용법의 형식에 영향을 주지 않습니다.
콜론
다음과 같은 경우 : 앞에 공백을 넣으십시오.
- 유형과 상위 유형을 구분하는 데 사용되는 경우
- 수퍼 클래스 생성자 또는 동일한 클래스의 다른 생성자에 위임 할 때
- object 키워드 뒤에
선언과 유형을 분리 할 때 앞에 공백을 두지 마십시오.
: 뒤에는 항상 공백을 넣으십시오.
abstract class Foo<out T : Any> : IFoo {
abstract fun foo(a: Int): T
}
class FooImpl : Foo() {
cpmstrictpr(x: String) : this(x) {/*...*/}
val x = object : IFoo {/*...*/}
}
클래스 헤더
몇 가지 기본 생성자 매개 변수가 있는 클래스를 한 줄에 작성할 수 있습니다.
class Person(id: Int, name: String)
헤더가 더 긴 클래스는 각 기본 생성자 매개 변수가 들여 쓰기가 있는 별도의 행에 있도록 형식을 지정해야 합니다.
또한 닫는 괄호는 새 줄에 있어야 합니다.
상속을 사용하는 경우 수퍼 클래스 생성자 호출 또는 구현된 인터페이스 목록은 괄호와 같은 줄에 있어야 합니다.
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name) { /*... */ }
다중 인터페이스의 경우 수퍼 클래스 생성자 호출을 먼저 찾은 다음 각 인터페이스를 다른 줄에 배치해야 합니다.
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name),
KotlinMaker { /*...*/ }
긴 슈퍼 타입 목록이 있는 클래스의 경우 콜론 뒤에 줄 바꿈을 넣고 모든 슈퍼 타입 이름을 가로로 정렬합니다.
class MyFavoriteVeryLongClass :
MyLongHolder<MyFavouriteVeryLongClass>(),
SomeOtherInterface,
AndAnotherOne {
fun foo() { /*...*/ }
}
클래스 헤더가 길 때 클래스 헤더와 본문을 명확하게 구분하려면 클래스 헤더 뒤에 빈 줄을 추가하거나 (위에 예에서와 같이)
여는 중괄호를 별도의 줄에 넣습니다.
class MyFavouriteVeryLongClassHolder :
MyLongHolder<MyFavouriteVeryLongClass>(),
SomeOtherInterface,
AndAnotherOne
{
fun foo() { /*... */ }
}
수정 자 순서
선언에 여러 수정자가 있는 경우 항상 다음 순서로 배치하십시오.
public / protected / private / internal
expect / actual
final / open / abstract / sealed / const
external
override
lateinit
tailrec
vararg
suspend
inner enum / annotation / fun // as a modifier in `fun interface`
companion
inline / value
infix
operator
data
수정자 앞에 모든 주석을 배치합니다.
@Named("Foo")
private val foo: Foo
라이브러리에서 작업하지 않는한 중복 수정자를 생략하십시오 ex) public
주석 Annotation
주석이 첨부 된 선언 앞의 별도 줄에 동일한 들여 쓰기로 주석을 배치합니다.
@Target(AnnotationTarget.PROPERTY)
annotation class JsonExclude
인수가 없는 주석은 같은 줄에 배치 할 수 있습니다.
@JsonExclude @JvmField
var x: String
인수가 없는 단일 주석은 해당 선언과 같은 줄에 배치 할 수 있습니다.
@Test fun foo() { /*...*/ }
파일 주석 File Annotation
파일 주석은 파일주석(있는 경우) 뒤, 패키지 명령문 앞에 배치되며 패키지와 빈 줄로 구분 됩니다(패키지가 아닌 파일을 대상으로 한다는 사실을 강조하기 위해).
@file:JvmName("FooBar")
package foo.bar
기능 Functions
함수 서명이 한 줄에 맞지 않는 경우 다음 구문을 사용합니다.
fun longMethodName(
argument: ArgumentType = defaultValue,
argument2: AnotherArgumentType,
): REturnType {
//body
}
함수 매개 변수에는 일반 들여 쓰기(공백 4개)를 사용하십시오.
생성자 매개 변수와 일관성을 유지하는데 도움이 됩니다.
단일 표현식으로 구성된 본문이 있는 함수에는 표현식 본문을 사용하는 것이 좋습니다.
fun foo(): Int { // bad
return 1
}
fun foo() = 1 // good
표현체 Expression bodies
함수에 첫 줄이 선언과 같은 줄에 맞지 않는 식 본문이 있는 경우 첫 줄에 = 부호를 넣고 식 본문을 공백 4개로 들여 씁니다.
fun f(x: String, y: String, z: String) =
veryLongFunctionCallWithManyWords(andLongParametersToo(), x, y, z)
속성 Properties
매우 간단한 읽기 전용 속성의 경우 한 줄 형식을 고려하십시오.
val isEmpty: Boolean get() = size == 0
더 복잡한 속성의 경우 항상 get 및 set키워드를 별도의 줄에 입력하십시오.
val foo: String
get() { /*...*/ }
intializer가 있는 속성의 경우 intializer가 길면 = 부호 뒤에 줄 바꿈을 추가 하고 intialier를 4 공백으로 들여 씁니다.
private val defaultCharset: Charset? =
EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(file)
제어 흐름 문
- if 또는 when문의 조건이 여러줄이면 항상 문의 본문 주위에 중괄호를 사용하십시오.
문 시작을 기준으로 조건의 각 후속 줄을 공백 4개로 들여 씁니다.
조건의 닫는 괄호를 여는 중괄호와 함께 별도의 줄에 넣으십시오.
if (!component.isSyncing &&
!hasAnyKotlinRuntimeInScope(module)
) {
return createKotlinNotConfiguredPanel(module)
}
이것은 조건과 문장 본문을 정렬하는데 도움이 됩니다.
- else, catch, finally 키워드와 do-while 루프의 while 키워드를 앞의 중괄호와 같은 줄에 넣으십시오.
if (condition) {
// body
} else {
// else part
}
try {
// body
} finally {
// cleanup
}
- when 문에서 분기가 한 줄 이상이면 빈 줄로 인접한 case블록과 구분하는 것을 고려하십시오.
private fun parsePropertyValue(propName: String, token: Token) {
when (token) {
is Token.ValueToken ->
callback.visitValue(propName, token.value)
Token.LBRACE -> { // ...
}
}
}
- 중괄호 없이 짧은 가지를 조건과 같은 줄에 배치합니다.
when (foo) {
true -> bar() // good
false -> { baz() } // bad
}
메서드 호출
긴 인수 목록에서 여는 괄호 뒤에 줄 바꿈을 넣으십시오. 4개의 공백으로 인수를 들여 씁니다.
밀접하게 관련된 여러 인수를 같은 줄에 그룹화 합니다.
drawSquare(
x = 10, y = 10,
width = 100, height = 100,
fill = true
)
= 인수 이름과 값을 구분하는 기호 주위에 공백을 넣으십시오.
체인 통화 래핑 Wrap chained calls
연결 호출을 래핑할 때 한번 들여 쓰기로 . 문자 또는 ?. 연산자를 다음 줄에 배치합니다.
val anchor = owner
?.firstChild!!
.siblings(foward = true)
.dropWhile { it is PsiCommen || it is PsiWhiteSpace }
람다
람다 식에서는 중괄호와 본문에서 매개 변수를 구분하는 화살표 주변에 공백을 사용해야 합니다.
호출이 단일 람다를 사용하는 경우 가능하면 괄호 밖에 전달하십시오.
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)
}
후행 쉼표
후행 쉼표는 일련의 요소 중 마지막 항목 뒤의 쉼표 기호입니다.
class Person(
val firstName: String,
val lastName: String,
val age: Int, // trailing comma
)
후행 쉼표를 사용하면 몇 가지 이점이 있습니다.
- 모든 초점이 변경된 값에 집중되므로 버전 제어 차이가 더 깔끔해집니다.
- 요소를 쉽게 추가하고 재정렬 할 수 있습니다. 요소를 조작하는 경우 쉼표를 추가하거나 삭제할 필요가 없습니다.
- 예를 들어 객체 이니셜 라이저에 대한 코드 생성을 단순화 합니다. 마지막 요소에도 쉼표가 있을 수 있습니다.
후행 쉼표는 전적으로 선택사항입니다. 코드가 없이도 작동합니다.
Kotlin 스타일 가이드는 선언 사이트에서 후행 쉼표를 사용하도록 권장하고 호출 사이트에 대해 사용자의 재량에 따라 둡니다.
*IntelliJ IDEA 포맷터에서 후행 쉼표를 활성화하려면 설정 | 편집자 | 코드 스타일 | Kotlin 에서 기타 탭을 열고 후행 쉼표 사용 옵션을 선택합니다.
참조 :
https://kotlinlang.org/docs/coding-conventions.html#horizontal-whitespace
'코틀린 & Java' 카테고리의 다른 글
코틀린 코딩컨벤션 정리 (0) | 2021.12.13 |
---|---|
스트림 함수 (0) | 2021.08.04 |
Kotlin 코딩규칙 명명 규칙 (0) | 2021.07.07 |
Kotlin 코딩규칙 소스 코드 구성 (0) | 2021.07.07 |
메모리 구조(static, stack, heap) (0) | 2021.03.29 |