Kotlin Control Flow(제어문)

이미지 출처: https://kotlinlang.org/assets/images/open-graph/kotlin_250x250.png

if, when, for, while 제어문

kotlinlang 사이트의 가이드문서를 기반으로 포스팅 되었음을 밝힘니다.
Basics > Control Flow
출처: https://kotlinlang.org/docs/reference/control-flow.html
샘플코드: https://github.com/hanjoongcho/kotlin-cookbook

Table of Contents

If Expression

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
fun main(args: Array<String>) {
// Kotlin에서 if는 표현식입니다. 즉, 값을 반환합니다.
// 그러므로 삼항 연산자 (condition? then : else)가 없습니다. 왜냐하면 보통 if가 이 역할을 잘 수행하기 때문입니다.
println(ifExpression(5, 7))

// 분기는 블록이 될 수 있고 마지막 표현식의 값이 리턴됩니다.
// 명령문이 아닌 표현식으로 if를 사용한다면 반드시 else 분기가 정의되어야 합니다.
println(ifExpression2(5, 7))
}

fun ifExpression(a: Int, b: Int): Int {
// Traditional usage with else
// var max = a
// if (a > b) {
// max = a
// } else {
// max = b
// }

// As expression
var max = if (a > b) a else b
return max
}

fun ifExpression2(a: Int, b: Int): Int = if (a > b) {
println("Choose a")
a
} else {
println("Choose b")
b
}
--------------------------------------------------------
7
Choose b
7

When Expression 1

when은 C와 유사한 언어의 switch 연산자를 대체합니다.
when은 분기 조건이 충족 될 때까지 모든 분기에 대한 인수를 순차적으로 찾습니다.
when은 표현식이나 명령문으로 사용될 수 있습니다.
표현식으로 사용되면 만족 된 분기의 값이 전체 표현식의 값이됩니다.
명령문으로 사용되면 개별 분기의 값은 무시됩니다. (if와 마찬가지로 각 분기는 블록이 될 수 있고 마지막 표현식의 값이 리턴됩니다.)
분기 조건이 충족되지 않으면 else 블럭이 실행됩니다.
표현식으로 when이 사용될 경우 컴파일러가 모든 가능한 경우의 분기처리를 보장하지 못한다면 else 분기가 필수로 정의되어야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fun main(args: Array<String>) {
whenExpression(1)
whenExpression(3)
}

fun whenExpression(flag: Int) {
when (flag) {
1 -> println("x == 1")
2 -> println("x == 2")
else -> { // Note the block
println("flag is neither 1 nor 2")
}
}
}
--------------------------------------------------------
x == 1
flag is neither 1 nor 2

When Expression 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun main(args: Array<String>) {
// 많은 경우가 동일한 방식으로 처리되어야 하는 경우 콤마를 이용하여 2개이상의 조건을 분기의 조건으로 사용할 수 있습니다.
whenExpression2(1)
whenExpression2(3)
}

fun whenExpression2(flag: Int) {
when (flag) {
0, 1 -> println("x == 0 or x == 1")
else -> println("otherwise")
}
}
--------------------------------------------------------
x == 0 or x == 1
otherwise

When Expression 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun main(args: Array<String>) {
// 분기 조건으로 임의의 표현식(상수뿐만 아니라)을 사용 할 수 있습니다.
whenExpression3(2)
whenExpression3(3)
}

fun whenExpression3(flag: Int) {
var s = "2"
when (flag) {
Integer.parseInt(s) -> println("s encodes flag")
else -> println("s does not encode flag")
}
}
--------------------------------------------------------
s encodes flag
s does not encode flag

When Expression 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fun main(args: Array<String>) {
// 분기 조건으로 범위 또는 컬렉션에있는 값을 사용 할 수 있습니다.
whenExpression4(3)
whenExpression4(33)
}

fun whenExpression4(number: Int) {
var validNumbers = listOf(33, 55)
when (number) {
in 1..10 -> println("number is in the range")
in validNumbers -> println("number is valid")
!in 10..20 -> println("number is outside the range")
else -> println("none of the above")
}
}
--------------------------------------------------------
number is in the range
number is valid

When Expression 5

1
2
3
4
5
6
7
8
9
10
11
12
13
fun main(args: Array<String>) {
// 스마트 캐스트 (smart cast)를 이용하면 값이 특정 데이터 타입인지 확인하고, 추가 검사없이 메서드 및 속성에 액세스 할 수 있습니다.
println(hasPrefix(6000))
println(hasPrefix("prefix_test_book"))
}

fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
--------------------------------------------------------
false
true

When Expression 6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fun main(args: Array<String>) {
// when 표현식은 if-else 제어문을 대체 할 수 있습니다.
// argument 값이 없는경우 분기조건에 boolean 표현식을 사용 할 수 있으며, 표현식의 결과가 true인 경우 분기문이 실행됩니다.
var SuperMarket = SuperMarket()
when {
SuperMarket.isOdd() -> println("x is odd")
SuperMarket.isEven() -> println("x is even")
else -> println("x is funny")
}
}

