SlideShare a Scribd company logo
1 of 89
Download to read offline
빠르진 않지만 일단 만나보는 코틀린
박중수
2016. 02.
박중수 (Daniel Park)
- wndtn853@gmail.com
- http://danielpark.net
- http://career.danielpark.net
- https://www.linkedin.com/in/jsdanielpark
- 2011~ 성공회대 소프트웨어공학 전공
- 2011~2014 Web, Android 외주 개발 및 파트타임
- 2014 ~ 현재 공군 기상단 개발병 복무중
- 팀원 수가 적다보니 강제로 Full Stack
2
- Windows 7
- JDK8
- JetBrains InteliJ Idea 15.0.3
3
사용 환경
설치 및 환경설정
7 설치
9 프로젝트 생성 및 테스트
기본-
18 주석
20 변수
22 자료형
26 함수
30 람다
35 패키지
흐름제어
38 조건문
42 반복문
47 예외처리
목차
4
클래스
52 클래스
55 클래스-보조생성자
56 오버라이딩
57 오픈 클래스
58 추상 클래스
59 인터페이스
61 인터페이스-다중상속
62 데이터클래스
자료구조-
66 배열
68 range
70 ArrayList
72 LinkedList
73 HashMap
75 Collections의 in 문법
78 Collections의 연산
목차
5
기타 유용핚 기능
80 문자열 템플릿
81 타입 오토캐스팅
82 Null 검사
83 Null 핸들링
85 확장 함수
86 변수에 if문 사용
87 is 키워드
마무리-
88 마무리
89 참고 사이트
목차
6
설치
7
설치
8
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-
downloads-2133151.html
1. JDK8 설치
https://www.jetbrains.com/idea/
2. InteliJ Idea 설치 (IDE에 Kotlin 플러그인 포함)
프로젝트 생성 및 테스트
9
프로젝트 생성 및 테스트
10
1. 첫 화면에서 Create New Project 생성
2. Java -> Kotlin(Java) 선택
프로젝트 생성 및 테스트
11
3. 상단의 Project SDK에서 New -> JDK 클릭
4. 자바가 설치된 jdk 경로를 선택하고
OK를 클릭
프로젝트 생성 및 테스트
12
5. 하단의 Use library에서 Create를 클릭
6. Use library from plugin을 선택한 후 OK
프로젝트 생성 및 테스트
13
설정이 끝났으므로 Next를 누른 후 프로젝트 명을 입력하고
Finish를 누른다.
프로젝트 생성 및 테스트
14
처음 나오는 Tip 창을 닫아주면 아래와 같은 프로젝트 화면이
나타난다. src를 오른쪽 클릭하여 -> New -> Kotlin File/Class 를
클릭한다.
프로젝트 생성 및 테스트
15
처음 나오는 Tip 창을 닫아주면 아래와 같은 프로젝트 화면이
나타난다. src를 오른쪽 클릭하여 -> New -> Kotlin File/Class 를
클릭한다.
프로젝트 생성 및 테스트
16
파일명을 입력해주고 OK를 클릭해주면 .kt 확장자로 파일이 생성된다.
이 곳에서 문법을 테스트를 하면 된다.
프로젝트 생성 및 테스트
17
Main 메소드는 “fun main(args: Array<String>) {}” 로 선언한다.
출력문인 println 함수로 Hello World를 출력해보았다.
※ 코틀린은 세미콜론(;)을 붙이지 않아도 된다.
func main(args: Array<String>) {
println(“Hello World”)
}
결과
주석
18
주석
19
주석 달기
코틀린의 주석은 자바와 같다.
한 줄의 주석은 “//”
여러 줄의 주석은 “/* */”로 달 수 있다.
// 한 줄 주석
/*
여러 줄 주석
*/
변수
20
변수
21
변수의 선언
변수의 선언은 아래와 같이 한다. 코틀린은 변수타입을 자동으로 캐스팅해주기 때문에
변수의 자료형을 명시하지 않아도 된다.
val a = 1
변수에 특정 타입만 담고싶다면 자료형을 명시할 수 있다.
val a: Int = 5
또한 변수를 초기화 시키지 않고 선언만 한 후에 나중에 값을 담는 것도 가능하다.
val a: Int
a = 5
자료형
22
자료형
23
자료형의 종류
정수 실수 문자 논리
Long(64) Double(64) Char Boolean
Int(32) Float(32)
Short(16)
Byte(8)
자료형
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자료형명() 메소드로 할 수 있다.
자료형
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값을 가질 수 있다.
함수
26
함수
27
함수의 선언
함수의 기본 형태는 다음과 같다
fun 함수명(인자1:자료형, 인자2:자료형….) : 반홖형 {
// code
return 반홖값
}
두 정수를 인자로 받아 더해서 반환하는 함수를 정의하자면 아래와 같다.
fun sum(a: Int, b: Int) : Int {
return a+b
}
함수
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 )
}
함수
29
함수의 선언
함수에서 인자의 기본값을 정의해줄 수도 있다.
fun sum(a: Int = 0, b: Int = 5) : Int {
return a+b
}
var num = sum(b=3)
println(num) // 0+3이므로 5가 출력된다
람다
30
람다
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 } )
람다
32
Higher-Order Function (함수를 인자로 받는 함수)
정수 두 개를 받고, 문자열을 반환하는 함수
함수 선언 시 : fun myFunc(arg: (Int, Int) -> Int )
함수 호출 시 : myFunc(arg = { x:Int, y:Int -> x+y (자동반홖) } )
람다
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 메소드의 인자는 인자로 받은 함수의 인자의 타입과 동일하다.
람다
34
Higher-Order Function (함수를 인자로 받는 함수)
Thread 클래스는 인자도 없고 반환값도 없는 타입의 함수를 생성자로 받아
그 함수를 쓰레드에 올린다. 그 코드는 아래와 같다
Thread({
print("Hello Thread")
}).start()
패키지
35
패키지
36
패키지 선언
자바와 동일하다. 파일의 최상단에 패키지를 선언해준다.
package foo.bar
……file……
패키지
37
패키지 불러오기
자바와 동일하다. Import문으로 패키지를 불러온다.
import foo.bar.*
as 키워드로 클래스에 다른 이름을 붙여줄 수도 있다.
import java.util.Random as MyRandom
var random:MyRandom = MyRandom()
println(random.nextInt())
조건문
38
조건문
if 문
If문의 문법은 자바의 if문과 완전 동일하다.
if ( 조건1 ) {
// 조건1 참
} else if (조건 2) {
// 조건2 참
} else {
// 조건3 참
}
39
조건문
40
when
When은 자바의 switch-case와 비슷한 조건문이다
var num = 2
when(num) {
1 -> {
print(“1”)
}
2 -> {
print(“2”)
}
else -> {
print(“no”)
}
}
조건문
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")
}
}
반복문
42
반복문
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 )
}
반복문
44
while 문
While문은 Java의 while문과 같다.
var arr:Array<String> = arrayOf("a", "b", "c")
var i = 0
while( i<arr.size ) {
println(arr[i])
i++
}
반복문
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 )
반복문
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”만 출력하고 반복문이 멈추게 된다.
예외처리
47
예외처리
48
try-catch
try {
// Code Block
} catch(e: Exception) {
// 예외시 동작
} finally {
// finally 동작
}
자바의 try-catch와 비슷하다
예외처리
49
try-catch
var result = try {
count()
} catch(e: Exception) {
-1
}
변수에도 적용할 수가 있다.
result 변수에는 count 함수에서 예외가 발생할 시 -1이 들어가게 된다.
예외처리
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 문을 코틀린에서도 사용할 수 있다.
인터페이스와 클래스
51
인터페이스와 클래스
52
클래스
고객 클래스를 정의하자면 다음과 같다
class Customer constuctor(val name: String, val phone: String)
코틀린에서 클래스는 class 키워드로 정의한다.
클래스는 하나의 주 생성자와 여러 개의 보조 생성자를 가지는데
주 생성자는 클래스를 선언하며 함께 선언해준다
class 클래스명 contructor(val 변수명:자료형 …..)
친절하게도 constructor 키워드는 생략이 가능하다.
class Customer (val name: String, val phone: String)
인터페이스와 클래스
53
클래스
인스턴스 변수의 초기화는 생성자에서 받은 변수로 바로 해주면 된다.
class Customer (val name: String, val phone: String) {
val name = name
val phone = phone
}
인터페이스와 클래스
54
클래스
보조 생성자가 없는데 초기화 설정코드가 있을 경우엔 init 블록을 사용하여
초기화시킨다.
class Customer (val name: String, val phone: String) {
val name = name
val phone = phone
init {
logger.info(“초기화”)
}
}
인터페이스와 클래스
55
클래스-보조 생성자
보조 생성자는 클래스의 코드블럭 안에서 constructor 키워드를 이용해 선언할 수 있다.
class Customer (val name: String, val phone: String) {
val name = name
val phone = phone
constructor(name: String): this(name, "zzz") {
// 초기화 코드
}
}
인터페이스와 클래스
56
오버라이딩
클래스의 오버라이딩은 override 키워드를 이용한다.
class FileUploadBoard () : Board() {
override fun write() {
// code…..
}
}
인터페이스와 클래스
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 입니다”) }
}
인터페이스와 클래스
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 클래스는 다중 상속이 불가능하다.
인터페이스와 클래스
59
인터페이스
인터페이스는 자바8과 같이 메소드의 구현이 가능하다.
하지만 인스턴스 변수를 초기화 시킬 수 없고 자식클래스에서
오버라이드 하여 값을 부여해야한다.
interface MyInterface {
var prop: Int
fun myFun()
fun printProp() {
println(prop)
}
}
※ 인터페이스는 자바처럼 다중 상속이 가능하다.
인터페이스와 클래스
60
인터페이스
이전 슬라이드의 코드를 구현하면 다음과 같다
class Child: MyInterface {
override var prop: Int = 30
fun myFun() {
println(“my Funtion”)
}
fun printProp() {
println(prop)
}
}
인터페이스와 클래스
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
}
}
인터페이스와 클래스
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 변수명:자료형 …..)
인터페이스와 클래스
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 메소드를 통해 객체를 복사해야한다.
인터페이스와 클래스
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”
}
데이터 클래스의 인스턴스에 들은 값들을 변수에 한번에 집어넣을 수도 있다.
자료구조
65
자료구조
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키워드의 대소문자를 구분하여야 한다.
자료구조
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‟….) // 문자배열
각각의 기본자료형을 표현할 수 있는 별도의 배열들도 있다.
자료구조
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
자료구조
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
자료구조
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>()
자료구조
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
자료구조
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”
자료구조
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”) … )
자료구조
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
자료구조
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가 출력된다
자료구조
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
자료구조
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) 형식으로도 사용핛 수 있다.
자료구조
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 메소드가 없다)
기타 유용핚 기능
79
기타 유용핚 기능
80
문자열 템플릿
다음과 같이 갂략하게 선언할 수도 있다.
fun sum(a: Int, b: Int) = a+b
변수를 별도의 문법 추가 없이 문자열에 출력할 수 있다.
var str: String = “Hello”
print(“${str} World!”)
 “Hello World”
