일단 시작하는 코틀린

89
빠르진 않지만 일단 만나보는 코틀린 박중수 2016. 02.

Upload: park-joongsoo

Post on 15-Apr-2017

5.745 views

Category:

Software


7 download

TRANSCRIPT

Page 1: 일단 시작하는 코틀린

빠르진 않지만 일단 만나보는 코틀린

박중수

2016. 02.

Page 2: 일단 시작하는 코틀린

박중수 (Daniel Park)

- [email protected]

- http://danielpark.net - http://career.danielpark.net

- https://www.linkedin.com/in/jsdanielpark

- 2011~ 성공회대 소프트웨어공학 전공

- 2011~2014 Web, Android 외주 개발 및 파트타임

- 2014 ~ 현재 공군 기상단 개발병 복무중

- 팀원 수가 적다보니 강제로 Full Stack

2

Page 3: 일단 시작하는 코틀린

- Windows 7

- JDK8

- JetBrains InteliJ Idea 15.0.3

3

사용 환경

Page 4: 일단 시작하는 코틀린

설치 및 환경설정

7 설치 9 프로젝트 생성 및 테스트

기본 -

18 주석 20 변수 22 자료형 26 함수 30 람다 35 패키지

흐름제어

38 조건문 42 반복문 47 예외처리

목차

4

Page 5: 일단 시작하는 코틀린

클래스

52 클래스 55 클래스-보조생성자 56 오버라이딩 57 오픈 클래스 58 추상 클래스 59 인터페이스 61 인터페이스-다중상속 62 데이터클래스

자료구조 -

66 배열 68 range 70 ArrayList 72 LinkedList 73 HashMap 75 Collections의 in 문법 78 Collections의 연산

목차

5

Page 6: 일단 시작하는 코틀린

기타 유용핚 기능

80 문자열 템플릿 81 타입 오토캐스팅 82 Null 검사 83 Null 핸들링 85 확장 함수 86 변수에 if문 사용 87 is 키워드

마무리 -

88 마무리 89 참고 사이트

목차

6

Page 7: 일단 시작하는 코틀린

설치

7

Page 9: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

9

Page 10: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

10

1. 첫 화면에서 Create New Project 생성

2. Java -> Kotlin(Java) 선택

Page 11: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

11

3. 상단의 Project SDK에서 New -> JDK 클릭

4. 자바가 설치된 jdk 경로를 선택하고 OK를 클릭

Page 12: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

12

5. 하단의 Use library에서 Create를 클릭

6. Use library from plugin을 선택한 후 OK

Page 13: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

13

설정이 끝났으므로 Next를 누른 후 프로젝트 명을 입력하고 Finish를 누른다.

Page 14: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

14

처음 나오는 Tip 창을 닫아주면 아래와 같은 프로젝트 화면이 나타난다. src를 오른쪽 클릭하여 -> New -> Kotlin File/Class 를 클릭한다.

Page 15: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

15

처음 나오는 Tip 창을 닫아주면 아래와 같은 프로젝트 화면이 나타난다. src를 오른쪽 클릭하여 -> New -> Kotlin File/Class 를 클릭한다.

Page 16: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

16

파일명을 입력해주고 OK를 클릭해주면 .kt 확장자로 파일이 생성된다. 이 곳에서 문법을 테스트를 하면 된다.

Page 17: 일단 시작하는 코틀린

프로젝트 생성 및 테스트

17

Main 메소드는 “fun main(args: Array<String>) {}” 로 선언한다. 출력문인 println 함수로 Hello World를 출력해보았다.

※ 코틀린은 세미콜론(;)을 붙이지 않아도 된다.

func main(args: Array<String>) {

println(“Hello World”)

}

결과

Page 18: 일단 시작하는 코틀린

주석

18

Page 19: 일단 시작하는 코틀린

주석

19

주석 달기

코틀린의 주석은 자바와 같다. 한 줄의 주석은 “//” 여러 줄의 주석은 “/* */”로 달 수 있다.

