본문 바로가기

AndroidCodelabs

[Kotlin Bootcamp for Programmers] - 2. Kotlin basics 요약 공부(1)

시작하기에 앞서

  1. 필요한 기본지식
    • IntelliJ IDEA 로 새로운 프로젝트 만들기
    • Kotlin REPL코드 실행하는법
  1. 배울것
    • kotlin data types, operators, variables
    • booleans와 조건문 동작
    • nullable, non-nullable 의 차이
    • array, list, loop 동작

Operators / type

  1. numeric operators
    • 코틀린은 다른 언어와 마찬가지로 +, -, *, / 를 사용한다
    • Int, Long, Double, Float 등의 숫자 type을 제공한다
    • <REPL 예제 실행 결과>
    • 정수형, 실수형 타입 간 교차 실행 해본다
    • number 함수
      kotlin은 숫자를 primitive(기본 형, 기본 type)으로 제공하지만, 객체와 같이 함수를 호출 할 수 있다

boxing

object 로 감싸는것

kotlin에서 자동으로 이루어진다
꼭필요한 경우가 아니면 메모리 효율 측면에서 불리하기때문에 사용을 권장하지 않는다

  • java에서는 primitive type / object type 모두 지원하는데 primitive type은 stack에 바로 저장이 가능하기 떄문에 heap을 할당하지 않아도 된다. 하지만 Collection을 사용하거나 제너릭으로 타입을 처리할때 등 auto-boxing된다
  • kotlin에서는 primitive type이 없다 .
  • kotlin의 성능상 의문은 잘 설명되어있는 블로그 글을 인용한다

코틀린에는 primitiveType은 없지만, 바이트코드로 변환 시 가능한 한 primitiveType으로 바꿔주어 연산 시 성능 문제는 발생하지 않을 것으로 보이며 Collection은 마찬가지로 autoBoxing 처리를 하고 있다.
출처: https://meteorkor.tistory.com/36 [Meteor]


 

2.  type

코틀린은 서로다른 타입을 자동으로 형변환 하지 않는다. 오류를 야기할수 있기 때문

명시적으로 casting이 필요함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val b2: Byte = 1
 
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1
 
val i5: String = b2.toString()
println(i5)
⇒ 1
 
val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
 
cs

 

3. variable types 변수 선언 타입

코틀린은 두가지 변수 선언 타입이 존재한다 .

  • val : 한번 선언한 후 값을 바꿀수 없다. 값을 변경하려고하면 오류발생
  • var: 초기화 후 값을 변경할 수 있다 .
  • 코틀린은 타입을 명시하지 않아도 할당된 값에따라 자동으로 타입을 유추한다
  • 한번 타입이 결정되면 다른 타입의 값을 할당할 수 없다

4. String

  • '+' - 연산을 통해 string을 결합할 수 있다
  • $, ${} - 구문을 통해 변수 및 구문을 string으로 결할 수 있다.
1
2
3
4
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
"I have ${numberOfFish + numberOfPlants} fish and plants"
cs

 

조건문, Booleans

  1. Boolean operators
    • <, ==, >, !=, <=, >=
      1. 기본적인 if문은 다른 언어와 동일하다
      2. range를 이용한 if문
1
2
3
4
val grade = 55
if (grade in 0..100) {
    print(grade)
}
cs

             3. when을 이용한 조건문
                기존에 if/ else if/ else 문을 사용하던것을 when으로 대체할 수 있다.

                다른 언어의 switch 문을 대체 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
when (numberOfFish) {
    0  -> println("Empty tank")
    in 1..39 -> println("Got fish!")
    else -> println("That's a lot of fish!")
}
 
when {
    (numberOfFish == 0-> println("Empty tank")
    (numberOfFish in 1..39->  println("Got fish!")
    else -> println("That's a lot of fish!")
}
cs

 

Nullability

  1. 변수는 기본적으로 non-null이다
1
var rocks: Int = null // error: null can not be a value of a non-null type Int
cs

   2. ? operator를 사용하면 nullable이 된다.

1
var marbles: Int? = null
cs

3. list 와 같은 복잡한 데이터 유형인 경우

  • list 자체가 null 이 되도록 할수있다
  • list 자체가 null 이 가능하지만 list내부 element는 null이 불가능 하도록 할수있다
  • list 자체, 내부 element 둘다 null 이 가능하게 할 수 있다.

4. ?, ?:

  • ? 연산을 이용하면 if, else문을 줄이고 null 체크가 가능고, null이 아닌경우에 해당하는 구문을 실행할수있다
1
2
3
4
5
6
7
8
9
// using if/else
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
 
// using the ? operator
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
cs

 

  • ?: 엘비스 연산자는 ?연산과 연달아(chain) null 체크가 가능하며 null 인경우에 해당하는 구문을 실행 할 수 있다.
1
fishFoodTreats = fishFoodTreats?.dec() ?: 0
cs

 

5. !! (bang bang / double-bang) operator

  • 강제 non-null 변환 연산자
  • 강제로 변환했는데 null인경우 exception이 발생된다
  • 추천하지 않으나 기존 java 코드의 사용으로 사용이 불가피한 경우만 사용..
1
val len = s!!.length   // throws NullPointerException if s is null
cs