기타 유용핚 기능
81
타입 오토 캐스팅
타입을 유추하여 자동으로 캐스팅을 해주기 때문에 유연하다.
fun getStringLength(obj: Any): Int? {
if( obj is String ) {
// obj는 String타입이라 밝혀졌기 때문에 String 타입으로 자동 캐스팅된다.
return obj.length
}
return null
}
기타 유용핚 기능
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”가 출력된다.
기타 유용핚 기능
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”란 값을 담는다
기타 유용핚 기능
84
Null 핸들링
값이 Null이 아닌 경우 수행할 동작을 정의할 수 있다.
var files = java.io.File(“C:”).list() // C 드라이브의 파일목록이 반홖된다.
files?.let {
println(“files is not null!!”)
}
기타 유용핚 기능
85
확장 함수
기존의 클래스에 우리가 함수를 새로 추가할 수 있다.
fun String.newMethod():String { return "new Method!!" }
fun main(args: Array<String>) {
var str:String = “”
println( str.newMethod() ) // “new Method!!”가 출력된다.
}
기타 유용핚 기능
86
변수에 if문 사용
Java에서는 변수에 값을 넣는데 조건을 주려면 삼항연산자를 써야했다.
하지만 코틀린에서는 변수에 값을 줄 때에도 if문 사용이 가능하다
fun foo(param: Int) {
val result = if(param == 1) {
“one”
} else {
“two”
}
}
기타 유용핚 기능
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와 같은 키워드로 변수나 상수의 타입을 알아볼 때 쓴다.
마무리
88
감사합니다
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

