Kotlin Control Flow




If Expression


Kotlin에서는 if 문이 값을 리턴하기 때문에 삼항연산자(condition? A:B) 를 사용할 필요가 없다. 


기존에는 아래와 같이 값을 직접 리턴할 수 없기 때문에 할당을 하는 블락이 필요했다.

val a =3 
val b =4
var max =0
if( a < b ){
max = b
}else{
max = a
}


 Kotlin 에서는 다음과 같이 if 문을 사용 할 수 있다. 생각보다 많은 양의 코드를 줄여 줄 수 있는 부분이다.

val a =3
val b =4
val max = if (a<b) b else a




When Expression


When 문은 자바나 C에 있는 Switch 문을 대체하는 용도로 사용되며, 실제로 코딩을 하다보면 단순히 switch 문의 대체문이 아니라 if else 의 늪을 어느 정도 커버 할 수 있는 제어문이라고 할 수 있다. 

기본적인 사용법은 아래와 같다. (Switch 문과는 다르게 별도의 break 는 필요 없다)


fun test(){
val x = 2
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}// Result : print 'x==2'
}


여러개의 값을 같이 매칭 시키기 위해서는 콤마(',') 또는 범위표현(..)을 사용할 수 있다. (범위 표현식에서는 앞에 "in"을 붙여야 한다)

fun test(){
val x = 2
when (x) {
0,1 -> print("zero and one") // , 를 사용하여 다중값 셋팅
in 2 .. 10 -> print("1 over Under 10") // 범위연산자를 활용하여 범위 표현
else -> {
print("else")
}
}
}



또한, 특정 값이 아니라 statement가 TRUE  냐  FALSE 냐에 따라서 처리도 가능하며, 이를 활용할 경우에 IF-ELSE 문을 대체 할 수 있다. 

fun hasPrefix(x:Any) = when(x){
is String -> x.startsWith("prefix")
else -> false
}
val x = 2
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}





For Loops


For 문은 기본 반복문과 같은 기능을 제공한다고 생각하면 되지만 기본적으로 foreach 문을 기본으로 활용한다고 생각하면 되고 기존의 인덱스 기반으로 인덱싱해서 반복 하는 기능은 다른 형태로 제공한다.


fun test(){

var collection = ArrayList<Int>()
var array = collection.toArray()

for (item in collection) print(item) // 일반적인 foreach 형태

for( i in array.indices){ // Array 순회
print(array[i])
}

for((index,value) in array.withIndex()){ // 인덱스를 가지고 Array 순회
println("the element at $index is $value")
}

}



위와 같이 for statement 를 사용할수도있지만 아래와 같이 foreach 문을 사용해서 표현도 가능합니다.

fun test(){
(1..10).forEach { i -> print(i) }
}




While Loops


while문과 do-while문은 기존의 언어에서 사용하던 문법과 달라진 점이 없습니다. (설명 생략)


fun test(){
while (x > 0) {
x--
}

do {
val y = retrieveData()
} while (y != null) // y is visible here!
}



'Programming' 카테고리의 다른 글

Kotlin Syntax (3) - Null Safe  (0) 2017.07.07
Kotlin Syntax (1) - Basic Type  (1) 2017.07.03
Java8 Lambda 최대값 갯수 표현식  (0) 2017.06.04
[JavaScript] Switch - Fall Through  (0) 2017.05.28
RecyclerView, Cardview Example  (0) 2017.05.28

Kotlin 이 2017 Google I/O 에서 Android 정식언어로 지정되기 전부터 관심을 가지고 공부를 하고 있었는데,

오늘 GDG 관련 행사에서도 Kotlin 에 대한 관심이 많이 높아 졌음을 다시 한 번 느낄 수 있었다. 


실제로 Kotlin을 사용해서 개발을 하다 보면 편리하거나 간결한 방법 보다는 기존의 Java와 같은 스타일로 코드를 작성하게 되는데

Basic Syntax를 정리하면서 새로운 문법들을 활용해서 보다 간결한 소스 코드를 작성 할 수 있도록 해야겠다. 



Kotlin을 사용함으로 인해서 얻을 수 있는 장점은 다음과 같다. 

1. Null Safe를 통한 코드 안정성 증가 

2. LOC(Line Of Coverage)  감소

