본문 바로가기
프로그래밍/Kotlin

[Kotlin 기초 1] 기본 구문 (2)

by 채연2 2023. 2. 7.

 

 

2023.02.03 - [프로그래밍/Kotlin] - [Kotlin 기초 1] 기본 구문 (1)

 

[Kotlin 기초 1] 기본 구문 (1)

본격적으로 코딩하기에 앞서 기본 구문을 익혀야 예제도 따라할 수 있고 android에서 java와 kotlin의 구문이 어떻게 다른지도 익힐 겸 첫번째로 기본 구문(변수, 함수, 클래스, 반복문 등..)을 학습하

cording-cossk3.tistory.com

 

Contents

     

     

    Kotlin Programming Basics

    String

    문자열에서 식별자 이름 앞에 $를 넣으면 해당 식별자의 값을 문자열에 삽입 가능하다. ($ 뒤에 오는 것이 프로그램 식별자로 인식되지 않아도 별 다른 일이 발생하지는 않는다. ${} 안에 표현식을 배치하면 표현식의 반환 값이 문자열로 반환되어 결과가 문자열에 삽입된다.

     

    연결(+)을 사용하여 문자열에 값을 삽입할 수 있다.

     

    문자열에 따옴표와 같은 특수 문자가 포함되어야 하는 경우 \(백슬래시)로 해당 문자를 escape하거나 세 개의 따옴표(""")로 문자열 리터럴을 사용할 수 있다. 삼중 따옴표(""")를 사용하면 작은 따옴표(')로 묶인 문자열에 대해 수행하는 것과 동일한 방식으로 식의 값을 삽입한다.

     

    fun stringTest() {
       val answer = 42
       Log.e("KotlinTest", "Found $answer!")
       Log.e("KotlinTest", "printing a $1")
    }
    fun stringTest() {
       val s = "hi\n" // \n is a newline character
       val n = 11
       val d = 3.14
       Log.e("KotlinTest", "first: " + s + 
             "second: " + n + ", third: " + d)
       Log.e("KotlinTest", "printing a $1")
    }
    fun stringTest() {
       val condition = true
       Log.e("KotlinTest",
             "${if (condition) 'a' else 'b'}")  // [1]
       val x = 11
       Log.e("KotlinTest", "$x + 4 = ${x + 4}")
    }
    fun stringTest() {
       val s = "value"
       Log.e("KotlinTest", "s = \"$s\".")
       Log.e("KotlinTest", """s = "$s".""")
    }

     

    NumberType

    Kotlin은 Int유형을 유추할 수 있고, 가독성을 위해 숫자 값 내에 밑줄 허용한다.

     

    Double은 매우 크고 매우 작은 부동 소수점 숫자를 보유한다.

    Int.MAX_VALUE는 미리 정의된 Int가 가질 수 있는 가장 큰 숫자이다.

    Long.MAX_VALUE 또한 Long이 가질 수 있는 가장 큰 숫자이다. Int보다 훨씬 큰 값을 가질 수 있지만 Long은 여전히 크기 제한이 있다.

     

    overflow는 음수이고 예상보다 훨씬 작기 때문에 잘못된 결과를 생성한다. Kotlin은 잠재적인 overflow를 감지할 때마다 경고를 표시한다. 컴파일 중에서 항상 overflow를 감지할 수 없으며 허용할 수 없는 성능 영향을 생성하므로 overflow를 방지하진 않는다.

     

    fun numberTest() {
       val million = 1_000_000  // Infers Int
       Log.e("KotlinTest", "$million")
    }
    fun numberTest() {
       val numerator: Int = 19
       val denominator: Int = 10
       Log.e("KotlinTest", "${numerator % denominator}")
    }
    fun bmiMetric(
       weight: Double,
       height: Double
    ): String {
       val bmi = weight / (height * height)
       return if (bmi < 18.5) "Underweight"
             else if (bmi < 25) "Normal weight"
             else "Overweight"
    }
    
    fun numberTest() {
       val weight = 72.57 // 160 lbs
       val height = 1.727 // 68 inches
       val status = bmiMetric(weight, height)
       Log.e("KotlinTest", status)
    }
    fun numberTest() {
       val i: Int = Int.MAX_VALUE
       Log.e("KotlinTest", "${i + i}")
    }
    fun numberTest() {
       val i = 0          // Infers Int
       val l1 = 0L        // L creates Long
       val l2: Long = 0   // Explicit type
       Log.e("KotlinTest", "$l1 $l2")
    }
    fun numberTest() {
       val i = Int.MAX_VALUE
       Log.e("KotlinTest", "${0L + i + i}")
       Log.e("KotlinTest", "${1_000_000 * 1_000_000L}")
    }

     

    Booleans

    &&(and) 연산자는 좌측에 있는 boolean 표현식과 우측에 있는 boolean 표현식이 모두 true인 경우에만 true를 반환한다.

    ||(or) 연산자는 좌측 또는 우측 boolean 표현식 둘 중 하나가 true이거나 둘 다 true이면 true를 반환한다.

    &&와 ||의 우선 순위는 같으므로 괄호를 사용하여 우선순위를 지정한다.

     

    fun isOpen(hour: Int) {
       val open = 9
       val closed = 20
       Log.e("KotlinTest", "Operating hours: $open - $closed")
       val status1 =
          if (hour >= open && hour < closed) // [1]
             true
          else
             false
       val status2 = hour >= open && hour < closed
       Log.e("KotlinTest", "Open: $status1")
       Log.e("KotlinTest", "Open: $status2")
    }
    
    fun numberTest() = isOpen(6)
    fun isClosed(hour: Int) {
       val open = 9
       val closed = 20
       Log.e("KotlinTest", "Operating hours: $open - $closed")
       val status = hour < open || hour >= closed
       Log.e("KotlinTest", "Closed: $status")
    }
    
    fun numberTest() = isClosed(6)
    fun numberTest() {
       val sunny = true
       val hoursSleep = 6
       val exercise = false
       val temp = 55
    
       val happy1 = sunny && temp > 50 ||
             exercise && hoursSleep > 7
       Log.e("KotlinTest", "$happy1")
    
       val sameHappy1 = (sunny && temp > 50) ||
             (exercise && hoursSleep > 7)
       Log.e("KotlinTest", "$sameHappy1")
    
       val notSame =
             (sunny && temp > 50 || exercise) && hoursSleep > 7
       Log.e("KotlinTest", "$notSame")
    }

     

    while문

    반복에서 가장 기본적으로 사용되는 키워드이다.

    제어하는 boolean 표현식이 true인 한 블록을 반복한다. boolean 표현식은 루프 시작 시 한 번 체크되고 추가로 반복될 때마다 다시 체크된다.

     

    whie문과 do-while문의 차이점은 do-while문은 조건문이 처음에 false값을 반환하더라도 항상 한 번 이상 실행이 된다는 것이다. 그 후에 조건문이 false이면 실행되지 않는다.

     

    사용법

    while (Boolean-expression) {
        // Code to be repeated
    }

    do {
        // Code to be repeated
    } while (Boolean-expression)

     

    fun condition(i: Int) = i < 100  // [1]
    
    fun whileTest() {
       var str = ""
       var i = 0
       while (condition(i)) {         // [2]
          str += "."
          i += 10                      // [3]
       }
    
       Log.e("KotlinTest", str)
    }
    [1] : 비교 연산자 <는 boolean 결과를 생성하므로 반환 값으로 boolean 타입을 유추 가능
    [2] : condition(i)이 true를 반환하는 한 명령문을 반복
    [3] : i = i + 10
    fun condition(i: Int) = i < 100
    
    fun whileTest() {
       var str = ""
       var i = 0
       do {
          str += "."
          i += 10
       } while (condition(i))
    
       Log.e("KotlinTest", str)
    }
    fun whileTest() {
       var str = ""
       var n = 10
       val d = 3
       str += n
    
       while (n > d) {
          n -= d
          str += " - $d"
       }
       str += " = $n"
       Log.e("KotlinTest", str)
    
       var str2 = ""
       var m = 10
       str2 += m
    
       m %= d
       str2 += " % $d = $m"
       Log.e("KotlinTest", str2)
    }
    fun whileTest() {
       var str = ""
       var i = 0
       while (i < 4) {
          str += "."
          i++
       }
    
       Log.e("KotlinTest", str)
    }

     

     

    for문

    시퀀스의 각 값에 대해 코드 블록을 실행한다. 값 집합은  integer 범위, string, 또는 collection 등이 될 수 있다. in 키워드는 값을 단계별로 실행하고 있음을 나타낸다. 루프를 돌 때마다 v는 현재 v값의 다음 요소가 제공된다.

     

    역순으로 반복할 수도 있고, 기본 값을 1에서 다른 값으로 변경할 수도 있다.

     

    대괄호는 index로 문자에 액세스 할 수 있다. string은 문자를 0부터 카운트 하기 때문에 string[0]은 string의 첫 번째 문자를 의미한다. string.lastIndex는 문자열의 마지막 문자의 index를 의미한다.

     

    특정 작업을 고정된 횟수만큼 반복하려는 경우 for문 대신 repeat()를 사용할 수 있다. repeat는 키워드가 아닌 표준 라이브러리 함수이다.

     

    사용법

    for (v in values) {
        // Do something with v
    }

     

    fun forTest() {
       for (i in 1..3) {
          Log.e("KotlinTest", "Hey $i!")
       }
    }
    fun forTest() {
       val range1 = 1..10         // [1]
       val range2 = 0 until 10    // [2]
       Log.e("KotlinTest", "$range1")
       Log.e("KotlinTest", "$range2")
    }
    [1] : .. 구문을 사용하여 결과 범위에 양쪽 두 범위 (1과 10)가 모두 포함
    [2] : until을 사용하여 끝 범위(10)를 제외
    fun forTest() {
       var sum = 0
       for (n in 10..100) {
          sum += n
       }
       Log.e("KotlinTest", "sum = $sum")
    }
    fun showRange(r: IntProgression) {
       var str = ""
       for (i in r) {
          str += "$i "
       }
       str += "    // $r"
       Log.e("KotlinTest", str)
    }
    
    fun forTest() {
       showRange(1..5)
       showRange(0 until 5)
       showRange(5 downTo 1)          // [1]
       showRange(0..9 step 2)         // [2]
       showRange(0 until 10 step 3)   // [3]
       showRange(9 downTo 2 step 3)
    }
    [1] : downTo는 감소하는 범위를 생성
    [2] : step은 간격 변경 (간격이 1이 아닌 2의 값으로 단계별 진행됨)
    [3] : until은 step과 함께 사용 가능
    fun forTest() {
       var str = ""
       for (c in 'a'..'z') {
          str += c
       }
       Log.e("KotlinTest", str)
    }
    fun forTest() {
       var str = ""
       val s = "abc"
       for (i in 0..s.lastIndex) {
          str += s[i] + 1
       }
       Log.e("KotlinTest", str)
    }
    fun hasChar(s: String, ch: Char): Boolean {
       for (c in s) {
          if (c == ch) return true
       }
       return false
    }
    
    fun forTest() {
       Log.e("KotlinTest", "${hasChar(" kotlin ", 't')}")
       Log.e("KotlinTest", "${hasChar(" kotlin ", 'a')}")
    }
    fun forTest() {
       repeat(2) {
          Log.e("KotlinTest", "hi!")
       }
    }

     

     

    320x100

    댓글