More Related Content

What's hot

TestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit TestingTestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit TestingBethmi Gunasekara
 
Testing with JUnit 5 and Spring
Testing with JUnit 5 and SpringTesting with JUnit 5 and Spring
Testing with JUnit 5 and SpringVMware Tanzu
 
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]Jaeman An
 
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...Amazon Web Services Korea
 
Storing 16 Bytes at Scale
Storing 16 Bytes at ScaleStoring 16 Bytes at Scale
Storing 16 Bytes at ScaleFabian Reinartz
 
Building Awesome CLI apps in Go
Building Awesome CLI apps in GoBuilding Awesome CLI apps in Go
Building Awesome CLI apps in GoSteven Francia
 
Functional Tests Automation with Robot Framework
Functional Tests Automation with Robot FrameworkFunctional Tests Automation with Robot Framework
Functional Tests Automation with Robot Frameworklaurent bristiel
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리YoungHeon (Roy) Kim
 
Allure framework
Allure frameworkAllure framework
Allure frameworkartkoshelev
 
Kubernetes Security with Calico and Open Policy Agent
Kubernetes Security with Calico and Open Policy AgentKubernetes Security with Calico and Open Policy Agent
Kubernetes Security with Calico and Open Policy AgentCloudOps2005
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.David Gómez García
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepGuo Albert
 
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldJorge Vásquez
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Intro to vue.js
Intro to vue.jsIntro to vue.js
Intro to vue.jsTechMagic
 