// 한 줄 주석 /* 여러 줄 주석 */

Page 20: 일단 시작하는 코틀린

변수

20

Page 21: 일단 시작하는 코틀린

변수

21

변수의 선언

변수의 선언은 아래와 같이 한다. 코틀린은 변수타입을 자동으로 캐스팅해주기 때문에 변수의 자료형을 명시하지 않아도 된다.

val a = 1

변수에 특정 타입만 담고싶다면 자료형을 명시할 수 있다.

val a: Int = 5

또한 변수를 초기화 시키지 않고 선언만 한 후에 나중에 값을 담는 것도 가능하다.

val a: Int a = 5

Page 22: 일단 시작하는 코틀린

자료형

22

Page 23: 일단 시작하는 코틀린

자료형

23

자료형의 종류

정수 실수 문자 논리

Long(64) Double(64) Char Boolean

Int(32) Float(32)

Short(16)

Byte(8)

Page 24: 일단 시작하는 코틀린

자료형

24

타입 캐스팅

var num = 3 var shortNum: Short = num.toShort() var longNum: Long = num.toLong() var strNum: String = num.toString() var str = “10” var num = str.toInt()

타입 캐스팅은 변수에 속해있는 to자료형명() 메소드로 할 수 있다.

Page 25: 일단 시작하는 코틀린

자료형

25

레퍼런스 자료형

var a: Int? = 3 // java.lang.Integer와 같다

var a: Long? = 3 // java.lang.Long과 같다

var a: Double? = 3 // java.lang.Double과 같다

var a: Char? = 3 // java.lang.Char와 같다

기본 타입 변수에 ?를 붙이면 레퍼럮스 자료형이 된다. 즉 null값을 가질 수 있다.

Page 26: 일단 시작하는 코틀린

함수

26

Page 27: 일단 시작하는 코틀린

함수

27

함수의 선언

함수의 기본 형태는 다음과 같다

