문자열에서 식별자 이름 앞에 $를 넣으면 해당 식별자의 값을 문자열에 삽입 가능하다. ($ 뒤에 오는 것이 프로그램 식별자로 인식되지 않아도 별 다른 일이 발생하지는 않는다. ${} 안에 표현식을 배치하면 표현식의 반환 값이 문자열로 반환되어 결과가 문자열에 삽입된다.
연결(+)을 사용하여 문자열에 값을 삽입할 수 있다.
문자열에 따옴표와 같은 특수 문자가 포함되어야 하는 경우 \(백슬래시)로 해당 문자를 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!")
}
}
댓글