Action Jackson! Effective JSON processing in Spring Boot Applications
Action Jackson! Effective JSON processing in Spring Boot ApplicationsAction Jackson! Effective JSON processing in Spring Boot Applications
Action Jackson! Effective JSON processing in Spring Boot ApplicationsJoris Kuipers
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020Ji-Woong Choi
 

What's hot (20)

TestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit TestingTestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit Testing
 
Testing with JUnit 5 and Spring
Testing with JUnit 5 and SpringTesting with JUnit 5 and Spring
Testing with JUnit 5 and Spring
 
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
 
Spring boot
Spring bootSpring boot
Spring boot
 
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
 
Storing 16 Bytes at Scale
Storing 16 Bytes at ScaleStoring 16 Bytes at Scale
Storing 16 Bytes at Scale
 
Building Awesome CLI apps in Go
Building Awesome CLI apps in GoBuilding Awesome CLI apps in Go
Building Awesome CLI apps in Go
 
Vue, vue router, vuex
Vue, vue router, vuexVue, vue router, vuex
Vue, vue router, vuex
 
Functional Tests Automation with Robot Framework
Functional Tests Automation with Robot FrameworkFunctional Tests Automation with Robot Framework
Functional Tests Automation with Robot Framework
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리
 
Allure framework
Allure frameworkAllure framework
Allure framework
 
Kubernetes Security with Calico and Open Policy Agent
Kubernetes Security with Calico and Open Policy AgentKubernetes Security with Calico and Open Policy Agent
Kubernetes Security with Calico and Open Policy Agent
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
 
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorld
 
Ansible
AnsibleAnsible
Ansible
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Intro to vue.js
Intro to vue.jsIntro to vue.js
Intro to vue.js
 
Action Jackson! Effective JSON processing in Spring Boot Applications
Action Jackson! Effective JSON processing in Spring Boot ApplicationsAction Jackson! Effective JSON processing in Spring Boot Applications
Action Jackson! Effective JSON processing in Spring Boot Applications
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
 

Similar to 일단 시작하는 코틀린

Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream성 남궁
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Why what how kotlin
Why what how kotlinWhy what how kotlin
Why what how kotlinSewonKo
 
자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라Jong Gook Bae
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)유익아카데미
 

Similar to 일단 시작하는 코틀린 (20)

Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Why what how kotlin
Why what how kotlinWhy what how kotlin
Why what how kotlin
 