class SuperMarket() {
fun isOdd(): Boolean {
var result = false
return result
}

fun isEven(): Boolean {
var result = false
return result
}
}
--------------------------------------------------------
x is funny

For Loops

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
fun main(args: Array<String>) {
// iterator만 제공되면 for 루프를 이용하여 순회가 가능합니다.
// 이것은 C #과 같은 언어의 foreach 루프와 동일합니다.
var fruits = listOf("감", "수박", "자두")
forLoop(fruits)
forLoop2(fruits)

// 인덱스가있는 배열이나 목록을 반복 할 경우 다음과 같이 할 수 있습니다.
forLoop3(fruits)

// withIndex 라이브러리 함수를 이용할수도 있습니다.
forLoop4(fruits)
}

fun forLoop(fruits: List<String>) {
for (item in fruits) print(item + " ")
println()
}

fun forLoop2(fruits: List<String>) {
for (item: String in fruits) {
print(item + " ")
}
println()
}

fun forLoop3(fruits: List<String>) {
for (i in fruits.indices) {
println(i.toString() + "번째 과일" + fruits[i])
}
}

fun forLoop4(fruits: List<String>) {
for ((index, value) in fruits.withIndex()) {
println("the element at $index is $value")
}
}
// --------------------------------------------------------
// 감 수박 자두
// 감 수박 자두
// 0번째 과일감
// 1번째 과일수박
// 2번째 과일자두
// the element at 0 is 감
// the element at 1 is 수박
// the element at 2 is 자두

While Loops

1
// while, do..while 루프는 기존의 방식과 동일합니다.

Table of contents


Open source project on GitHub


Jupyter/IPython Notebook


Open API


NoSQL


Jekyll


Gradle


Kotlin


C++

  • C++ keywords
  • 윤성우 열혈강의 C++ 프로그래밍 예제코드 [펼치기]
    1. C언어 기반의 C++ 1
      • printf와 scanf를 대신하는 입출력 방식
      • 함수 오버로딩(Function Overloading)
      • 매개변수의 디폴트 값(Default Value)
      • 인라인 함수(Inline)함수
      • 이름공간(namespace)에 대한 소개
    2. C언어 기반의 C++ 2
      • 새로운 자료형 bool
      • 참조자(Reference)의 이해
      • 참조자(Reference)와 함수
      • maloc & free를 대신하는 new & delete
      • C++에서 C언어의 표준함수 호출하기
    3. 클래스의 기본
      • C++에서의 구조체
      • 클래스(Class)와 객체(Object)
      • 객체지향 프로그래밍의 이해
    4. 클래스의 완성
      • 정보은닉(Information Hiding)
      • 캡슐화(Encapsulation)
      • 생성자(Constructor)와 소멸자(Destructor)
      • 클래스와 배열 그리고 this 포인터
    5. 복사 생성자
      • ‘복사 생성자’ 와의 첫 만남
      • ‘깊은 복사’와 ‘얕은 복사’
      • 복사 생성자의 호출시점
    6. friend와 static 그리고 const
      • const와 관련해서 아직 못다한 이야기
      • 클래스와 함수에 대한 friend 선언
      • C++에서의 static
    7. 상속(Inheritance)의 이해
      • 상속에 들어가기에 앞서
      • 상속의 문법적인 이해
      • protected 선언과 세 가지 형태의 상속
      • 상속을 위한 조건
    8. 상속과 다형성
      • 객체 포인터의 참조관계
      • 가상함수(Vitual Function)
      • 가상 소멸자와 참조자의 참조 가능성
    9. 가상(Virtual)의 원리와 다중상속
      • 멤버함수와 가상함수의 동작원리
      • 다중상속(Multiple Inheritance)에 대한 이해
    10. 연산자 오버로딩 1
      • 연산자 오버로딩의 이해와 유형
      • 단항 연산자의 오버로딩의
      • 교환법칙 문제의 해결
      • cout, cin 그리고 endl의 정체
    11. 연산자 오버로딩 2
      • 반드시 해야 하는 대입 연산자의 오버로딩
      • 배열의 인덱스 연산자 오버로딩
      • 그 이외의 연산자 오버로딩
    12. String 클래스의 디자인
      • C++ 표준과 표즌 string 클래스
      • 문자열 처리 클래스의 정의
    13. 템플릿(Template) 1
      • 템플릿(Template)에 대한 이해와 함수 템플릿
      • 클래스 템플릿(Class Temlpate)
    14. 템플릿(Template) 2
      • Chapter 13에서 공부한 내용의 확장
      • 클래스 템플릿의 특수화(Class Temlpate Specialization)
      • 템플릿의 인자
      • 템플릿과 static
    15. 예외처리(Exception Handling)
      • 예외상황과 예외처리의 이해
      • C++의 예외처리 메커니즘
      • Stack Unwinding(스택 풀기)
      • 예외상황을 표현하는 예외 클래스의 설계
      • 예외처리와 관련된 또 다른 특성들
    16. C++의 형 변환 연산자
      • C++에서의 형 변환 연산

ETC