안녕하세요 공공돌🧸 입니다!!
우아한테크코스 프리코스를 진행하면서 제가 부족한 게 어떤 점인지 보이고 공부를 더 하게 돼서 좋은 것 같아요. 지금은 OOP, TDD의 개념을 잡으면서 미션을 진행하고 있는데 시간이 나면 OOP와 TDD에 대해서도 올리도록 하겠습니다.
( 추가로 회고록까지.. 하하하하ㅏㅎ🤪🤪 )
오늘은 코틀린 코드 컨벤션에서 명명규칙(Naming rules)에 대해 번역과 함께 설명을 해보려고 합니다.
이 글을 읽으시는 분들이 이해가 잘 되셨으면 좋겠습니다!!
Coding conventions | Kotlin
kotlinlang.org
전체적인 코드 컨벤션은 위에 들어가시면 볼 수 있습니다.
명명 규칙( Naming rules )
Kotlin의 패키지 및 클래스 명명 규칙은 매우 간단합니다.
패키지 이름은 항상 소문자이며 밑줄( org.example.project)을 사용하지 않습니다.
여러 단어로 구성된 이름을 사용하는 것은 일반적으로 권장되지 않지만, 여러 단어를 사용해야 하는 경우에는 단어를 연결하거나 카멜 케이스 표기( org.example.myProject)를 사용할 수 있습니다.
클래스와 객체의 이름은 대문자로 시작하고 카멜 케이스를 사용합니다.
open class DeclarationProcessor { /*...*/ }
object EmptyDeclarationProcessor : DeclarationProcessor() { /*...*/ }
📝 카멜 케이스란?
카멜 케이스(Camel Case)는 프로그래밍에서 변수, 함수, 메서드, 클래스 등의 이름을 짓는데 사용되는 명명 규칙 중 하나입니다.
카멜 케이스는 단어나 구문을 구별하기 위해 단어의 첫 글자를 소문자로 시작하고, 그 뒤에 오는 각 단어의 첫 글자를 대문자로 시작하는 방식으로 이름을 작성합니다.
이때, 띄어쓰기나 특수 문자는 사용하지 않고 단어 사이를 구별하는 데 대문자를 활용합니다.
카멜 케이스의 두 가지 형태
- Lower Camel Case (소문자 카멜 케이스): 첫 번째 단어의 첫 글자는 소문자로 시작하고, 이후의 단어의 첫 글자는 대문자로 시작합니다. 예를 들면, myVariable, calculateTotalAmount, getUserInfo와 같은 형태입니다.
- Upper Camel Case (대문자 카멜 케이스 또는 Pascal Case): 첫 번째 단어부터 모든 단어의 첫 글자를 대문자로 시작합니다. 예를 들면, MyClass, CalculateTotalAmount, GetUserInfo와 같은 형태입니다. 주로 클래스명을 작성할 때 사용됩니다.
카멜 케이스는 다양한 프로그래밍 언어에서 사용되며, 코드의 가독성을 높이고 명명 규칙을 일관되게 유지하기 위한 중요한 요소 중 하나입니다. 이름을 읽을 때 각 단어의 경계가 명확하게 보이므로 코드를 이해하고 유지보수하기가 쉬워집니다.
함수 이름( Function names)
함수, 속성 및 지역 변수의 이름은 소문자로 시작하고 밑줄 없이 카멜 케이스를 사용합니다.
fun processDeclarations() { /*...*/ }
var declarationCount = 1
예외로 클래스 인스턴스를 생성하는 데 사용되는 팩토리 함수는 추상 반환 유형과 동일한 이름을 가질 수 있습니다.
interface Foo { /*...*/ }
class FooImpl : Foo { /*...*/ }
fun Foo(): Foo { return FooImpl() }
테스트 방법의 이름( Names for test methods )
테스트에서는(그리고 테스트 에서만 ) 백틱으로 묶인 공백과 함께 메서드 이름을 사용할 수 있습니다.
이러한 메서드 이름은 현재 Android 런타임에서 지원되지 않습니다.
테스트 코드에서는 메서드 이름의 밑줄도 허용됩니다.
class MyTestCase {
@Test fun `ensure everything works`() { /*...*/ }
@Test fun ensureEverythingWorks_onAndroid() { /*...*/ }
}
속성 이름( Property names )
상수의 이름 (const val 및 불변 데이터를 저장하는 top-level 또는 object val 프로퍼티)의 이름은 UPPERCASE_UNDERSCORE_SEPARATED (스크리밍 스네이크 케이스) 명명 규칙을 사용합니다.
const val MAX_COUNT = 8
val USER_NAME_FIELD = "UserName"
동작 또는 변경 가능한 데이터가 있는 개체를 보유하는 최상위 수준 또는 개체 속성의 이름은 카멜 케이스 이름을 사용해야 합니다.
val mutableCollection: MutableSet<String> = HashSet()
싱글톤 객체에 대한 참조를 보유하는 속성의 이름은 선언과 동일한 명명 스타일을 사용할 수 있습니다
만약 어떤 클래스가 싱글톤 객체를 정의하고 그 객체를 참조하는 프로퍼티를 가지고 있다면, 이 프로퍼티의 이름을 싱글톤 객체의 선언과 동일한 방식으로 명명할 수 있다는 것을 의미합니다.
이것은 코드의 일관성을 유지하고 객체와 관련된 프로퍼티 이름을 쉽게 식별할 수 있도록 도와줍니다.
object MySingleton {
fun doSomething() {
// 싱글톤 객체의 동작
}
}
class MyClass {
val mySingletonReference: MySingleton = MySingleton
// 위 문장에 따라 프로퍼티 이름은 싱글톤 객체의 이름과 동일하게 명명할 수 있음
}
열거형 상수의 경우 사용법에 따라 대문자 밑줄로 구분된 이름(스크리밍 스네이크 케이스 _) 또는 대문자 카멜 케이스 이름을 사용하는 것이 좋습니다 .
enum class DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY
}
enum class Month {
January, February, March
}
둘 다 유효한 명명 방식이며, 사용자의 기호나 코드베이스에 따라 선택할 수 있습니다. 코드베이스 내에서 일관성을 유지하는 것이 중요하며, 일관성 있는 명명 스타일을 선택하고 준수하는 것이 좋습니다.
📝 스크리밍 스네이크 케이스란?
스크리밍 스네이크 케이스(스크림블 케이스, SCREAMING_SNAKE_CASE)는 모든 글자를 대문자로 작성하고, 각 단어 사이를 밑줄(_)로 구분하는 명명 규칙입니다.
이 명명 규칙은 상수나 상수 값의 이름을 작성할 때 주로 사용되며, 모든 글자가 대문자로 표현되어 있어서 "스크리밍" 또는 "외치는" 느낌을 준다고 해서 "스크리밍 스네이크 케이스"라고 불립니다.
이렇게 작성된 이름은 상수와 관련된 것임을 명확하게 나타내고, 각 단어나 용어가 밑줄로 구분되어 가독성이 좋아집니다.
지원 속성의 이름( Names for backing properties )
클래스에 개념적으로 동일하지만 하나는 공개 API의 일부이고 다른 하나는 구현 세부 사항인 두 개의 속성이 있는 경우 비공개 속성 이름의 접두사로 밑줄을 사용합니다.
class C {
private val _elementList = mutableListOf<Element>()
val elementList: List<Element>
get() = _elementList
}
📝 추가 설명
이 규칙은 주로 정보 은폐와 코드 가독성을 개선하는 데 도움을 주는데 사용됩니다.
구체적으로 다음과 같은 원칙을 따릅니다.
클래스 내에서 개념적으로 동일한 두 개의 속성이 존재한다고 가정을 하겠습니다.
하나의 속성은 클래스 외부에서 접근 가능한 공개 API의 일부로 사용될 것이며, 다른 하나는 클래스 내부에서만 사용될 것이며, 두 속성 중 하나는 공개 API에 속하므로 일반적인 명명 규칙을 따릅니다.
다른 하나는 클래스 내부에서만 사용되므로 접근을 제한하고 그 접두사로 밑줄(_)을 사용하여 명명합니다.
이렇게 하면 클래스 외부에서는 공개 API만 알아야 하고, 구현 세부 사항은 숨겨집니다.
코드로 예시를 들자면 아래와 같습니다.
class MySampleClass {
// 공개 API 속성
val publicProperty: Int = 10
// 비공개 속성, 구현 세부 사항을 나타내며 밑줄로 시작
private val _internalProperty: String = "Internal Data"
}
좋은 이름을 선택하자( Choose good names )
좋은 이름은 선택하는 것은 코드의 가독성을 향상시키고, 클래스와 메서드가 하는 일을 명확하게 표현하기 위한 것입니다.
- 클래스 이름 : 클래스 이름은 클래스가 나타내는 엔터티(개념 또는 객체)를 명확하게 설명하는 명사 또는 명사구로 작성합니다.
클래스 이름은 클래스의 역할과 목적을 이해하기 쉽게 하기 위해 사용됩니다. - 메서드 이름: 메서드 이름은 메서드가 수행하는 작업을 나타내는 동사 또는 동사구로 작성합니다.
메서드 이름은 메서드가 어떤 동작을 수행하는지 빠르게 이해할 수 있도록 도움을 줍니다. - 메서드의 반환 값: 메서드의 이름은 메서드가 객체를 변경하는지 아니면 새로운 객체를 반환하는지를 암시해야 합니다.
이렇게 하면 메서드의 사용자가 메서드 동작을 이해하고 예측하기 쉽습니다. - 의미 없는 단어 제거: 클래스나 메서드 이름에서 의미 없는 단어(예: "Manager", "Wrapper")는 피하는 것이 좋습니다. 이름에는 엔터티의 목적이 명확하게 나타나야 합니다.
- 약어 사용: 클래스나 메서드 이름에 약어를 사용할 때, 약어가 두 글자로 구성되어 있다면 대문자로 작성합니다. 예를 들어, "IOStream"은 "IO"와 "Stream"이라는 두 글자의 약어로 구성되어 대문자로 작성됩니다. 그러나 긴 약어의 경우에는 첫 글자만 대문자로 표시합니다. 예를 들어, "XmlFormatter"에서는 "XML"과 "Formatter"이라는 긴 약어 중 첫 글자만 대문자로 표시됩니다.
'Android' 카테고리의 다른 글
[ Kotiln Code conventions ] 서식 지정(Formatting) 2 (2) | 2023.10.30 |
---|---|
[ Kotiln Code conventions ] 서식 지정(Formatting) 1 (2) | 2023.10.30 |
[ Kotlin Code conventions ] 소스코드 구성(Source code organization) (1) | 2023.10.22 |
Kotlin 함수와 변수 (1) | 2023.10.19 |
코틀린(Kotlin) 이란? (1) | 2023.10.18 |