자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
Scalability
ScalabilityScalability
Scalability
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
Java_10 람다
Java_10 람다Java_10 람다
Java_10 람다
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
java_2장.pptx
java_2장.pptxjava_2장.pptx
java_2장.pptx
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
 

일단 시작하는 코틀린

  • 1. 빠르진 않지만 일단 만나보는 코틀린 박중수 2016. 02.
  • 2. 박중수 (Daniel Park) - wndtn853@gmail.com - http://danielpark.net - http://career.danielpark.net - https://www.linkedin.com/in/jsdanielpark - 2011~ 성공회대 소프트웨어공학 전공 - 2011~2014 Web, Android 외주 개발 및 파트타임 - 2014 ~ 현재 공군 기상단 개발병 복무중 - 팀원 수가 적다보니 강제로 Full Stack 2
  • 3. - Windows 7 - JDK8 - JetBrains InteliJ Idea 15.0.3 3 사용 환경
  • 4. 설치 및 환경설정 7 설치 9 프로젝트 생성 및 테스트 기본- 18 주석 20 변수 22 자료형 26 함수 30 람다 35 패키지 흐름제어 38 조건문 42 반복문 47 예외처리 목차 4
  • 5. 클래스 52 클래스 55 클래스-보조생성자 56 오버라이딩 57 오픈 클래스 58 추상 클래스 59 인터페이스 61 인터페이스-다중상속 62 데이터클래스 자료구조- 66 배열 68 range 70 ArrayList 72 LinkedList 73 HashMap 75 Collections의 in 문법 78 Collections의 연산 목차 5
  • 6. 기타 유용핚 기능 80 문자열 템플릿 81 타입 오토캐스팅 82 Null 검사 83 Null 핸들링 85 확장 함수 86 변수에 if문 사용 87 is 키워드 마무리- 88 마무리 89 참고 사이트 목차 6
  • 10. 프로젝트 생성 및 테스트 10 1. 첫 화면에서 Create New Project 생성 2. Java -> Kotlin(Java) 선택
  • 11. 프로젝트 생성 및 테스트 11 3. 상단의 Project SDK에서 New -> JDK 클릭 4. 자바가 설치된 jdk 경로를 선택하고 OK를 클릭
  • 12. 프로젝트 생성 및 테스트 12 5. 하단의 Use library에서 Create를 클릭 6. Use library from plugin을 선택한 후 OK
  • 13. 프로젝트 생성 및 테스트 13 설정이 끝났으므로 Next를 누른 후 프로젝트 명을 입력하고 Finish를 누른다.
  • 14. 프로젝트 생성 및 테스트 14 처음 나오는 Tip 창을 닫아주면 아래와 같은 프로젝트 화면이 나타난다. src를 오른쪽 클릭하여 -> New -> Kotlin File/Class 를 클릭한다.
  • 15. 프로젝트 생성 및 테스트 15 처음 나오는 Tip 창을 닫아주면 아래와 같은 프로젝트 화면이 나타난다. src를 오른쪽 클릭하여 -> New -> Kotlin File/Class 를 클릭한다.
  • 16. 프로젝트 생성 및 테스트 16 파일명을 입력해주고 OK를 클릭해주면 .kt 확장자로 파일이 생성된다. 이 곳에서 문법을 테스트를 하면 된다.
  • 17. 프로젝트 생성 및 테스트 17 Main 메소드는 “fun main(args: Array<String>) {}” 로 선언한다. 출력문인 println 함수로 Hello World를 출력해보았다. ※ 코틀린은 세미콜론(;)을 붙이지 않아도 된다. func main(args: Array<String>) { println(“Hello World”) } 결과
  • 19. 주석 19 주석 달기 코틀린의 주석은 자바와 같다. 한 줄의 주석은 “//” 여러 줄의 주석은 “/* */”로 달 수 있다. // 한 줄 주석 /* 여러 줄 주석 */
  • 21. 변수 21 변수의 선언 변수의 선언은 아래와 같이 한다. 코틀린은 변수타입을 자동으로 캐스팅해주기 때문에 변수의 자료형을 명시하지 않아도 된다. val a = 1 변수에 특정 타입만 담고싶다면 자료형을 명시할 수 있다. val a: Int = 5 또한 변수를 초기화 시키지 않고 선언만 한 후에 나중에 값을 담는 것도 가능하다. val a: Int a = 5
  • 23. 자료형 23 자료형의 종류 정수 실수 문자 논리 Long(64) Double(64) Char Boolean Int(32) Float(32) Short(16) Byte(8)
  • 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자료형명() 메소드로 할 수 있다.
  • 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값을 가질 수 있다.
  • 27. 함수 27 함수의 선언 함수의 기본 형태는 다음과 같다 fun 함수명(인자1:자료형, 인자2:자료형….) : 반홖형 { // code return 반홖값 } 두 정수를 인자로 받아 더해서 반환하는 함수를 정의하자면 아래와 같다. fun sum(a: Int, b: Int) : Int { return a+b }
  • 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 ) }
  • 29. 함수 29 함수의 선언 함수에서 인자의 기본값을 정의해줄 수도 있다. fun sum(a: Int = 0, b: Int = 5) : Int { return a+b } var num = sum(b=3) println(num) // 0+3이므로 5가 출력된다
  • 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 } )
  • 32. 람다 32 Higher-Order Function (함수를 인자로 받는 함수) 정수 두 개를 받고, 문자열을 반환하는 함수 함수 선언 시 : fun myFunc(arg: (Int, Int) -> Int ) 함수 호출 시 : myFunc(arg = { x:Int, y:Int -> x+y (자동반홖) } )
  • 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 메소드의 인자는 인자로 받은 함수의 인자의 타입과 동일하다.
  • 34. 람다 34 Higher-Order Function (함수를 인자로 받는 함수) Thread 클래스는 인자도 없고 반환값도 없는 타입의 함수를 생성자로 받아 그 함수를 쓰레드에 올린다. 그 코드는 아래와 같다 Thread({ print("Hello Thread") }).start()
  • 36. 패키지 36 패키지 선언 자바와 동일하다. 파일의 최상단에 패키지를 선언해준다. package foo.bar ……file……
  • 37. 패키지 37 패키지 불러오기 자바와 동일하다. Import문으로 패키지를 불러온다. import foo.bar.* as 키워드로 클래스에 다른 이름을 붙여줄 수도 있다. import java.util.Random as MyRandom var random:MyRandom = MyRandom() println(random.nextInt())
  • 39. 조건문 if 문 If문의 문법은 자바의 if문과 완전 동일하다. if ( 조건1 ) { // 조건1 참 } else if (조건 2) { // 조건2 참 } else { // 조건3 참 } 39
  • 40. 조건문 40 when When은 자바의 switch-case와 비슷한 조건문이다 var num = 2 when(num) { 1 -> { print(“1”) } 2 -> { print(“2”) } else -> { print(“no”) } }
  • 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") } }
  • 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 ) }
  • 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++ }
  • 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 )
  • 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”만 출력하고 반복문이 멈추게 된다.
  • 48. 예외처리 48 try-catch try { // Code Block } catch(e: Exception) { // 예외시 동작 } finally { // finally 동작 } 자바의 try-catch와 비슷하다
  • 49. 예외처리 49 try-catch var result = try { count() } catch(e: Exception) { -1 } 변수에도 적용할 수가 있다. result 변수에는 count 함수에서 예외가 발생할 시 -1이 들어가게 된다.
  • 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 문을 코틀린에서도 사용할 수 있다.
  • 52. 인터페이스와 클래스 52 클래스 고객 클래스를 정의하자면 다음과 같다 class Customer constuctor(val name: String, val phone: String) 코틀린에서 클래스는 class 키워드로 정의한다. 클래스는 하나의 주 생성자와 여러 개의 보조 생성자를 가지는데 주 생성자는 클래스를 선언하며 함께 선언해준다 class 클래스명 contructor(val 변수명:자료형 …..) 친절하게도 constructor 키워드는 생략이 가능하다. class Customer (val name: String, val phone: String)
  • 53. 인터페이스와 클래스 53 클래스 인스턴스 변수의 초기화는 생성자에서 받은 변수로 바로 해주면 된다. class Customer (val name: String, val phone: String) { val name = name val phone = phone }
  • 54. 인터페이스와 클래스 54 클래스 보조 생성자가 없는데 초기화 설정코드가 있을 경우엔 init 블록을 사용하여 초기화시킨다. class Customer (val name: String, val phone: String) { val name = name val phone = phone init { logger.info(“초기화”) } }
  • 55. 인터페이스와 클래스 55 클래스-보조 생성자 보조 생성자는 클래스의 코드블럭 안에서 constructor 키워드를 이용해 선언할 수 있다. class Customer (val name: String, val phone: String) { val name = name val phone = phone constructor(name: String): this(name, "zzz") { // 초기화 코드 } }
  • 56. 인터페이스와 클래스 56 오버라이딩 클래스의 오버라이딩은 override 키워드를 이용한다. class FileUploadBoard () : Board() { override fun write() { // code….. } }
  • 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 입니다”) } }
  • 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 클래스는 다중 상속이 불가능하다.
  • 59. 인터페이스와 클래스 59 인터페이스 인터페이스는 자바8과 같이 메소드의 구현이 가능하다. 하지만 인스턴스 변수를 초기화 시킬 수 없고 자식클래스에서 오버라이드 하여 값을 부여해야한다. interface MyInterface { var prop: Int fun myFun() fun printProp() { println(prop) } } ※ 인터페이스는 자바처럼 다중 상속이 가능하다.
  • 60. 인터페이스와 클래스 60 인터페이스 이전 슬라이드의 코드를 구현하면 다음과 같다 class Child: MyInterface { override var prop: Int = 30 fun myFun() { println(“my Funtion”) } fun printProp() { println(prop) } }
  • 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 } }
  • 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 변수명:자료형 …..)
  • 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 메소드를 통해 객체를 복사해야한다.
  • 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” } 데이터 클래스의 인스턴스에 들은 값들을 변수에 한번에 집어넣을 수도 있다.
  • 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키워드의 대소문자를 구분하여야 한다.
  • 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‟….) // 문자배열 각각의 기본자료형을 표현할 수 있는 별도의 배열들도 있다.
  • 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
  • 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
  • 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>()
  • 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
  • 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”
  • 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”) … )
  • 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
  • 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가 출력된다
  • 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
  • 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) 형식으로도 사용핛 수 있다.
  • 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 메소드가 없다)
  • 80. 기타 유용핚 기능 80 문자열 템플릿 다음과 같이 갂략하게 선언할 수도 있다. fun sum(a: Int, b: Int) = a+b 변수를 별도의 문법 추가 없이 문자열에 출력할 수 있다. var str: String = “Hello” print(“${str} World!”)  “Hello World”
  • 81. 기타 유용핚 기능 81 타입 오토 캐스팅 타입을 유추하여 자동으로 캐스팅을 해주기 때문에 유연하다. fun getStringLength(obj: Any): Int? { if( obj is String ) { // obj는 String타입이라 밝혀졌기 때문에 String 타입으로 자동 캐스팅된다. return obj.length } return null }
  • 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”가 출력된다.
  • 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”란 값을 담는다
  • 84. 기타 유용핚 기능 84 Null 핸들링 값이 Null이 아닌 경우 수행할 동작을 정의할 수 있다. var files = java.io.File(“C:”).list() // C 드라이브의 파일목록이 반홖된다. files?.let { println(“files is not null!!”) }
  • 85. 기타 유용핚 기능 85 확장 함수 기존의 클래스에 우리가 함수를 새로 추가할 수 있다. fun String.newMethod():String { return "new Method!!" } fun main(args: Array<String>) { var str:String = “” println( str.newMethod() ) // “new Method!!”가 출력된다. }
  • 86. 기타 유용핚 기능 86 변수에 if문 사용 Java에서는 변수에 값을 넣는데 조건을 주려면 삼항연산자를 써야했다. 하지만 코틀린에서는 변수에 값을 줄 때에도 if문 사용이 가능하다 fun foo(param: Int) { val result = if(param == 1) { “one” } else { “two” } }
  • 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와 같은 키워드로 변수나 상수의 타입을 알아볼 때 쓴다.
  • 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