본문 바로가기

언어/Kotlin

[ 코틀린 / Kotlin ] 따라하면서 Kotlin 의 Coding Convention을 이해하자.

반응형

 

 

Kotlin에서의 코딩 관습(Coding Convention)은 코드를 작성할 때 일관성과 가독성을 높이기 위해 지켜야 할 일련의 규칙과 권장 사항을 의미합니다. 이러한 관습은 팀 간의 협업을 개선하고, 코드 유지보수성을 높이며, 오류를 줄이는 데 도움이 됩니다. Kotlin에서 널리 사용되는 코딩 관습을 예제를 통해 설명하겠습니다.

1. 변수와 상수의 네이밍 규칙

  • 변수상수의 이름은 낙타 표기법(CamelCase)을 사용하여 작성합니다.
  • 상수val 키워드를 사용하여 선언하며, 상수의 이름은 대문자로 쓰고, 단어 사이를 밑줄(_)로 구분하는 스네이크 케이스(SNAKE_CASE)를 사용합니다.
fun main() {
    val userName = "John Doe"  // 변수: 낙타 표기법 사용
    val MAX_RETRY_COUNT = 5    // 상수: 스네이크 케이스 사용

    println(userName)
    println(MAX_RETRY_COUNT)
}

2. 클래스와 함수의 네이밍 규칙

  • 클래스인터페이스 이름은 파스칼 표기법(PascalCase)을 사용하여 작성합니다.
  • 함수 이름은 낙타 표기법(CamelCase)을 사용하여 작성합니다.
class Person(val firstName: String, val lastName: String)  // 클래스: 파스칼 표기법 사용

fun getFullName(person: Person): String {  // 함수: 낙타 표기법 사용
    return "${person.firstName} ${person.lastName}"
}

fun main() {
    val person = Person("John", "Doe")
    println(getFullName(person))  // 출력: John Doe
}

3. 줄바꿈과 들여쓰기

  • 들여쓰기는 공백 4칸을 사용합니다.
  • 함수 정의, 제어문, 클래스 정의 등의 중괄호 {}는 항상 줄바꿈하여 사용합니다.
  • 줄 길이가 길어질 경우, 매개변수연산자 기준으로 적절하게 줄바꿈을 사용합니다.
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)

    for (number in numbers) {  // 중괄호는 줄바꿈하여 사용
        if (number % 2 == 0) {
            println("Even: $number")
        } else {
            println("Odd: $number")
        }
    }
}

4. 함수 인자와 매개변수

  • 기본값을 가지는 매개변수는 함수 정의 시 =을 사용하여 정의할 수 있습니다.
  • 많은 매개변수를 가지는 함수는 매개변수를 각 줄에 하나씩 배치합니다.
fun greet(
    name: String,
    greeting: String = "Hello"  // 기본값을 가지는 매개변수
) {
    println("$greeting, $name!")
}

fun main() {
    greet("Alice")  // 출력: Hello, Alice!
    greet("Bob", "Welcome")  // 출력: Welcome, Bob!
}

5. 객체와 클래스의 사용

  • 데이터 클래스는 주로 데이터 홀더를 표현하는 데 사용되며, 간결한 코드로 여러 유틸리티 메서드를 자동으로 생성합니다.
  • 클래스는 필요에 따라 private 또는 internal 가시성을 사용하여 적절히 캡슐화합니다.
data class User(val name: String, val age: Int)  // 데이터 클래스

fun main() {
    val user = User("John Doe", 30)
    println(user)  // 자동으로 toString() 메서드가 생성되어 출력: User(name=John Doe, age=30)

    val anotherUser = user.copy(name = "Jane Doe")  // copy 메서드를 사용하여 새로운 객체 생성
    println(anotherUser)  // 출력: User(name=Jane Doe, age=30)
}

6. Null 안전성과 스마트 캐스팅

  • Null 안전성을 보장하기 위해, 변수가 null을 허용할 수 있는 경우 ?를 사용하여 타입을 선언합니다.
  • 스마트 캐스팅을 사용하여 타입 검사를 수행한 후 명시적인 캐스팅 없이 변수를 사용할 수 있습니다.
fun printLength(text: String?) {
    if (text != null) {  // Null 검사를 통해 스마트 캐스팅이 적용됨
        println("Length: ${text.length}")
    } else {
        println("Text is null")
    }
}

fun main() {
    printLength("Kotlin")  // 출력: Length: 6
    printLength(null)  // 출력: Text is null
}

7. 컬렉션과 함수형 프로그래밍

  • 컬렉션 함수(map, filter, reduce 등)를 사용하여 간결하고 가독성 높은 코드를 작성합니다.
  • 람다 표현식을 사용하여 함수형 프로그래밍 스타일로 컬렉션을 조작합니다.
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)

    val evenNumbers = numbers.filter { it % 2 == 0 }  // 필터링하여 짝수만 선택
    println(evenNumbers)  // 출력: [2, 4]

    val squaredNumbers = numbers.map { it * it }  // 각 숫자를 제곱
    println(squaredNumbers)  // 출력: [1, 4, 9, 16, 25]

    val sumOfNumbers = numbers.reduce { sum, number -> sum + number }  // 모든 숫자의 합 계산
    println(sumOfNumbers)  // 출력: 15
}

8. 확장 함수와 확장 프로퍼티

  • 확장 함수를 사용하여 기존 클래스에 새로운 기능을 추가할 수 있습니다.
  • 확장 프로퍼티를 사용하여 기존 클래스에 새로운 속성을 추가할 수 있습니다.
// String 클래스에 새로운 확장 함수 추가
fun String.addExclamation(): String {
    return "$this!"
}

// Int 클래스에 새로운 확장 프로퍼티 추가
val Int.squared: Int
    get() = this * this

fun main() {
    val text = "Hello, Kotlin"
    println(text.addExclamation())  // 출력: Hello, Kotlin!

    val number = 5
    println(number.squared)  // 출력: 25
}

9. 코루틴을 이용한 비동기 프로그래밍

  • 코루틴을 사용하여 간단하고 효율적인 비동기 프로그래밍을 구현합니다.
  • suspend 키워드를 사용하여 코루틴에서 일시 중단 가능한 함수를 정의할 수 있습니다.
import kotlinx.coroutines.*

suspend fun fetchData(): String {
    delay(1000)  // 1초 지연 (비동기 작업)
    return "Data from server"
}

fun main() = runBlocking {
    println("Fetching data...")
    val data = fetchData()  // 코루틴 내에서 호출
    println(data)  // 출력: Data from server
}

10. 주석과 문서화

  • 코드의 주석은 중요한 정보를 전달하거나, 복잡한 로직을 설명할 때 사용합니다.
  • KDoc 스타일의 주석을 사용하여 함수와 클래스의 문서를 작성합니다.
/**
 * 주어진 두 숫자를 더합니다.
 *
 * @param a 첫 번째 숫자
 * @param b 두 번째 숫자
 * @return 두 숫자의 합
 */
fun add(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    println(add(3, 5))  // 출력: 8
}

요약

Kotlin의 코딩 관습은 코드의 가독성과 유지보수성을 높이기 위한 일련의 규칙과 권장 사항을 포함합니다. 변수와 함수의 이름을 명확하게 작성하고, 적절한 줄바꿈과 들여쓰기를 사용하며, 객체와 컬렉션을 효율적으로 사용하고, null 안전성을 보장하는 등의 관습을 통해 Kotlin 코드는 더욱 일관되고 이해하기 쉬워집니다.

반응형