이 Codelab은 프로그래머를 위한 Kotlin 부트캠프 과정의 일부입니다. Codelab을 순서대로 진행한다면 이 과정을 통해 최대한의 가치를 얻을 수 있을 것입니다. 기존 지식에 따라 일부 섹션을 훑어볼 수도 있습니다. 이 교육 과정에서는 객체 지향 언어를 알고 Kotlin을 배우고자 하는 프로그래머를 대상으로 합니다.
소개
이 Codelab에서는 데이터 유형, 연산자, 변수, 제어 구조, null을 허용하는 변수와 null을 허용하지 않는 변수의 차이점 같은 Kotlin 프로그래밍 언어의 기본사항에 관해 알아봅니다. 이 교육 과정은 객체 지향 언어를 알고 Kotlin을 알아보려는 프로그래머를 대상으로 합니다.
이 과정의 강의는 하나의 샘플 앱을 빌드하는 대신 지식을 쌓을 수 있도록 만들어졌지만 서로 종속되지 않도록 익숙해져 있는 섹션을 훑어볼 수 있습니다. 이러한 사례를 연결하는 데 도움이 되는 예시는 대부분 수족관 테마를 사용합니다. 전체 수족관 이야기를 보려면 프로그래머를 위한 Kotlin 부트캠프 Udacity 과정을 확인하세요.
기본 요건
- IntelliJ IDEA에서 프로젝트를 만드는 방법
- IntelliJ IDEA에서 Kotlin 및 REPL (Read-Eval-Print Loop)에서 코드를 열고 실행하는 방법(Tools > Kotlin > Kotlin REPL)
학습할 내용
- Kotlin 데이터 유형, 연산자, 변수를 사용하는 방법
- 부울 및 조건 사용 방법
- null을 허용하는 변수와 null을 허용하지 않는 변수의 차이점
- Kotlin에서 배열, 목록, 루프 작동 방식
실습할 내용
- Kotlin REPL과 함께 Kotlin의 기본사항 알아보기
이 작업에서는 Kotlin 프로그래밍 언어의 연산자와 유형을 알아봅니다.
1단계: 숫자 연산자 살펴보기
- IntelliJ IDEA가 아직 열려 있지 않은 경우 엽니다.
- Kotlin REPL을 열려면 Tools 및 gt, Kotlin & gt, Kotlin REPL을 선택합니다.
다른 언어와 마찬가지로 Kotlin은 더하기, 빼기, 시간, 나누기에 +
, -
, *
, /
를 사용합니다. Kotlin은 Int
, Long
, Double
, Float
와 같은 다양한 숫자 유형도 지원합니다.
- REPL에 다음 표현식을 입력합니다. 결과를 확인하려면 각 항목 다음에
Control+Enter
(Mac은Command+Enter
)를 누릅니다.
1+1 ⇒ res8: kotlin.Int = 2 53-3 ⇒ res9: kotlin.Int = 50 50/10 ⇒ res10: kotlin.Int = 5 1.0/2.0 ⇒ res11: kotlin.Double = 0.5 2.0*3.5 ⇒ res12: kotlin.Double = 7.0
연산 결과가 피연산자의 유형을 유지하므로 1/2 = 0이지만 1.0/2.0 = 0.5입니다.
- 정수와 십진수를 다양하게 조합한 표현식을 시도해 보세요.
6*50 ⇒ res13: kotlin.Int = 300 6.0*50.0 ⇒ res14: kotlin.Double = 300.0 6.0*50 ⇒ res15: kotlin.Double = 300.0
- 숫자의 일부 메서드를 호출합니다. Kotlin은 숫자를 프리미티브로 유지하지만 숫자를 사용해 객체인 것처럼 숫자에서 메서드를 호출할 수 있습니다.
2.times(3) ⇒ res5: kotlin.Int = 6 3.5.plus(4) ⇒ res8: kotlin.Double = 7.5 2.4.div(2) ⇒ res9: kotlin.Double = 1.2
2단계: 유형을 사용하여 연습하기
Kotlin은 숫자 유형 간에 암시적으로 변환되지 않으므로 짧은 값을 긴 변수에 직접 할당하거나 Byte
를 Int
에 할당할 수 없습니다. 그 이유는 암시적 숫자 변환이 프로그램에서 일반적인 오류의 원인이기 때문입니다. 언제든지 전송을 통해 다양한 유형의 값을 할당할 수 있습니다.
- 가능한 변환 중 일부를 확인하려면 REPL에서
Int
유형의 변수를 정의합니다.
val i: Int = 6
- 새 변수를 만든 후 위에 표시된 변수 이름과
.to
를 입력합니다.
val b1 = i.to
IntelliJ IDEA에는 가능한 완료 목록이 표시됩니다. 이 자동 완성은 모든 유형의 변수와 객체에서 작동합니다.
- 목록에서
toByte()
를 선택한 다음 변수를 출력합니다.
val b1 = i.toByte()
println(b1)
⇒ 6
- 다른 유형의 변수에
Byte
값을 할당합니다.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1
val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected
val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected
val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
- 오류를 반환한 과제의 경우 이를 전송해 보세요.
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
- Kotlin에서는 긴 숫자 상수를 더 쉽게 읽을 수 있도록 적절하도록 숫자에 밑줄을 추가할 수 있습니다. 다른 숫자 상수를 입력해 보세요.
val oneMillion = 1_000_000 val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
3단계: 변수 유형의 값 알아보기
Kotlin은 변경 가능한 유형과 변경 불가능한 변수, 두 가지 유형의 변수를 지원합니다. val
을 사용하면 값을 한 번 할당할 수 있습니다. 다시 할당하려고 하면 오류가 발생합니다. var
을 사용하면 값을 할당한 다음 나중에 프로그램에서 값을 변경할 수 있습니다.
val
및var
를 사용하여 변수를 정의한 후 새 값을 할당합니다.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned
fish
가 var
으로 정의되므로 값을 할당한 후 새 값을 할당할 수 있습니다. aquarium
에 새 값을 할당하려고 하면 val
으로 정의되므로 오류가 발생합니다.
변수에 저장하는 유형은 컴파일러가 컨텍스트에서 파악할 수 있을 때 추론됩니다. 원하는 경우 콜론 표기법을 사용하여 언제든지 변수 유형을 명시적으로 지정할 수 있습니다.
- 일부 변수를 정의하고 유형을 명시적으로 지정합니다.
var fish: Int = 12
var lakes: Double = 2.5
본인 또는 컴파일러에 유형을 할당한 후에는 유형을 변경할 수 없거나 오류가 발생합니다.
4단계: 문자열 알아보기
Kotlin의 문자열은 문자열에 "
를 사용하고 단일 문자에 '
를 사용하는 다른 프로그래밍 언어의 문자열과 거의 동일하게 작동하며 +
연산자와 문자열을 연결할 수 있습니다. 문자열 템플릿을 값과 결합하여 만들 수 있습니다. $
variable
이름이 값을 나타내는 텍스트로 대체됩니다. 이를 변수 보간이라고 합니다.
- 문자열 템플릿을 만듭니다.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
- 표현식이 포함된 문자열 템플릿을 만듭니다. 다른 언어와 마찬가지로 값은 표현식의 결과일 수 있습니다. 중괄호
{}
를 사용하여 표현식을 정의합니다.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants
이 작업에서는 Kotlin 프로그래밍 언어로 부울 및 조건 확인에 관해 알아봅니다. 다른 언어와 마찬가지로 Kotlin에는 미만, 같음, 초과 등의 부울 및 부울 연산자(<
, ==
, >
, !=
, <=
, >=
)가 포함됩니다.
if
/else
문을 작성합니다.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
println("Good ratio!")
} else {
println("Unhealthy ratio")
}
⇒ Good ratio!
if
문에서 범위를 사용해 보세요. Kotlin에서 테스트하는 조건에서도 범위를 사용할 수 있습니다.
val fish = 50
if (fish in 1..100) {
println(fish)
}
⇒ 50
- 여러 사례를 포함하여
if
를 작성합니다. 더 복잡한 조건의 경우 논리적 및&&
, 논리 또는||
를 사용합니다. 다른 언어와 마찬가지로else if
를 사용하여 케이스를 여러 개 처리할 수 있습니다.
if (numberOfFish == 0) {
println("Empty tank")
} else if (numberOfFish < 40) {
println("Got fish!")
} else {
println("That's a lot of fish!")
}
⇒ That's a lot of fish!
when
문을 사용해 보세요. 다른 언어에서switch
문과 비슷한when
문을 사용하여 Kotlin에서if
/else if
/else
문 시리즈를 작성하는 더 좋은 방법이 있습니다.when
문의 조건도 범위를 사용할 수 있습니다.
when (numberOfFish) {
0 -> println("Empty tank")
in 1..39 -> println("Got fish!")
else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!
이 작업에서는 null을 허용하는 변수와 null을 허용하지 않는 변수에 대해 알아봅니다. null을 포함하는 프로그래밍 오류는 셀 수 없이 많은 버그의 원인이 되었습니다. Kotlin은 null을 허용하지 않는 변수를 도입하여 버그를 줄이고자 합니다.
1단계: null 허용 여부 알아보기
기본적으로 변수는 null
일 수 없습니다.
Int
를 선언하고null
를 할당합니다.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
- 유형 뒤에 물음표 연산자
?
를 사용하여 변수가 null일 수 있음을 나타냅니다.Int?
를 선언하고null
를 할당합니다.
var marbles: Int? = null
목록 등 다음과 같은 복잡한 데이터 유형이 있는 경우:
- 목록의 요소가 null이 되도록 허용할 수 있습니다.
- 목록은 null이 되도록 허용할 수 있지만, null이 아니면 요소가 null이 될 수 없습니다.
- 목록 또는 요소가 모두 null이 되도록 허용할 수 있습니다.
목록과 기타 복잡한 데이터 유형은 이후 작업에서 다룹니다.
2단계: ? ?: 연산자
?
연산자를 사용하여 null
를 테스트할 수 있으므로 많은 if
/else
문을 작성하는 수고를 덜 수 있습니다.
fishFoodTreats
변수가null
가 아닌지 확인하는 더 긴 코드를 작성합니다. 그런 다음 변수를 줄입니다.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
fishFoodTreats = fishFoodTreats.dec()
}
- 이제
?
연산자를 사용하여 Kotlin의 작성 방법을 살펴봅니다.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
?:
연산자를 사용하여 null 테스트를 체이닝할 수도 있습니다. 다음 예를 살펴보세요.
fishFoodTreats = fishFoodTreats?.dec() ?: 0
'fishFoodTreats
'가 약어인 경우 약식이며 이를 줄이고 사용합니다. 그 외의 경우에는 0인 ?:
뒤에 값을 사용합니다. fishFoodTreats
가 null
이면 평가가 중지되고 dec()
메서드가 호출되지 않습니다.
null 포인터에 관한 포인트
NullPointerExceptions
이(가) 마음에 든다면 Kotlin을 사용하여 계속 유지할 수 있습니다. null이 아닌 어설션 연산자 !!
(double-bang)는 모든 값을 null이 아닌 유형으로 변환하고, 값이 null
인 경우 예외를 발생시킵니다.
val len = s!!.length // throws NullPointerException if s is null
이 작업에서는 배열 및 목록에 관해 알아보고 Kotlin 프로그래밍 언어로 루프를 만드는 다양한 방법을 알아봅니다.
1단계: 목록 만들기
목록은 Kotlin의 기본 유형이며 다른 언어의 목록과 유사합니다.
listOf
를 사용하여 목록을 선언하고 출력합니다. 이 목록은 변경할 수 없습니다.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
mutableListOf
를 사용하여 변경할 수 있는 목록을 선언합니다. 항목 삭제
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true
remove()
메서드는 전달된 항목을 성공적으로 삭제하면 true
를 반환합니다.
2단계: 배열 만들기
다른 언어와 마찬가지로 Kotlin에는 배열이 있습니다. 변경 가능한 버전과 변경 불가능한 버전이 있는 Kotlin의 목록과 달리, 변경 가능한 버전은 Array
이 없습니다. 배열을 만들면 크기가 고정됩니다. 새 배열에 복사하는 경우를 제외하고 요소를 추가하거나 삭제할 수 없습니다.
val
및 var
사용에 대한 규칙은 배열과 동일합니다.
arrayOf
를 사용하여 문자열 배열을 선언합니다.java.util.Arrays.toString()
배열 유틸리티를 사용하여 출력합니다.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
arrayOf
로 선언된 배열에는 요소와 연결된 유형이 없으므로 여러 유형을 혼합하면 도움이 됩니다. 다양한 유형의 배열을 선언합니다.
val mix = arrayOf("fish", 2)
- 모든 요소에 대해 한 가지 유형으로 배열을 선언할 수도 있습니다.
intArrayOf()
를 사용하여 정수 배열을 선언합니다. 다른 유형의 배열에 해당하는 빌더 또는 인스턴스화 함수가 있습니다.
val numbers = intArrayOf(1,2,3)
- 두 배열을
+
연산자와 결합합니다.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
- 중첩된 배열과 목록의 다양한 조합을 시도해 보세요. 다른 언어와 마찬가지로 배열과 목록을 중첩할 수 있습니다. 즉, 한 배열 내에 배열을 배치하면 이 배열의 콘텐츠가 평면화된 배열이 아닌 배열이 됩니다. 한 배열의 요소도 목록이 될 수 있으며 목록의 요소는 배열일 수 있습니다.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]
첫 번째 요소인 numbers
는 Array
입니다. 배열 유틸리티를 사용하여 출력하지 않으면 Kotlin은 배열의 콘텐츠 대신 주소를 출력합니다.
- Kotlin의 한 가지 좋은 기능은 0으로 초기화하는 대신 코드로 배열을 초기화할 수 있다는 것입니다. 다음 예를 시도해 보세요.
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]
초기화 코드는 중괄호 {}
사이에 있습니다. 코드에서 it
는 0으로 시작하는 배열 색인을 나타냅니다.
3단계: 루프 만들기
이제 목록과 배열이 있으므로 예상대로 요소를 순환할 수 있습니다.
- 배열을 만듭니다.
for
루프를 사용하여 배열을 반복하고 요소를 출력합니다.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
print(element + " ")
}
⇒ shark salmon minnow
- Kotlin에서는 요소와 색인을 동시에 반복할 수 있습니다. 다음 예를 시도해 보세요.
for ((index, element) in school.withIndex()) {
println("Item at $index is $element\n")
}
⇒ Item at 0 is shark Item at 1 is salmon Item at 2 is minnow
- 다양한 단계 크기 및 범위를 사용해 보세요. 숫자 또는 문자 범위를 알파벳순으로 지정할 수 있습니다. 다른 언어와 마찬가지로 한 단계씩 발전할 필요는 없습니다.
downTo
을(를) 사용하여 뒤로 이동할 수 있습니다.
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
- 루프를 사용해 보세요. 다른 언어와 마찬가지로 Kotlin에는
while
루프,do...while
루프,++
및--
연산자가 있습니다. Kotlin에는repeat
루프도 있습니다.
var bubbles = 0
while (bubbles < 50) {
bubbles++
}
println("$bubbles bubbles in the water\n")
do {
bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")
repeat(2) {
println("A fish is swimming")
}
⇒ 50 bubbles in the water 49 bubbles in the water A fish is swimmingA fish is swimming
Kotlin은 연산자, 목록, 루프와 같은 기본 측면에서 다른 언어와 매우 비슷하지만 몇 가지 중요한 차이점이 있습니다.
다음 기능은 Kotlin에서 다른 언어의 기존 기능과 다를 수 있습니다.
- Kotlin 유형은 암시적으로 변환할 수 없습니다. 전송을 사용하세요.
val
로 선언된 변수는 한 번만 할당할 수 있습니다.- Kotlin 변수는 기본적으로 null을 허용하지 않습니다.
?
를 사용하여 변수를 null을 허용하도록 만듭니다. - Kotlin을 사용하면
for
루프에서 배열의 색인과 요소를 동시에 반복할 수 있습니다.
다음 Kotlin 프로그래밍 구조는 다른 언어의 구조와 유사합니다.
- 배열과 목록은 단일 유형과 혼합 유형을 가질 수 있습니다.
- 배열과 목록을 중첩할 수 있습니다.
for
,while
,do
/while
,repeat
로 루프를 만들 수 있습니다.when
문은 Kotlin의switch
문 버전이지만when
는 더 유연합니다.
Kotlin 문서
이 과정의 주제에 관해 자세히 알아보거나 도움이 필요한 경우 https://kotlinlang.org에서 시작하면 됩니다.
Kotlin 튜토리얼
https://try.kotlinlang.org 웹사이트에는 웹 기반 인터프리터라는 Kotlin Koans라는 풍부한 튜토리얼과 예시를 제공하는 완전한 참조 문서가 있습니다.
Udacity 과정
이 주제에 관한 Udacity 과정을 보려면 프로그래머를 위한 Kotlin 부트캠프를 참고하세요.
IntelliJ IDEA
IntelliJ IDEA에 관한 문서는 JetBrains 웹사이트에서 찾을 수 있습니다.
이 섹션에는 강사가 진행하는 과정의 일부로 이 Codelab을 통해 작업하는 학생들의 숙제 과제가 나와 있습니다. 강사는 다음을 처리합니다.
- 필요한 경우 과제를 할당합니다.
- 학생에게 과제 과제를 제출하는 방법을 알려주세요.
- 과제 과제를 채점합니다.
강사는 이러한 추천을 원하는 만큼 사용할 수 있으며 다른 적절한 숙제를 할당해도 좋습니다.
이 Codelab을 직접 학습하고 있다면 언제든지 숙제를 통해 지식을 확인해 보세요.
답변
질문 1
다음 중 변경 불가능한 문자열 목록을 선언하는 것은 무엇인가요?
▢ val school = arrayOf("shark", "salmon", "minnow")
▢ var school = arrayOf("shark", "salmon", "minnow")
▢ val school = listOf("shark", "salmon", "minnow")
▢ val school = mutableListOf("shark", "salmon", "minnow")
질문 2
다음 코드는 어떻게 출력되나요?for (i in 3..8 step 2) print(i)
▢ 345678
MRAID 468
MRAID 38
▢ 357
질문 3
이 코드에서 물음표의 목적은 무엇인가요?var rocks: Int? = 3
▢ rocks
변수의 유형이 고정되지 않음
▢ rocks
변수를 null로 설정할 수 있음
▢ rocks
변수를 null로 설정할 수 없음
▢ 변수 rocks
는 즉시 초기화되면 안 됩니다.
다음 강의로 진행합니다.
다른 Codelab으로 연결되는 링크를 포함한 과정 개요는 "프로그래머를 위한 Kotlin 부트캠프: 교육 과정에 오신 것을 환영합니다.를 참고하세요.