/**
* 패키지 정의하기
* - 소스 상단에 정의한다
*/
package io.honeymon.kotlin.study.syntax
import java.util.*
// IDE에서 실행하려면 `main(args: Array<String>) {fun call}` 으로 해야하는군.
fun main(args: Array<String>) {
//call fun
}
/**
* =================================================
* 함수 정의하기
* =================================================
*/
fun sum(a: Int, b: Int): Int {
return a + b
}
fun sum2(a: Int, b: Int) = a + b
fun printSum1(a: Int, b: Int): Unit {
println("Sum of $a and $b is ${a + b}")
}
fun printSum2(a: Int, b: Int) {
println("Sum of $a and $b is ${a + b}")
}
fun printSum3(a: Int, b: Int) = println("Sum of $a and $b is ${a + b}")
/**
* ==================================================
* 지역변수 정의하기: 1회 할당가능한 읽기전용
* ==================================================
* - 함수(Function) 내에서 선언이 가능하군
* - 변수를 즉시할당하는 경우에는 최상위에서 선언가능
* - 지연할당(deferred assignment)의 경우에는 함수 내에 선언
*/
var a: Int = 1
var b = 2
fun localVal() {
val a: Int = 1 // 즉시할당
val b = 2 // 타입추론
val c: Int
c = 3
}
var x = 5
fun mutableVar() {
var x = 5 // `Int` 형 타입추론
x += 1
}
/**
* ==================================================
* 문자열 템플릿
* ==================================================
*/
fun stringTemplate() {
var a = 1
var s1 = "a is $a"
a = 2
var s2 = "${s1.replace("is", "was")}, but now is $a"
println(s2);
}
/**
* ==================================================
* 조건표현식
* ==================================================
*/
fun maxOf(a: Int, b: Int): Int {
return if (a > b) {
a
} else {
b
}
}
fun maxOf2(a: Int, b: Int): Int {
return if (a > b) a else b // == condition ? a : b
}
fun maxOf4(a: Int, b: Int) = if (a > b) a else b
/**
* 3항 연산자는 안되나?
*/
//fun maxOf2(a: Int, b: Int) = a > b ? a : b
// ==================================================
// Null 일 수 있는 값 사용 및 Null 체킹
// ==================================================
// <a href="https://kotlinlang.org/docs/reference/null-safety.html">Null-safety</a>
fun parseInt(str: String): Int? {
return str.toInt() // null 이 나올 수도 있고..
}
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
if (x != null && y != null) {
println(x * y)
} else {
println("either '$arg1' or '$arg2' is not a number")
}
}
fun printProduct2(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
if (x == null) {
println("Wrong number format in arg1: '$arg1'")
return
}
if (y == null) {
println("Wrong number format in arg2: '$arg2'")
return
}
println("either '$arg1' or '$arg2' is not a number")
}
/**
* ==================================================
* 타입 점검 및 자동 형변환
* ==================================================
* `is` 가 `instance of` 와 동일한 역할을 수행한다. 이건 좋구만
* 불변 지역변수 또는 속성이 특정형태로 체크되고 있는 경우에는 명시적으로 형변활 필요가 없다.
*/
//
fun getStringLength(obj: Any): Int? {
if (obj is String) { // `obj` 는 자동으로 `String` 으로 형변환된다.
return obj.length
}
// 타입체크된 `obj`는 여전히 `Any` 형태다.
return null
}
fun getStringLength2(obj: Any): Int? {
if (obj !is String) return null
// `obj` 는 자동으로 `String` 으로 형변환된다.
return obj.length
}
fun getStringLength3(obj: Any): Int? {
// `obj` 는 `&&` 쪽에서만 자동으로 형변환된다.
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
/**
* ==================================================
* 반복문
* ==================================================
*/
//
fun loop() {
val items = listOf("apple", "banana", "kiwi") // 리스트 만드는 거 간단해서 맘에 든다.
for (item in items) {
println(item)
}
}
fun loop2() {
val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) { // for 문 돌고 있는 Iterator 가 가지고 있는 index 값을 주는건가?
println("item at $index is ${items[index]}")
}
}
/**
* ==================================================
* while 반복문
* ==================================================
*/
//
fun whileLoop() {
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
}
/**
* ==================================================
* `when` 표현식
* ==================================================
* (switch - case) 보다 간결하다.
*/
//
fun describe(obj: Any): String? {
return when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
}
/**
* ==================================================
* 범위 ranges 사용하기
* ==================================================
* link:https://kotlinlang.org/docs/reference/ranges.html[Ragnes]
*/
//
fun range1() {
val x = 10
val y = 9
if (x in 1..y + 1) {
println("fits in range")
}
}
/*
* 범위를 넘어서는지 확인
*/
fun range2() {
val list = listOf("a", "b", "c")
if (-1 !in 0..list.lastIndex) {
println("-1 is out of range")
}
if (list.size !in list.indices) {
println("list size is out of valid list indices range too")
}
}
/*
* 범위에서 반복
*/
fun range3() {
for (x in 1..5) {
print(x)
}
}
/*
* 범위에서 지정한 크기만큼 건너뛰기
*/
fun range4() {
for (x in 1..10 step 2) {
print(x)
}
for (x in 9 downTo 0 step 3) {
print(x)
}
}
/**
* ==================================================
* 컬렉션 사용하기
* ==================================================
*/
//
fun collection1() {
val items = listOf("first", "second", "third")
for (item in items) {
println(item)
}
}
fun collection2() {
val fruits = listOf("apple", "pineapple", "pitch")
fruits
.filter { it.startsWith("a") } // 람다식을!!
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
}
Created
September 20, 2017 09:50
-
-
Save ihoneymon/74cb22e51fd79c7e881b199ba71ce420 to your computer and use it in GitHub Desktop.
코틀린 Kotlin 하나식 사용해보기
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment