안드로이드/안드로이드 Kotlin

[코틀린-Kotlin Bootcamp] 2. Kotlin basics(자료형, 연산자, 배열, 리스트, 루프)

요빈 2023. 3. 7. 17:07

코틀린의 장점

 

- 강력한 코드

* 코틀린은 null을 허용하는 데이터 유형과 null을 허용하지 않는 데이터 유형을 구분해 null Exception과 같은 오류 포착에 큰 도움이 된다.

 

- 성숙한 플랫폼

 

- 간결하고 읽기 쉬운 코드: 코틀린으로 작성된 코드는 매우 간결하며 getter 및 setter와 같은 상용구 코드를 제거하도록 설계되었다.

* 코틀린은 간결함을 유지하면서 가독성을 보장하기 위해 "충분한 상용구 코드"를 사용하도록 설계되었다.

 

- Java와 상호 운용 가능: Java 라이브러리를 계속 사용할 수 있도록 컴파일 된다.


 

Kotlin basics - Kotlin의 기본사항

[ 숫자 ] 

 

Kotlin은 암시적 숫자 변환이 프로그램 오류의 일반적인 원인이기 때문에 숫자 유형 간에 암시적 형변환이 불가능하다. 즉, short값을 long 변수에 직접 할당하거나 Byte를 Int에 할당할 수 없다. 따라서 캐스팅을 통해 다른 유형의 값을 할당할 수 있다.

val i: Int = 6

val b = i.toByte() // 캐스트

val i1: Int = b // type mismatch Error

 

* toByte(), toInt(), toString(), toDouble과 같은 메서드를 통해 캐스팅 형변환이 가능하다.

 

긴 숫자 상수를 더 쉽게 읽을 수 있도록 숫자에 밑줄을 표시할 수 있다.

 

코틀린은 자바와 달리 변수 선언 시 val과 var을 사용하며 자료형 선언 없이(선택) 바로 값을 할당할 수 있다.

val과 var은 변수의 시작을 알리며 불변인지, 가변인지를 나타낸다.

공통적으로 초기화 시 값을 할당하지 않는다면 반드시 자료형을 명시해야 한다.

하지만, 컴파일러가 변수 타입을 추론할 수 있는 경우에는 생략 가능하다.

 

val

  - val로 지정된 불변 타입 변수는 초기에 값을 할당하면 나중에 값을 변경할 수 없으며, 값을 변경하게 되면 컴파일 에러가 발생한다.

     즉, 값을 초기화만 가능하고 변경은 불가하다는 뜻으로 Java에서 final과 같은 역할을 한다.

  - val은 초기화 후 값을 변경할 수 없지만 변수의 참조가 가리키는 객체의 내부 값은 변경 가능하다.

    예를 들어 val로 지정한 배열에 원소를 추가하는 등의 변경이 가능하다는 의미이다.

 

var

  - var로 지정된 가변 타입 변수는 초기화 후 값 변경이 가능하다. 하지만 다른 타입의 값을 넣을 수는 없다.

     String 타입으로 초기화를 한 뒤, Int 타입의 값을 넣을 수는 없다.

 

[ 문자열 ]

 

코틀린의 문자열은 문자열에 ", 단일 문자에 ' 를 사용하여 다른 프로그래밍 언어와 유사하게 작동한다.

문자열을 + 연산자로 연결할 수 있으며, 문자열 템플릿을 값과 연결하여 문자열 템플릿을 만들 수 있다.

일반 변수 뿐만 아니라 식이 포함된 문자열 템플릿을 만들 수 있으며 중괄호를 사용해 식을 정의한다.

val age = 23
val korea = 1

"I'm $age years old."
"My Korean age is ${age + korea}."

 

[ 조건 연산자 / bool ]

 

bool 연산자는 다른 언어들과 똑같고, if / else문 또한 자바와 동일하다.

range 연산은 다음과 같이 사용 가능하다.

val fish = 50
if (fish in 1..100) {
    println(fish)
}

다른 언어의 switch문과 비슷한 when문이 있다.

when (numberOfFish) {
    0  -> println("Empty tank")
    in 1..39 -> println("Got fish!")
    else -> println("That's a lot of fish!")
}

 

[ null을 허용하는 변수와 허용하지 않는 변수 ]

 

null과 관련된 프로그래밍 오류는 수많은 버그의 원인이었다. 

