[코틀린-Kotlin Bootcamp] 2. Kotlin basics(자료형, 연산자, 배열, 리스트, 루프)
코틀린의 장점
- 강력한 코드
* 코틀린은 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