fun 함수명(인자1:자료형, 인자2:자료형….) : 반홖형 { // code return 반홖값 }

두 정수를 인자로 받아 더해서 반환하는 함수를 정의하자면 아래와 같다.

fun sum(a: Int, b: Int) : Int { return a+b }

Page 28: 일단 시작하는 코틀린

함수

28

함수의 선언

다음과 같이 갂략하게 선언할 수도 있다.

fun sum(a: Int, b: Int) = a+b

리턴 타입을 생략하여도 코틀린에서 반환타입을 유추하여 자동으로 캐스팅해준다.

fun sum(a: Int, b: Int) { return a+b // 자동으로 Int로 캐스팅 }

리턴 값이 없는 경우에는 반환타입을 Unit으로 선언한다.

fun sum(a: Int, b: Int) : Unit { println( a+b ) }

Page 29: 일단 시작하는 코틀린

함수

29

함수의 선언

함수에서 인자의 기본값을 정의해줄 수도 있다.

fun sum(a: Int = 0, b: Int = 5) : Int { return a+b } var num = sum(b=3) println(num) // 0+3이므로 5가 출력된다

Page 30: 일단 시작하는 코틀린

람다

30

Page 31: 일단 시작하는 코틀린

람다

31

Higher-Order Function (함수를 인자로 받는 함수)

인자로 넘길 함수를 표현하는 형식은 아래와 같다. 이를 람다 표현식이라 부른다.

(인자1 타입, 인자2 타입…) -> 반홖형

인자도 없고 반환도 하지 않는 함수를 표현하는 식

함수 선언 시 : fun myFunc(arg: () -> Unit ) 함수 호출 시 : myFunc(arg = { // Code Block } )

정수 두 개를 받고, 반환은 하지 않는 함수

함수 선언 시 : fun myFunc(arg: (Int, Int) -> Unit ) 함수 호출 시 : myFunc(arg = { x:Int, y:Int -> // Code Block } )

Page 32: 일단 시작하는 코틀린

람다

32

Higher-Order Function (함수를 인자로 받는 함수)

정수 두 개를 받고, 문자열을 반환하는 함수

함수 선언 시 : fun myFunc(arg: (Int, Int) -> Int ) 함수 호출 시 : myFunc(arg = { x:Int, y:Int -> x+y (자동반홖) } )

Page 33: 일단 시작하는 코틀린

람다

33

Higher-Order Function (함수를 인자로 받는 함수)

위에서 만든 함수를 밖에서 구현하여 인자로 넘길 수 있다. 아래에서는 두 인자를 곱해 반환하는 함수를 구현했다.

var result = rambdaFunction( { x,y -> x * y } ) println(result) // lambdaFunction 함수에서 5와 10을 대입해줬으므로 50을 출력

정수 2개를 인자로 받아 정수를 반환하는 함수를 인자로 받아 실행한 후 결과를 반환하는 함수를 만들어보겠다.

fun rambdaFunction(argFunc: (Int, Int) -> Int) : Int { var result:Int = argFunc.invoke(5, 10) return result }

※ 인자로 받은 함수를 실행핛 때에는 invoke 메소드를 사용핚다.

invoke 메소드의 인자는 인자로 받은 함수의 인자의 타입과 동일하다.

Page 34: 일단 시작하는 코틀린

람다

34

Higher-Order Function (함수를 인자로 받는 함수)

Thread 클래스는 인자도 없고 반환값도 없는 타입의 함수를 생성자로 받아 그 함수를 쓰레드에 올린다. 그 코드는 아래와 같다

Thread({ print("Hello Thread") }).start()

Page 35: 일단 시작하는 코틀린

패키지

35

Page 36: 일단 시작하는 코틀린

패키지

36

패키지 선언

자바와 동일하다. 파일의 최상단에 패키지를 선언해준다.

package foo.bar ……file……

Page 37: 일단 시작하는 코틀린

패키지

37

패키지 불러오기

자바와 동일하다. Import문으로 패키지를 불러온다.

import foo.bar.*

as 키워드로 클래스에 다른 이름을 붙여줄 수도 있다.

import java.util.Random as MyRandom var random:MyRandom = MyRandom() println(random.nextInt())

Page 38: 일단 시작하는 코틀린

조건문

38

Page 39: 일단 시작하는 코틀린

조건문

if 문

If문의 문법은 자바의 if문과 완전 동일하다.

if ( 조건1 ) {

// 조건1 참

} else if (조건 2) {

// 조건2 참

} else {

// 조건3 참

}

39

Page 40: 일단 시작하는 코틀린

조건문

40

when

When은 자바의 switch-case와 비슷한 조건문이다

var num = 2

when(num) {

1 -> {

print(“1”)

}

2 -> {

print(“2”)

}

else -> {

print(“no”)

}

}

Page 41: 일단 시작하는 코틀린

조건문

41

when

인자의 타입이 Any인 경우 모든 타입을 대입할 수 있기 때문에 매우 유연하다. 코드블록이 한 줄인 경우 중괄호({})를 생략 가능하다.

fun cases(obj: Any) {

when (obj) {

1 -> print("One")

"Hello" -> print("Greeting")

is Long -> print("Long")

!is String -> print("Not a string")

else -> print("Unknown")

}

}

Page 42: 일단 시작하는 코틀린

반복문

42

Page 43: 일단 시작하는 코틀린

반복문

43

For 문

인덱스로 요소를 뽑아오고 싶다면 아래와 같이 한다.

var arr:Array<String> = arrayOf("a", "b", "c")

for(idx in arr.indices) {

println( arr[idx] )

}

For문의 기본형은 forEach문이다.

var arr:Array<String> = arrayOf("a", "b", "c") // 배열 생성

for(a in arr) {

println( a )

}

Page 44: 일단 시작하는 코틀린

반복문

44

while 문

While문은 Java의 while문과 같다.

var arr:Array<String> = arrayOf("a", "b", "c")

var i = 0

while( i<arr.size ) {

println(arr[i])

i++

}

Page 45: 일단 시작하는 코틀린

반복문

45

do-while 문

do-while문은 Java의 do-while문과 같다.

var arr:Array<String> = arrayOf("a", "b", "c")

var i = 0

do {

println(arr[i])

i++

} while( i<arr.size )

Page 46: 일단 시작하는 코틀린

반복문

46

continue & break 라벨

각 반복문의 앞에 라벨을 붙여 반복에 대한 제어를 할 수 있다.

first@for(i in 1..5) {

second@for( j in 1..5) {

println("$i / $j")

break@first // continue@first 도 가능하다

}

}

한번 루프 후 first를 멈추므로 “1 / 1”만 출력하고 반복문이 멈추게 된다.

Page 47: 일단 시작하는 코틀린

예외처리

47

Page 48: 일단 시작하는 코틀린

예외처리

48

try-catch

try {

// Code Block

} catch(e: Exception) {

// 예외시 동작

} finally {

// finally 동작

}

자바의 try-catch와 비슷하다

Page 49: 일단 시작하는 코틀린

예외처리

49

try-catch

var result = try {

count()

} catch(e: Exception) {

-1

}

변수에도 적용할 수가 있다.

result 변수에는 count 함수에서 예외가 발생할 시 -1이 들어가게 된다.

Page 50: 일단 시작하는 코틀린

예외처리

50

try-with-resource

val stream =

java.nio.file.Files.newInputStream(java.nio.file.Paths.get("D:\\test.txt"))

// Auto Close

stream.buffered().reader().use { reader ->

println(reader.readText())

}

Java7에서 추가된 try-with-resouce 문을 코틀린에서도 사용할 수 있다.

Page 51: 일단 시작하는 코틀린

인터페이스와 클래스

51

Page 52: 일단 시작하는 코틀린

인터페이스와 클래스

52

클래스

고객 클래스를 정의하자면 다음과 같다

class Customer constuctor(val name: String, val phone: String)

코틀린에서 클래스는 class 키워드로 정의한다. 클래스는 하나의 주 생성자와 여러 개의 보조 생성자를 가지는데 주 생성자는 클래스를 선언하며 함께 선언해준다

class 클래스명 contructor(val 변수명:자료형 …..)

친절하게도 constructor 키워드는 생략이 가능하다.

class Customer (val name: String, val phone: String)

Page 53: 일단 시작하는 코틀린

인터페이스와 클래스

53

클래스

인스턴스 변수의 초기화는 생성자에서 받은 변수로 바로 해주면 된다.

class Customer (val name: String, val phone: String) {

val name = name

val phone = phone

}

Page 54: 일단 시작하는 코틀린

인터페이스와 클래스

54

클래스

보조 생성자가 없는데 초기화 설정코드가 있을 경우엔 init 블록을 사용하여 초기화시킨다.

class Customer (val name: String, val phone: String) {

val name = name

val phone = phone

init {

logger.info(“초기화”)

}

}

Page 55: 일단 시작하는 코틀린

인터페이스와 클래스

55

클래스-보조 생성자

보조 생성자는 클래스의 코드블럭 안에서 constructor 키워드를 이용해 선언할 수 있다.

class Customer (val name: String, val phone: String) {

val name = name

val phone = phone

constructor(name: String): this(name, "zzz") {

// 초기화 코드

}

}

Page 56: 일단 시작하는 코틀린

인터페이스와 클래스

56

오버라이딩

클래스의 오버라이딩은 override 키워드를 이용한다.

class FileUploadBoard () : Board() {

override fun write() {

// code…..

}

}

Page 57: 일단 시작하는 코틀린

인터페이스와 클래스

57

오픈 클래스

코틀린에서 모든 클래스는 기본적으로 final이기 때문에 상속이 되질 않는다. 만약 클래스를 상속시키고 싶다면 open class로 선언을 해야한다. 클래스의 내부에서도 오버라이딩을 허용할 메소드만 open으로 선언해준다.

open class Customer (val name: String, val phone: String) {

val name = name

val phone = phone

open fun print() { println(“$name / $phone”) }

}

class CustomerEx

(val name: String, val phone: String): Customer(name, phone) {

override fun print() { println(“$name 의 핸드폰번호는 $phone 입니다”) }

}

Page 58: 일단 시작하는 코틀린

인터페이스와 클래스

58

추상클래스

코틀린의 클래스는 final이지만 open과 함께 추상클래스도 타 클래스들이 상속을 받을 수 있도록 허용되어 있다. 추상클래스는 abstract 키워드로 선언한다.

abstract class Customer (val name: String, val phone: String) {

val name = name

val phone = phone

abstract fun printInfo()

}

※ abstract 클래스를 상속받은 클래스는 abstract 메소드를 반드시 구현하여야 핚다.

※ abstract 클래스와 open 클래스는 다중 상속이 불가능하다.

Page 59: 일단 시작하는 코틀린

인터페이스와 클래스

59

인터페이스

인터페이스는 자바8과 같이 메소드의 구현이 가능하다. 하지만 인스턴스 변수를 초기화 시킬 수 없고 자식클래스에서 오버라이드 하여 값을 부여해야한다.

interface MyInterface {

var prop: Int

fun myFun()

fun printProp() {

println(prop)

}

}

※ 인터페이스는 자바처럼 다중 상속이 가능하다.

Page 60: 일단 시작하는 코틀린

인터페이스와 클래스

60

인터페이스

이전 슬라이드의 코드를 구현하면 다음과 같다

class Child: MyInterface {

override var prop: Int = 30

fun myFun() {

println(“my Funtion”)

}

fun printProp() {

println(prop)

}

}

Page 61: 일단 시작하는 코틀린

인터페이스와 클래스

61

인터페이스 - 다중상속

다중상속을 받았을 시 부모 메소드의 호출은 아래와 같이 한다.

interface MyInterface1 {

fun myFun() { println(“interface 1”) }

}

interface MyInterface2 {

fun myFun() { println(“interface 2”) }

}

class Child: MyInterface1, MyInterface2 {

override fun myFun() {

super<MyInterface1>.myFun() // MyInterface1

super<MyInterface2>.myFun() // MyInterface2

}

}

Page 62: 일단 시작하는 코틀린

인터페이스와 클래스

62

데이터 클래스 (Data Transfer Object)

고객 클래스를 정의하여 값을 불러와보겠다.

data class Customer(val name: String, val phone: String)

fun main(args: Array<String>) {

val cus = Customer(name=“Daniel”, phone=“010-0000-0000”)

print(“$(cus.name) / $(cus.phone)”) // “Daniel / 010-0000-0000”

}

DTO를 코틀린에서는 쉽게 정의할 수 있다. 형식은 아래와 같다 데이터 클래스는 getter는 제공하지만 setter를 제공하지 않는다.

data class 클래스명(val 변수명:자료형 …..)

Page 63: 일단 시작하는 코틀린

인터페이스와 클래스

63

데이터 클래스 (Data Transfer Object)

data class Customer(val name: String, val phone: String)

fun main(args: Array<String>) {

val daniel = Customer(name=“Daniel”, phone=“010-0000-0000”)

println(“$(cus.name) / $(cus.phone)”) // “Daniel / 010-0000-0000”

val modifiedDaniel= daniel.copy(phone=“010-1111-1111”)

println(“$(cus.name) / $(cus.phone)”) // “Daniel / 010-1111-1111”

}

데이터 클래스는 getter는 제공하지만 setter를 제공하지 않는다. 값을 변경하려면 copy 메소드를 통해 객체를 복사해야한다.

Page 64: 일단 시작하는 코틀린

인터페이스와 클래스

64

데이터 클래스 (Data Transfer Object)

data class Customer(val name: String, val phone: String)

fun main(args: Array<String>) {

val daniel = Customer(name=“Daniel”, phone=“010-0000-0000”)

var (name, phone) = daniel

println(“$name / $phone”) // “Daniel / 010-0000-0000”

}

데이터 클래스의 인스턴스에 들은 값들을 변수에 한번에 집어넣을 수도 있다.

Page 65: 일단 시작하는 코틀린

자료구조

65

Page 66: 일단 시작하는 코틀린

자료구조

66

배열

형식 : var arr: Array<자료형> = array<자료형>(배열크기:Int)

var arr: Array<String> = Array<String>(5) // 크기가 5인 String 배열

배열은 Array 클래스로 표현된다. 사이즈가 정해진 빈 배열의 선언은 아래와 같이 한다.

형식 : var arr: Array<자료형> = Array<자료형>(배열크기:Int, 람다식)

var arr: Array<Int> = Array<Int>(5, i -> i+5) // [5, 6, 7, 8, 9]

람다식을 이용해 값이 들어있는 배열을 만들 수 있다.

※ 값이 없는 배열과 값이 있는 배열을 선언할 때 Array키워드의 대소문자를 구분하여야 한다.

Page 67: 일단 시작하는 코틀린

자료구조

67

배열

var arr:Array<String> = arrayOf(“aaa”, “bbb”, “ccc”….)

특정한 값들을 넣은 배열은 arrayOf 메소드를 이용해 만들 수 있다.

var arr:IntArray = intArrayOf(1, 2, 3….) // 정수배열

var arr:DoubleArray = doubleArrayOf(1.3, 2.2 ...) // 실수배열

var arr:BooleanArray = booleanArrayOf(true, false, false….) // 논리배열

var arr:CharArray = charArrayOf(„a‟, „b‟, „c‟….) // 문자배열

각각의 기본자료형을 표현할 수 있는 별도의 배열들도 있다.

Page 68: 일단 시작하는 코틀린

자료구조

68

범위(range)

for(idx in 1..5) {

println(idx)

}

일정한 값들의 범위를 range 문법(..)을 적용해 지정해줄 수 있다.

1

2

3

4

5

for(idx in „a‟..‟e‟) {

println(idx)

}

문자도 된다

a

b

c

d

e

Page 69: 일단 시작하는 코틀린

자료구조

69

범위(range)

var end = 10

for(idx in 6..end) {

println(idx)

}

변수도 된다

6

7

8

9

10

var start = 1

for(idx in start..5) {

println(idx)

}

1

2

3

4

5

Page 70: 일단 시작하는 코틀린

자료구조

70

ArrayList

ArrayList는 자바의 java.util.ArrayList<E> 클래스를 이용한다.

싞박하게도 이 ArrayList는 java.util.List<E>가 아닌 kotilin.List<E> 인터페이스를 상속받는다

이 kotlin.List<E> 인터페이스는 읽기 전용이므로 아래와 같이 선언하면 값을 추가할 수 없다.

var list:kotlin.List<String> = java.util.ArrayList<String>()

빈 ArrayList는 아래와 같이 선언한다.

var list = arrayListOf<String>()

import java.util.* // 맨 위 import문 쓰는 곳

var list = ArrayList<String>()

Page 71: 일단 시작하는 코틀린

자료구조

71

ArrayList

arrayListOf<T>() 함수로 값을 줄 수도 있다.

var list = arrayListOf<String>(“aaa”, “bbb”, “ccc”)

값의 추가와 호출은 add메소드와 get 메소드를 사용할 수도 있지만 배열처럼 접근할 수도 있다.

var list = arrayListOf<String>()

list.add(“Daniel”)

var value = list.get(0) // Daniel

var list = arrayListOf<String>()

list[0] = “Daniel”

var value = list[0] // Daniel

Page 72: 일단 시작하는 코틀린

자료구조

72

LinkedList

사용방법은 ArrayList와 동일하다

var list = linkedListOf<String>()

import java.util.* // 맨 위 import문 쓰는 곳

var list = LinkedList<String>()

var list = linkedListOf<String>()

list.add(“value”)

var list = linkedListOf<String>(“aaa”, “bbb”, “ccc”)

var a = list[1]

println(a) // “bbb”

Page 73: 일단 시작하는 코틀린

자료구조

73

HashMap

HashMap 또한 java.util.HashMap 클래스를 사용하지만 kotlin.Map 인터페이스를 상속받는다.

이 kotlin.Map 인터페이스 또한 읽기전용이므로 put 메소드가 존재하지 않는다.

var map = hashMapOf<String, String>()

빈 HashMap은 아래와 같이 hashMapOf 함수로 생성한다.

var map = java.util.HashMap<String, String>()

일반 선언으로도 빈 HashMap을 생성할 수 있다.

값이 있는 HashMap도 hashMapOf 함수로 생성할 수 있다.

인자로는 키와 값을 의미하는 Pair의 인스턴스를 받으며 Pair의 생성자로 각각의 키와 값을 넘긴다.

var map = hashMapOf<String, String>(Pair(“key”, “value”), Pair(“daniel”, “1234”) … )

Page 74: 일단 시작하는 코틀린

자료구조

74

HashMap

값의 삽입과 호출은 put 메소드와 get 메소드를 이용할 수도 있지만

자바스크립트의 배열같이도 사용할 수도 있다.

var map = hashMapOf<String, String>()

map.put(“name”, “Daniel”)

var value = map.get(0) // Daniel

var list = arrayListOf<String>()

map[“name”] = “Daniel”

var value = map[“name”] // Daniel

Page 75: 일단 시작하는 코틀린

자료구조

75

Collections의 문법

var list = listOf<String>("a", "b", "c")

if("c" in list)

println("yes") // “c”가 리스트에 속해있으므로 yes가 출력된다

if문에서의 in 문법

in의 앞에 있는 값이 in의 뒤에 있는 Collection에 속해있는지의 여부를 리턴한다.

Map의 경우 키를 가지고 있는지의 여부를 의미한다.

var map = hashMapOf<String, String>(Pair("daniel", "1234"), Pair("park", "222"))

if(“daniel" in map)

println(“yes") // “daniel”이 map의 키에 속해있으므로 yes가 출력된다

Page 76: 일단 시작하는 코틀린

자료구조

76

Collections의 in 문법

var list = listOf<String>("a", "b", "c")

for(value in list)

println(value)

for문에서의 in 문법

in의 앞에 있는 변수에 in의 뒤에 있는 Collection들의 값을 하나하나 담아 반복한다.

Map의 경우는 Pair의 인스턴스들을 담아 반복한다.

a

b

c

Page 77: 일단 시작하는 코틀린

자료구조

77

Collections의 in 문법

daniel : 1234

Park : 222

for문에서의 in 문법

var map = hashMapOf<String, String>(Pair("daniel", "1234"), Pair("park", "222"))

for(p in map)

println(“${p.key} : ${p.value}”)

※ for((key,value) in map) 형식으로도 사용핛 수 있다.

Page 78: 일단 시작하는 코틀린

자료구조

78

Collections 연산

ParkJS

ParkYH

Collection에서는 자체적으로 각종 연산을 지원한다.

대표적으로 filter와 foreach 메소드를 살펴보겠다.

var list = listOf("ParkJS", "JungHL","ParkYH", "NoEH")

list.filter { str -> str.startsWith("Park") }

.forEach { str -> println(str) }

List에서 filter 메소드로 “Park”으로 시작하는 문자열만 골라내었다.

결과로 “ParkJS”, “ParkYH”만 들어있는 List의 객체가 반환되었고

다시 foreach 메소드를 호출하여 각 요소를 출력하도록 하였다.

※ listOf 함수는 읽기전용 List를 생성핚다 (add 메소드가 없다)

Page 79: 일단 시작하는 코틀린

기타 유용핚 기능

79

Page 80: 일단 시작하는 코틀린

기타 유용핚 기능

80

문자열 템플릿

다음과 같이 갂략하게 선언할 수도 있다.

fun sum(a: Int, b: Int) = a+b

변수를 별도의 문법 추가 없이 문자열에 출력할 수 있다.

var str: String = “Hello”

print(“${str} World!”)

“Hello World”

Page 81: 일단 시작하는 코틀린

기타 유용핚 기능

81

타입 오토 캐스팅

타입을 유추하여 자동으로 캐스팅을 해주기 때문에 유연하다.

fun getStringLength(obj: Any): Int? {

if( obj is String ) {

// obj는 String타입이라 밝혀졌기 때문에 String 타입으로 자동 캐스팅된다.

return obj.length

}

return null

}

Page 82: 일단 시작하는 코틀린

기타 유용핚 기능

82

Null 검사

Java에서는 Null상태인 객체의 메소드를 호출하면 NullPointerException이 발생한다.

코틀린에서는 미리 Null 검사를 함으로써 Null 상태라면 Null 값을 반환한다

var files = java.io.File(“Z:\\”).list() // 없는 경로이므로 Null이 반홖된다.

println(files?.size) // files가 null이므로 메소드는 호출되지 않고 null이 출력된다.

객체의 상태가 Null이라면 바로 Null값을 반환하지 않도록 핸들링이 가능하다.

var files = java.io.File(“Z:\\”).list() // 없는 경로이므로 Null이 반홖된다.

println(files?.size ?: “empty”) // files가 null이므로 “empty”가 출력된다.

Page 83: 일단 시작하는 코틀린

기타 유용핚 기능

83

Null 핸들링

값의 검사를 하여 Null인 경우 “?:” 키워드를 통해 수행할 행동을 정의할 수 있다.

var data = …..

var email = data[„email‟] ?: println(“empty value”)

//data[„email‟]이 null일 경우 “empty value”를 출력한다.

행위가 아닌 값을 담을 수도 있다.

var data = …..

var email = data[„email‟] ?: “empty value”

//data[„email‟]이 null일 경우 email 변수에 “empty value”란 값을 담는다

Page 84: 일단 시작하는 코틀린

기타 유용핚 기능

84

Null 핸들링

값이 Null이 아닌 경우 수행할 동작을 정의할 수 있다.

var files = java.io.File(“C:\\”).list() // C 드라이브의 파일목록이 반홖된다.

files?.let {

println(“files is not null!!”)

}

Page 85: 일단 시작하는 코틀린

기타 유용핚 기능

85

확장 함수

기존의 클래스에 우리가 함수를 새로 추가할 수 있다.

fun String.newMethod():String { return "new Method!!" }

fun main(args: Array<String>) {

var str:String = “”

println( str.newMethod() ) // “new Method!!”가 출력된다.

}

Page 86: 일단 시작하는 코틀린

기타 유용핚 기능

86

변수에 if문 사용

Java에서는 변수에 값을 넣는데 조건을 주려면 삼항연산자를 써야했다.

하지만 코틀린에서는 변수에 값을 줄 때에도 if문 사용이 가능하다

fun foo(param: Int) {

val result = if(param == 1) {

“one”

} else {

“two”

}

}

Page 87: 일단 시작하는 코틀린

기타 유용핚 기능

87

if(“aaa” is String) { println(“true”) } // true

if(“aaa” is Int) { println(“true”) } // X

var num = 10

if(num is String) { println(“true”) } // X

if(num is Int) { println(“true”) } // true

is 키워드

자바의 instanceOf와 같은 키워드로 변수나 상수의 타입을 알아볼 때 쓴다.

Page 88: 일단 시작하는 코틀린

마무리

88

감사합니다

Page 89: 일단 시작하는 코틀린

Kotlin 홈페이지 https://kotlinlang.org/docs/reference/

참조 사이트

쿠...sal님 블로그 http://i5on9i.blogspot.kr/2015/07/blog-post_5.html

구글검색 http://google.com

Stackoverflow http://stackoverflow.com/

89