코틀린은 버그를 줄이기 위해 null을 허용하지 않는 변수를 도입했다.

 

코틀린에서 기본적으로 변수는 null일 수 없다.

변수가 null일 수 있음을 나타내려면 형식 뒤에 물음표 연산자를 붙이면 된다.

var marbles: Int? = null

* 리스트가 null이 되도록 허용할 수 있지만 null이 아닌 리스트에 null값인 요소가 들어갈 수 없다.

 

[ ? / ?: 연산자 ]

 

? 연산자를 사용하여 null인지 아닌지 확인할 수 있으며 if/else문을 작성하지 않아도 된다.

다음 코드는 fishFoodTreats가 null이 아니면 dec() 메소드를 실행하고 그렇지 않으면 ?: 뒤 값인 0을 사용하라는 의미이다.

var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec() ?: 0

not-null 어설션 연산자인 !!(double-bang)는 모든 값을 null이 아닌 유형으로 변환하고 값이 null 인 경우 예외를 throw한다.

 

[ 리스트/ 배열 / 루프 ] 

 

1. 리스트(List) -> 인덱스가 없음

 

list는 코틀린의 기본 유형이며 다른 언어들과 비슷하다.

listOf를 사용해 목록을 선언하며, 이 목록은 변경할 수 없다.

mutableListOf를 사용하면 변경할 수 있는 목록을 사용할 수 있다.

val school = listOf("mackerel", "trout", "halibut")
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")

remove() 메소드는 전달된 항목을 성공적으로 제거하면 true를 반환한다.

 

2. 배열(Array) -> 인덱스 있음, 한번 선언하면 수정 불가(크기 고정)

 

Array는 list와 달리 변경 가능한 버전 없이 배열을 생성하면 크기가 고정된다.

새 배열에 복사하는 경우를 제외하고 요소를 추가하거나 제거할 수 없다.

arrayOf를 사용해 문자열 배열을 선언한다. 

* arrayOf로 선언된 배열은 타입 지정이 없기 때문에 배열 내에 여러 자료형이 동시에 선언될 수 있다.

* intArrayOf와 같이 모든 요소가 하나의 유형으로 지정된 배열을 선언할 수도 있다. 배열 간 +연산 가능

val school = arrayOf("shark", "salmon", "minnow")
val mix = arrayOf("fish", 2)

val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])

배열과 리스트 중첩 가능 -> 리스트 내 배열이 존재할수도, 배열 내 리스트가 존재할 수도 있음

배열 유틸리티를 사용하여 인쇄하지 않는 경우 코틀린은 배열의 내용 대신 주소를 인쇄한다.

-> java.util.Arrays.toString( arr ) 를 사용해 print 해야 함 / 리스트는 그냥 출력 가능!

 

배열을 0으로 초기화하는 대신 코드로 초기화할 수 있다.

초기화 코드는 중활호{} 사이에 있다. it(iterator)는 0부터 시작하는 배열 인덱스를 뜻한다.

val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))

⇒ [0, 2, 4, 6, 8]

3. 루프(반복문)

 

- for 루프를 사용해 배열을 반복하고 요소를 인쇄한다.

- 코틀린에서는 요소와 인덱스를 동시에 반복할 수 있다.

- 숫자 또는 문자 범위를 지정할 수 있으며, 스텝과 방향(downTo) 또한 지정할 수 있다.

val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
    print(element + " ")
}

for ((index, element) in school.withIndex()) {
    println("Item at $index is $element\n")
}

for (i in 1..5) print(i)
⇒ 12345

for (i in 5 downTo 1) print(i)
⇒ 54321

for (i in 3..6 step 2) print(i)
⇒ 35

for (i in 'd'..'g') print (i)
⇒ defg

다른 언어와 마찬가지로 while, do... while 루프와 증감 연산자(++, --), repeat 반복문이 있다.

var bubbles = 0
while (bubbles < 50) {
    bubbles++
}

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

repeat(2) {
    println("A fish is swimming")
}

* IntelliJ IDEA에서 REPL 사용 : Tools > Kotlin > Kotlin REPL

 

* 아래 과정을 공부하며 작성한 글입니다.

https://developer.android.com/codelabs/kotlin-bootcamp-basics#0

 

Kotlin Bootcamp for Programmers 2: Kotlin basics  |  Android Developers

Use REPL to learn about basic syntax, data types, variables, operators, control structures, and nullability in Kotlin.

developer.android.com