Lesson 1: Kotlin basics

HanbinΒ·2021λ…„ 8μ›” 2일
0

Teach Android Development

λͺ©λ‘ 보기
1/13
post-thumbnail

πŸ’‘ Teach Android Development

κ΅¬κΈ€μ—μ„œ μ œκ³΅ν•˜λŠ” ꡐ윑자료λ₯Ό μ •λ¦¬ν•˜κΈ° μœ„ν•œ ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.

Android Development Resources for Educators

Operators

μˆ˜ν•™ μ—°μ‚°μž

  • + - * / %

증가 및 κ°μ†Œ μ—°μ‚°μž

  • ++ --

비ꡐ μ—°μ‚°μž

  • < <= > >=

ν• λ‹Ή μ—°μ‚°μž

  • =

λ“±ν˜Έ μ—°μ‚°μž

  • == !=

Data types

Integer types


μ •μˆ˜ν˜• νƒ€μž…μ˜ 경우 Int의 λ²”μœ„λ₯Ό λ„˜μ–΄μ„œμ§€ μ•ŠμœΌλ©΄ Int둜 μ΄ˆκΈ°ν™”λ˜κ³  λ„˜μ–΄μ„€ 경우 Long으둜 μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€.

val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1

Floating-point types


μ†Œμˆ˜ 뢀뢄이 μžˆλŠ” 숫자둜 μ΄ˆκΈ°ν™”ν•  수 있으며, λ§ˆμΉ¨ν‘œλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€. μ†Œμˆ˜λ‘œ μ΄ˆκΈ°ν™”λœ 경우 Double둜 νŒλ‹¨ν•©λ‹ˆλ‹€.

val pi = 3.14 // Double
// val one: Double = 1 // Error: type mismatch
val oneDouble = 1.0 // Double

val e = 2.7182818284 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817

Characters and Boolean

Characters

  • 16bits
  • 16-bit Unicode character
  • μž‘μ€ λ”°μ˜΄ν‘œλ‘œ λ¬ΆμŠ΅λ‹ˆλ‹€. '1'
  • νŠΉμˆ˜λ¬ΈμžλŠ” escaping backslash둜 μ‹œμž‘ν•©λ‹ˆλ‹€.\
val aChar: Char = 'a'

println(aChar) // a
println('\n') // prints an extra newline character
println('\uFF00') // οΌ€

Boolean

  • 8bits
  • True or false 두가지 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—°μ‚° μž‘μ—…μ— ν™œμš©
    - ||– disjunction (logical OR)
    - &&– conjunction (logical AND)
    - !- negation (logical NOT)
val myTrue: Boolean = true
val myFalse: Boolean = false
val boolNull: Boolean? = null

println(myTrue || myFalse) // true
println(myTrue && myFalse) // false
println(!myTrue) // false

Type casting

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char
val b: Byte = 1 // OK, literals are checked statically
// val i: Int = b // ERROR
val i1: Int = b.toInt()

note: κΈ΄ 숫자의 경우 Underscoresλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
val oneMillion = 1_000_000
val idNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

String

