* 3학년 2학기 모바일 프로그래밍 수업 기록
현재 Android 어플리케이션을 개발하기 위해 주로 사용되는 언어는 바로 Kotlin이다.
Android 모바일 어플리케이션 개발 기록을 기록하기 앞서 Kotlin 문법에 대해 간단히 설명해보고자 한다.
(이 글은 기본적으로 Java를 알고 있다고 가정하고 정리한 글이다.)
1. 자료형
자료형은 다른 프로그래밍 언어와 매우 비슷하다.
숫자 자료형은 아래 이미지와 같다.
Boolean 자료형은 true와 false 두 가지 자료형을 포함하고 있다.
Charater은 Char타입으로 나타내는데 보통 ' '안에 작성한다.
특수 문자는 \(백슬래시)로 시작한다.
사용가능한 이스케이프 문자 목록은 아래와 같다.
- \t (탭)
- \b (백스페이스)
- \n (줄바꿈)
- \r (캐리지 리턴)
- \' (작은따옴표)
- \" (큰따옴표)
- \\ (역슬래시)
- \$ (달러 기호)
또한 다른 문자를 표현하려면 유니코드 이스케이프를 사용한다. (예: '\uFF00’)
다음은 String template이다.
문자열 템플릿이란 문자열 안에 변수나 식을 직접 삽입할 수 있는 기능을 말한다.
문자와 변수를 다로 연결할 필요없이 $기호를 사용해 간단하게 작성할 수 있다.
// 변수 이름 직접 삽입
val i = 0
println("i =$i") // 출력: i = 10
//{}안에 expression 삽입
val s = "abc"
println("$s length is ${s.length}") // 출력: abc length is 3
기본적으로 Kotlin에서 변수를 선언할 때는 var 키워드를 사용한다.
var 키워드를 사용해 선언한 변수는 재할당이 가능하다.
한 가지 Java와 다른 점은 타입 자동 추출이 가능하다는 것이다.
var x = 5 // Int로 타입이 자동으로 추출
x += 1
//자료형을 정의하면서 변수를 선언할 수 도 있다.
var y: Int
반면 상수는 val 키워드를 사용하여 선언한다.
읽기 전용이며 var과 달리 재할당이 불가능하다는 것이 특징이다.
val a: Int = 1 // 즉시 할당, 타입을 명시해서 선언할 수 있다.
val b = 2 // Int 타입이 자동으로 추론됨
val c: Int // 초기값이 없으면 타입을 반드시 명시해야 함
c = 3 // 처음 한 번만 할당 가능, 두번째 할당은 불가능
2. 조건문
if 문
if문의 기본구조는 다른 언어와 유사하다.
// 기본 구조
if (조건) {
// 조건이 true일 때 실행
}
// if ~ else
if (a > b) {
max = a
} else {
max = b
}
한 가지 다른 점은 kotlin에서 if는 값을 반환할 수 있는 표현식이기 때문에 변수에 바로 넣어서 사용할 수 있다는 것이다.
val max = if (a > b) a else b
위 식에서 표현되어있는 조건에 따라 그 결과 값이 max에 할당되게 됩니다.
Java와 C언어의 삼항 연산자 (a > b ? a : b)와 같은 역할을 한다.
아래 코드 처럼 여러 줄로 블럭을 작성하는 것 또한 가능하다.
val max = if (a > b) {
println("Choose a")
a // 마지막 줄이 반환됨
} else {
println("Choose b")
b
}
2. when 문
Kotlin에만 존대하는 조건문이 있는데 그것이 바로 when문이다.
다른 언어에도 비슷한 문법(switch-case 등)은 존재하지만 when이라는 이름과 형태는 Kotlin의 고유 형태이다.
when문이 switch-case보다 더 강력하고 유연하다는 것이 특징이다.
여러 조건을 분기 처리할 때 사용하며, 값 비교뿐만 아니라 범위, 타입 검사 등 다양한 조건을 처리할 수 있다.
기본적인 구조는 다음과 같다.
// 기본구조
when(parameter) {
condition -> action1
condition -> action2
else -> { //Note the block
action3
}
}
// 예시
val grade = "A+"
when(grade){
"A+" -> Log.d("ITM", "Oh.. great..!")
"B+" -> Log.d("ITM", "Hey?")
else -> {
Log.d("ITM", "I don't know who you are")
}
}
또 여러 조건을 ,로 묶어서 한 줄에 처리하는 것도 가능하다.
// 기본 구조
when (parameter) {
condition1, condition2 -> action1
else -> {// Note the block
action2
}
}
// 예시
when (grade) {
"A+", "B+", "C+" -> Log.d("ITM", "Oh.. great..!!")
"A", "B", "C" -> Log.d("ITM", "Hey?")
else -> Log.d("ITM", "I don't know who you are.")
}
범위(Range)와 조건을 when문에서 활용할 수 있는데,
in 혹은 !in을 사용해 값이 특정 범위에 속하는지 검사가 가능하다.
val score = 89
when (score) {
in 90..100 -> Log.d("ITM", "A+")
else -> Log.d("ITM", "resit!")
}
또 parameter가 없는 when문은 if-else if 체인의 대체로 사용가능하다.
val score = 49
when {
score > 90 -> Log.d("ITM", "A+")
score in 50..89 -> Log.d ("ITM", "A0")
else -> Log.d("ITM", "resit!!")
}
is 키워드를 사용하면 타입 체크도 가능하다.
val x: Any = 20.5
when (x) {
is Int -> Log.d("It's Int type")
is String -> Log.d("It's String type")
else -> Log.d("What is this?")
}
when문이 Java의 조건문과 비교했을 때 특별한 점은 단순한 제어문이 아니라 표현식으로도 사용할 수 있다는 점이다.
즉 값을 반환하여 변수에 할당할 수 있다.
val myScore = 80
val myGrade = when(myScore) {
in 90..100 -> "A+"
else -> "F"
}
Log.d("ITM, "My score is $myScore, so my grade is $myGrade")
3. Array 배열
배열은 기본적으로 고정 길이 데이터를 저장하는 자료구조로 한 번 크기를 정하면 변경할 수 없는 것이 특징이다.
다른 언어와 마찬가지로 인덱스(0부터 시작)으로 접근한다.
초기화 방법은 크게 2가지로 볼 수 있다.
먼저 Array()을 사용하여 크기를 지정하여 생성하는 경우가 있고, 두 번째로 arrayOf()를 사용하여 직접 값을 넣어 생성하는 경우가 있다.
// Array() 생성자: 크기, 초기화 함수
val squares = Array(5) { i -> i * i}
// 결과: [ 0, 1, 4, 9, 16]
//arrayOf(): 요소 직접 지정
val fruits = arrayOf("apple", "banana", "cherry")
Kotlin은 성능을 위해 각 기본형에 맞는 배열 타입을 제공한다.
배열 종류에는 ByteArray, ShortArray, IntArray, LongArray, CharArray, FloatArray, DoubleArray, BooleanArray가 있다.
val x: IntArray = intArrayOf(1,2,3)
var y = arrayOf("one", two","three")
val arr = IntArray(5)
// 결과: [0, 0, 0, 0, 0]
var arr2 = IntArray(5) { 42 }
// 결과: [42, 42, 42, 42, 42]
var arr3 = IntArray(5) { it + 1 }
// 결과: [1, 2, 3, 4, 5]
var arr4 = Array(5){i -> i * i}
// 결과: [0, 1, 4, 9, 16]
get(), set() 또는 [ ] 연산자를 사용하여 값에 접근할 수 있다.
| 동작 | 문법 | 설명 |
| 조회 | arr[index] | 특정 위치의 값 읽기 |
| 조회2 | arr.get(index) | get() 함수 사용 |
| 변경 | arr[index] = value | 인덱스로 값 변경 |
| 변경2 | arr.set(index, value) | set() 함수 사용 |
자주 쓰는 유틸리티 함수는 다음과 같다.
| 함수 | 설명 |
| size | 배열의 크기 반환 |
| first() / last() | 배열의 첫/마지막 요소 반환 |
| sort() | 오름차순 정렬 (원본 변경됨) |
| sortedArray() | 정렬된 새 배열 반환 |
| sortedArrayDescending() | 내림차순 정렬된 새 배열 반환 |
val x: IntArray = intArrayOf(1, 2, 3)
val y = arrayOf("one", "two", "three")
val arr = IntArray(5)
val arr2 = IntArray(5) { 42 }
var arr3 = IntArray(5) { it+1 }
var arr4 = Array(5){i-> i*i}
Log.d("ITM","x.size: ${x.size}")
Log.d("ITM","arr.size: ${arr.size}")
Log.d("ITM",Arrays.toString(x))
Log.d("ITM",Arrays.toString(y))
Log.d("ITM",Arrays.toString(arr))
Log.d("ITM",Arrays.toString(arr2))
Log.d("ITM",Arrays.toString(arr3))
Log.d("ITM",Arrays.toString(arr4))
val arr: IntArray = IntArray(10){it+1}
val first = arr[0]
val first2 = arr.first()
val first3 = arr.get(0)
val last = arr.last()
Log.d("ITM", "${Arrays.toString(arr)}")
Log.d("ITM", "first: $first $first2 $first3 last: $last")
arr[0] = 100
arr.set(1,200)
Log.d("ITM", "${Arrays.toString(arr)}")
arr.sort() // in-place sorting
val arr2 = arr.sortedArrayDescending() // return a new sorted array (desc.)
Log.d("ITM", "${Arrays.toString(arr)}")
Log.d("ITM", "${Arrays.toString(arr2)}")