ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 Prefix
    TextView 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 Prefix
    Activity 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 Prefix
    Icon 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 Description
    show 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("모험을 떠나 볼까요?")
    }
Designed by Tistory.