3. Modern Program Language 스타일 코딩 


Kotlin의 Basic Syntax를 활용하는 것 만으로도 저 세개를 모두 만족 시킬 수 있을거 같다.



Kotlin Basic Type



Numbers


Kotlin의 built-in Type은 자바와 매우 비슷하다.

Type

Bit width

Double

64

Float

32

Long

64

Int

32

Short

16

Byte

8


Underscores in numeric literals


숫자형 상수의 경우에 가독성이 좋도록 "_" 언더바를 활용하여 표현 할 수 있다. 


fun test() {

val salary = 5_000_000
val bankAccount = 1234_5679_124L
val salaryHex = 0xFF_EE_AA

}

상수의 길이가 길어지거나 의미부여가 필요할때 활용하면 좋을거 같다.




Explicit Conversion


숫자형의 다른 표현방법 때문에 작은타입(예: Int) 가 큰 타입(예:Long)의 자식타입이 아니다. 

아래와 같이 Long 타입인 b 변수는 Int 타입의 변수 a 변수를 담을 수 없다. 


fun test() { // 컴파일 에러
val a : Int = 100
val b : Long? = a
}

fun test() { // 컴파일 성공
val a : Int = 100
var b : Long? = a.toLong() //명시적으로 호출
}



Operations


Kotlin에서는 기본적인 수학연산자들을 제공한다. 

fun test() {
// 2를 왼쪽시프트 2만큼 하고 0x00FF와 bitwise xor 연산을 해라
val x = (2 shl 2) xor 0x00FF
}


  • shl(bits) – signed shift left (Java's <<)
  • shr(bits) – signed shift right (Java's >>)
  • ushr(bits) – unsigned shift right (Java's >>>)
  • and(bits) – bitwise and
  • or(bits) – bitwise or
  • xor(bits) – bitwise xor
  • inv() – bitwise inversion



Arrays


Kotlin에서의 배열은 Array 클래스로 나타낸다. 이 클래스는 get과 set function을 가지고 있고 배열 형태로 나타낸다. 

배열을 만들때는 arrayOf() 를 이용해서 값을 가지고 생성하거나 arrayOfNulls()를 활용해서 Null Element 들을 가지고 배열을 생성할 수도 있다.

fun test() {

var numberArray : Array<Int> = arrayOf(1,2,3,5,6) // Create [1,2,3,5,6]
var nullArray= arrayOfNulls<Int>(10) // create with null element
val firstElement = numberArray.get(0)
var arryaSize = numberArray.size

}


또다른 방법은 Factory Function을 이용해서 생성을 하는 방법인데, 배열의 사이즈를 가지고 각 인덱스를 기반으로 초기 값을 셋팅 할 수 있다. 

fun test() {
// Create String Array ["0","2","4","6","8"]
val asc = Array( 5 , { index -> (index*2).toString() })
}




Strings


String은 immutable 하며  character 인덱스를 가지고 접근이 가능하다. (for-loop로 문자열 순회가 가능 : 자바와 동일)


fun test() {
//String Literals
val s = "Hello, world!\n"

//raw string delimited
val text = """
var i : Int = 0
while(true){
i++
}
"""
}



String Templates


String에는 템플릿 표현식이 들어갈 수 있다. 이는 처리된 결과 값이 문자열에 포함되어 있음을 의미 한다. 이를 표현하기 위해서 $ 를 붙여서 표현한다. 

또는 { } 를 붙여서도 표현이 가능하다. $s.length 와 ${s.length} 는 다르게 표현될 수 있다.


fun test() {
val i = 10
val s = "i = $i" // evaluates to "i = 10"

val l = "abc"
val str = "$l.length is ${l.length}" // evaluates to "abc.length is 3"
}

다음 포스팅에서는 Kotlin 의 Control Flow 에 대해서 설명하겠다.

'Programming' 카테고리의 다른 글

Kotlin Syntax (3) - Null Safe  (0) 2017.07.07
Kotlin Syntax (2) - Control Flow  (0) 2017.07.05
Java8 Lambda 최대값 갯수 표현식  (0) 2017.06.04
[JavaScript] Switch - Fall Through  (0) 2017.05.28
RecyclerView, Cardview Example  (0) 2017.05.28

+ Recent posts