일반적으둜 ν°λ”°μ˜΄ν‘œ(")둜 묢인 λ¬Έμžμ—΄μ΄λ©° escaped 문자λ₯Ό ν‘œν•¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

val s = "Hello, world!\n"

μ›μ‹œ λ¬Έμžμ—΄μ€ μ‚Όμ€‘λ”°μ˜΄ν‘œ (""")λ₯Ό μ‚¬μš©ν•΄ escaped 문자λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠμœΌλ©° 쀄 λ°”κΏˆ 및 기타 문자λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

val s = """
    Hello, world!
            
"""

String templates

ν…œν”Œλ¦Ώ ν‘œν˜„μ‹μ€ λ‹¬λŸ¬ 기호($)둜 ν‘œμ‹œλ˜λ©° κ°„λ‹¨ν•œ 값을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

val i = 10
println("i = $i") // prints "i = 10"

ν‘œν˜„μ‹μ˜ 경우 μ€‘κ΄„ν˜Έλ‘œ λ¬Άμ–΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

val s = "abc"
println("$s.length is ${s.length}") // prints "abc.length is 3"

μ›μ‹œ λ¬Έμžμ—΄κ³Ό escaped λ¬Έμžμ—΄μ— λͺ¨λ‘ μ‚¬μš©ν•  수 있으며 일반적인 $λ₯Ό μ‚¬μš©ν•  λ•Œ μ•„λž˜μ™€ 같이 ν‘œν˜„ν•©λ‹ˆλ‹€.

val price = """
    ${'$'}_9.99
"""
val price = "\$_9.99"
val price = "${'$'}_9.99"

Variables

λ³€μˆ˜ μ„ μ–Έ μ‹œ μ»΄νŒŒμΌλŸ¬κ°€ μœ ν˜•μ„ μΆ”λ‘ ν•˜λ©°, ν•„μš”ν•œ 경우 λͺ…μ‹œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var width = 12 // Int
var widthInt: Int = 12 // Int

κ°€λ³€, λΆˆλ³€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. ( λΆˆλ³€ λ³€μˆ˜λ₯Ό κ°•μ œν•˜μ§€ μ•Šμ§€λ§Œ μΆ”μ²œλ©λ‹ˆλ‹€. )

  • Mutable (κ°€λ³€)
var count = 1
count = 2
  • Immutable (λΆˆλ³€)
val size = 1
size = 2 // Error: val cannot be reassigned

Conditionals

if/else statements

// multiple cases
val guests = 30
if (guests == 0) {
    println("No guests")
} else if (guests < 20) {
    println("Small group of people")
} else {
    println("Large group of people!")
}
  
// Range
val numberOfStudents = 50
if (numberOfStudents in 1..100) {
    println(numberOfStudents)
}
  
// As expression
val max = if (a > b) a else b

When statement

κ°œλ°œμ„ 진행할 λ•Œ 자주 μ“°μ΄λ―€λ‘œ, λ‹€μ–‘ν•œ μ˜ˆμ‹œλ₯Ό μ΅ν˜€λ‘λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

when (results) {
    0  -> println("No results")
    in 1..39 -> println("Got results!")
    40, 41 -> println("Results 40, 41!")
    !in 42..45 -> print("results is outside the range")
    else -> println("That's a lot of results!")
}

For loops

// Using element
for (item in collection) print(item)
    
// Using index
for (i in array.indices) 
    println(array[i])
}
    
// Using both
for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}
  
// Range
for (i in 1..3) {
    println(i)
}
  
// Down and step
for (i in 6 downTo 0 step 2) {
    println(i)
}

While loops

whileκ³Ό do-while λ£¨ν”„λŠ” 쑰건이 λ§Œμ‘±λ˜λŠ” λ™μ•ˆ κ³„μ†ν•΄μ„œ ꡬ문을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

  • while은 쑰건을 ν™•μΈν•œ λ’€, 만쑱되면 ꡬ문을 μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • do-while은 ꡬ문이 μ‹€ν–‰λœ λ‹€μŒ 쑰건을 ν™•μΈν•œλ‹€. 쑰건에 관계없이 ν•œ 번 이상 μ‹€ν–‰λ©λ‹ˆλ‹€.
var bicycles = 0
while (bicycles < 50) {
    bicycles++
}

do {
    bicycles--
} while (bicycles > 50)

Repeat loops

repeat(2) {
    print("Hello!")
}

Lists and arrays

Lists

  • μ •λ ¬λœ elements의 λͺ¨μŒμž…λ‹ˆλ‹€.
  • elementsλŠ” 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • elemesntsλŠ” 쀑볡이 κ°€λŠ₯ν•˜λ©° μˆœμ„œκ°€ μ€‘μš”ν•©λ‹ˆλ‹€.

Immutable list

listOf()λ₯Ό μ‚¬μš©ν•΄ λΆˆλ³€ 리슀트λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

val instruments = listOf("trumpet", "piano", "violin")
myList.remove("violin") // Error

Mutable list

mutableListOf()λ₯Ό μ‚¬μš©ν•΄ κ°€λ³€ 리슀트λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

val myList = mutableListOf("trumpet", "piano", "violin")
myList.remove("violin")

note: val둜 μ„ μ–Έλœ 경우 list 자체λ₯Ό λ³€κ²½ν•  순 μ—†μ§€λ§Œ, listμ•ˆμ˜ 속성은 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Arrays

  • μ—¬λŸ¬ ν•­λͺ©μ„ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • elementsλŠ” 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • elementsλŠ” λ³€κ²½ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 크기가 κ³ μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • arrayOf()λ₯Ό 톡해 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
    val pets = arrayOf("dog", "cat", "canary")

Arrays with mixed or single types

val mix = arrayOf("hats", 2)
val numbers = intArrayOf(1, 2, 3)

Combining arrays

+ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ κ²°ν•©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

val numbers = intArrayOf(1,2,3)
val numbers2 = intArrayOf(4,5,6)
val combined = numbers2 + numbers
println(Arrays.toString(combined)) // [4, 5, 6, 1, 2, 3]

Null safety

Kotlin은 null μ°Έμ‘° μœ„ν—˜μ„ μ œκ±°ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

Variables cannot be null

기본적으둜 variablesμ—μ„œ null은 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

var numberOfBooks: Int = null
// error: null can not be a value of a non-null type Int

Safe call operator

safe call operator(?)λ₯Ό 톡해 variable에 null을 λͺ…μ‹œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var numberOfBooks: Int? = null

Testing for null

numberOfBooks이 null이 μ•„λ‹Œμ§€ ν™•μΈν•œ λ’€ 값을 μ€„μž…λ‹ˆλ‹€.

var numberOfBooks = 6
if (numberOfBooks != null) {
    numberOfBooks = numberOfBooks.dec()
}

safe call operatorλ₯Ό μ‚¬μš©ν•œ λ°©μ‹μž…λ‹ˆλ‹€.

var numberOfBooks = 6
numberOfBooks = numberOfBooks?.dec()

The !! operator

variableκ°€ null이 μ•„λ‹Œ 것이 ν™•μ‹€ν•œ 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ variable이 null일 경우 NullPointerException이 λ°œμƒν•˜λ‹ˆ μ£Όμ˜ν•΄μ•Όν•©λ‹ˆλ‹€. (νŠΉλ³„ν•œ 상황을 μ œμ™Έν•˜κ³ λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.)

val len = s!!.length
// s 값이 널일 경우 NullPointerException λ°œμƒ

Elvis operator

(?:) operatorλ₯Ό μ‚¬μš©ν•˜μ—¬ null인 경우λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€

val l = b?.length ?: -1

μ°Έμ‘°

0개의 λŒ“κΈ€