-
[Kotlin 문법 강의] 2주차: Kotlin 프로그래밍의 기초안드로이드 2024. 3. 5. 18:35
✏️ TIL(Today I Learned)
Text RPG를 만들기 시작했다. 이때 쓰이는 코드들을 이해할 수 있게 Kotlin의 조건문과 반복문 등 여러 문법들을 배우게 되었다.지금까지는 주로 if문을 사용했었는데, when()을 사용하여 가독성있는 코드를 작성할 수 있게 될 것 같다. 또한전위연산자와 후위연산자의 개념 명확히 인지하게 됐다.
그리고 프로그래밍에 앞서 코드 컨벤션에 대한 개념을 소개해주셨는데, 과거 팀 프로젝트를 진행하면서 사용한 코드 컨벤션을 가져와 봤다.
더보기1. 기본
기본적으로 공식문서인 Kotlin Coding Conventions과 Kotlin style guide를 준수한다.
1.1. 안드로이드 스튜디오
안드로이드 스튜디오의 Optimize imports 기능과 Reformat Code 기능을 이용한다.
- Optimize imports (Ctrl+Alt+O) : 사용하지 않는 Class를 import하고 있는 경우 제거해준다.
- Reformat Code (Ctrl+Alt+L) : 코드의 Kotlin Style Guide를 적용하여 Code를 Reformat한다.
2. Resource Naming Convention
2.1. ID
View 이름의 Pascal Case를 축약하여 Snake Case로 변환한 것을 Prefix로 사용한다.
2.1.1. Prefix
<WHAT>_<DESCRIPTION>
View PrefixTextView tv_ ImageView iv_ EditText et Button, ImageButton btn_ Toolbar tb_ RecyclerView rv_ Layout layout_ FragmentContainerView fcv_ BottomNavigationView bnv_ .. .. 2.1.2. 예시
@+id/tv_login @+id/et_password @+id/btn_login
2.2. Layout
Layout의 xml 파일의 이름은 .kt .java의 Pascal Case를 Snake Case로 변환하여 사용한다.
2.2.1. Prefix
<WHAT>_<WHERE>
View PrefixActivity activity_ Fragment fragment_ Dialog dialog_ Item item_ 2.2.2. 예시
SignInActivity.kt -> activity_sign_in.xml SignUpFragment.kt -> fragment_sign_up.xml item_user.xml
2.3. Drawable
2.3.1. Prefix
<WHAT_DESCRIPTION>
Drawable PrefixIcon ic_ Image img_ Background bg_ Shape <shape><color><radius>_<value> 2.3.2. 예시
ic_error.xml img_default_user.xml bg_main.xml rectangle_yellow_radius_20.xml
2.4. Menu
2.4.1. Prefix
menu_
2.5. Color
Color의 이름은 '색상_hex code' 으로 정한다.
2.5.1. 예시
<color name="black_000000">#FF000000</color> <color name="white_ffffff">#FFFFFFFF</color> <color name="blue_6195ed">#6195ED</color>
2.6. String
String 작성 시 주석을 통해 String이 사용되는 곳을 명시한다.
2.6.1. Prefix
<WHERE/WHAT>_<DESCRIPTION>
2.6.2. 예시
<!--Main Menu--> <string name="menu_daily">하루의 기록</string> <string name="menu_remind">평가 및 회고</string> <string name="menu_my">My</string> <!--Toolbar Title--> <string name="title_search">검색</string> <string name="title_settings">환경설정</string> <!--Dialog Message--> <string name="msg_login">로그인하시겠습니까?</string> <string name="msg_login_failed">로그인에 실패했습니다.</string> <string name="msg_password_error">비밀번호가 올바르지 않습니다.</string>
2.7. Style
View의 Pascal Case와 Style에 대한 설명을 조합하여 Style 명을 지정한다.
2.7.1. Prefix
<WHAT><Description>Style
2.7.2. 예시
<style name="LoginEditTextStyle"/> <style name="MainDialogStyle"/>
3. Kotlin Naming Convention
3.1. Class
클래스 파일 이름은 UpperCamelCase(파스칼 케이스(PascalCase))로 작성한다.
3.1.1. Prefix
<DESCRIPTION><WHAT>
Prefix는 해당 클래스와 관련성이 높은 것으로 임의로 작성한다.
3.1.2. 예시
MainActivity UserViewModel WriteFragment
3.2. Method
메소드 이름은 lowerCamelCase로 작성한다.
3.2.1. Prefix
"동사"로 시작하는 "동사구" 형태를 사용하되, 동사 원형만을 사용한다. 자주 사용하는 동사는 용법에 맞게 사용한다.
Word Descriptionshow Invisible한 것을 Visible하게 바꾸는 동작 check 어떤 것을 확인한 후 boolean 또는 값으로 반환하는 동작 is 어떤 것인지 확인한 후 boolean으로 반환하는 동작 has 어떤것을가지고 있는 확인 후 boolean으로 반환하는 동작 3.2.2. 예시
showList updateContacts
3.3. Variable
변수 이름 또한 마찬가지로 lowerCamelCase로 작성한다.
3.3.1. 예시
isEnd viewPagerAdapter
코드컨벤션을 사용 장점
- 코드의 가독성이 증가
- 유지보수가 용이
- 효율적인 협업 O
📝 공부한 Kotlin 요약 정리
입출력)
val dataString = readLine() //한 줄을 입력받아 문자열로 반환 println("나는 ${dataString }를 입력했어요!") // 결과: 나는 바나나를 입력했어요! // !! 연산자: Nullable 타입을 Non-nullable 타입으로 강제로 변환 // toInt(): 문자열을 정수로 변환 val dataNumber = readLine()!!.toInt() val sum = dataNumber + 3 println("입력은 ${dataNumber}인데 3을 더해서 ${sum }이예요!")
자료형)
이름 크기 특징 Long 64비트 정수 Int 32비트 정수 Short 16비트 정수 Byte 8비트 정수 Double 64비트 실수(소수) Float 32비트 실수(소수) Char 16비트 하나의 문자 Boolean 8비트 논리(참 또는 거짓) String X 문자열 변수와 상수)
- val: 읽기 전용 변수를 선언
한 번 초기화된 후에는 값을 변경 X (자바에서의 final 변수와 비슷함) - var: 값을 변경할 수 있는 변수를 선언
초기화된 후에도 값을 변경 O// var 변수이름:자료형(생략가능) = 값 val name: String = "John" // 문자열 val 변수 선언 var one1:Char = '김' //문자 var 변수 선언 // 상수는 주로 val 사용 val age: Int = 25 // 정수 val 변수 선언 var age = 25 // 자료형을 생략
연산자)
- 복합 대입 연산자
+=: 덧셈 후 할당 -=: 뺄셈 후 할당 *=: 곱셈 후 할당 /=: 나눗셈 후 할당 %=: 나머지 연산 후 할당 var x = 5 x += 3 // x = x + 3와 동일 println(x) // 출력 결과: 8 var y = 10 y -= 2 // y = y - 2와 동일 println(y) // 출력 결과: 8 var z = 4 z *= 2 // z = z * 2와 동일 println(z) // 출력 결과: 8 var w = 16 w /= 2 // w = w / 2와 동일 println(w) // 출력 결과: 8 var v = 11 v %= 3 // v = v % 3와 동일 println(v) // 출력 결과: 2
- 전위 & 후위 연산자
++: 변수의 값을 1 증가 (++x는 x = x + 1과 동일) --: 변수의 값을 1 감소 (--x는 x = x - 1과 동일) 증감연산자가 변수의 왼쪽에 위치하면 전위연산자 변수의 오른쪽에 위치하면 후위연산자 var z = 7 println("z++: ${z++}") // 출력: 7, z = z + 1 println("z: $z") // 출력: 8 var w = 10 println("++w: ${++w}") // 출력: 11, w = w + 1 println("w: $w") // 출력: 11
조건식)
- if-else
// 조건식 자리에는 true 또는 false // 조건식이 true일때 중괄호 안의 코드를 실행 if(조건식) { // 실행할 코드 } // 둘 중 한개의 코드만 실행 if(조건식) { // 조건식이 true일때 실행할 코드 } else { // 조건식이 false일때 실행할 코드 }
- when (else if가 많아질때는 when을 사용)
when(변수 또는 상수) { 값1 -> { // 실행할 코드 } 값2 -> { // 실행할 코드 } else -> { // 실행할 코드 } } // 예시 var todayNumber = readLine()!!.toInt() when(todayNumber) { 1 -> { println("재물이 들어올것입니다") } 2 -> { println("검정색을 조심하세요") } 3 -> { println("지인과의 관계에 조심하세요") } else -> { println("물을 조심하십시오...") } }
반복문)
- for문
// for: 지정된 시작 값부터 끝 값까지 반복문을 실행 for (i in 1..5) { println(i) } // forEach: 배열이나 컬렉션과 같은 iterable 객체를 순회할 때 사용 val numbers = listOf(1, 2, 3, 4, 5) numbers.forEach { println(it) } //결과 1 2 3 4 5 // 범위를 이용한 for: 범위를 이용하여 특정 조건에 따라 반복문을 실행 for (i in 1 until 6 step 2) { println(i) } //결과 1 3 5 // 반복문과 인덱스: 특정 범위에 대해 인덱스와 함께 반복문을 실행 val colors = arrayOf("Red", "Green", "Blue") for ((index, color) in colors.withIndex()) { println("Index: $index, Color: $color") } //결과 Index: 0, Color: Red Index: 1, Color: Green Index: 2, Color: Blue
- while문
// 코틀린의 while 반복문은 조건식, 증감식을 이용 while(조건식) { 소스코드 (로직) 증감식 } // 예 while (i < 10) { // 0부터 9까지 반복 i++ // i가 3이면 반복문을 중단 if (i == 3) { println("i가 3이므로 반복문을 종료합니다.") break // 가장 가까운 반복문에서 탈출하고 다음 블록으로 넘어가 } // i가 5이면 다음 반복으로 넘어감 if (i == 5) { println("i가 5이므로 다음 반복으로 이동합니다.") continue // 이후의 코드를 실행 X } println("현재 i 값은 $i 입니다.") }
🔎 전체 코드
WorldMain.kt
val worldName = "스코월드" var myName = readLine() var myAge = readLine()!!.toInt() var myJob = readLine() var isNamePass = true var isAgePass = true var isJobPass = true var names = arrayOf("참새", "꿩", "비둘기") for(name in names) { if(myName == name) { println("중복된 이름이 존재합니다.") isNamePass = false break } } if(myAge < 12) { println("12세 미만은 이용할 수 없습니다.") isAgePass = false } if(myJob == "전사") { println("일시적으로 전사를 이용할 수 없습니다.") isJobPass = false } // 모든 조건을 통과한 경우에만 환영 if(isNamePass && isAgePass && isJobPass) { println("==================${worldName}에 오신것을 환영합니다==================") println("당신의 정보는 다음과 같습니다.") println("이름: ${myName}입니다.") println("나이: ${myAge}입니다.") println("직업: ${myJob}입니다.") println("모험을 떠나 볼까요?") }
'안드로이드' 카테고리의 다른 글
[Kotlin 문법 강의] 4주차: 객체지향 프로그래밍의 심화 (0) 2024.03.06 [Kotlin 문법 강의] 3주차: Kotlin 객체 지향 프로그래밍의 기초 (0) 2024.03.06 [Kotlin 문법 강의] 1주차: Kotlin을 시작하기 전에 알아야할 내용 (0) 2024.03.05 [Android 개발 종합반] 3주차 - Mbti 테스트 (뷰페이저 ViewPager2) (0) 2024.02.28 [Android 개발 종합반] 2주차 - 로또번호생성기 (0) 2024.02.27