Slide 1

Slide 1 text

)FZ,PUMJO )PXJUXPSLT !DXEPI

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

https://goo.gl/2Tyx4B (eng.) https://goo.gl/H9iih9 (kor.) https://goo.gl/8VdiCz (GitHub)

Slide 4

Slide 4 text

8FDBOXSJUF,PUMJODPEF GPS"OESPJE

Slide 5

Slide 5 text

#VU IPXEPJUBDUVBMMZXPSLT

Slide 6

Slide 6 text

4P IPXEPXFLOPXBDUVBMMZJUXPSLT

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

5PPM,PUMJO#ZUFDPEFJOTQFDUPS 4IPX,PUMJOCZUFDPEF%FDPNQJMF

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

#BTJDGFBUVSFT

Slide 12

Slide 12 text

package com.cwdoh.devfest2017 class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null fun description() = "$speaker's talk: '$title' at room $room" }

Slide 13

Slide 13 text

WBSWTWBM

Slide 14

Slide 14 text

package com.cwdoh.devfest2017 class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null fun description() = "$speaker's talk: '$title' at room $room" }

Slide 15

Slide 15 text

class Session { var name = "cwdoh" } 1SPQFSUZWBS public final class Session { @NotNull private String name = "cwdoh"; @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String var1) { Intrinsics.checkParameterIsNotNull(var1, ""); this.name = var1; } }

Slide 16

Slide 16 text

class Session { val name = "cwdoh" } 1SPQFSUZWBM public final class Session { @NotNull private final String name = "cwdoh"; @NotNull public final String getName() { return this.name; } }

Slide 17

Slide 17 text

class Session { val speaker = "cwdoh" fun description() { val talks = "$speaker's talks" println(talks) } } -PDBM7BSJBCMF public final class Session { @NotNull private final String speaker = "cwdoh"; @NotNull public final String getSpeaker() { return this.speaker; } public final void description() { String talks = "" + this.speaker + "'s talks"; System.out.println(talks); } }

Slide 18

Slide 18 text

/VMMBCMFWT/PU/VMM

Slide 19

Slide 19 text

package com.cwdoh.devfest2017 class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null fun description() = "$speaker's talk: '$title' at room $room" }

Slide 20

Slide 20 text

class Session { var name: String = "cwdoh" } /PU/VMMQSPQFSUZ public final class Session { @NotNull private String name = "cwdoh"; @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String var1) { Intrinsics.checkParameterIsNotNull(var1, ""); this.name = var1; } } public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } }

Slide 21

Slide 21 text

class Session { fun hello(name: String) = "hello, " + name } /PU/VMMQBSBNFUFS public final class Session { @NotNull public final String hello(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); return "hello, " + name; } } public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } }

Slide 22

Slide 22 text

class Session { fun hello(name: String) = "hello, " + name fun print() { val name: String = "cwdoh" print(hello(name)) } } /PU/VMMMPDBMWBSJBCMFQBSBNFUFS public final class Session { @NotNull public final String hello(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); return "hello, " + name; } public final void print() { String name = "cwdoh"; String var2 = this.hello(name); System.out.print(var2); } }

Slide 23

Slide 23 text

class Session { fun hello(name: String) = "hello, " + name fun print() { val name: String? = null print(hello(name!!)) } } .JYFE&YDFQUJPO public final class Session { @NotNull public final String hello(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); return "hello, " + name; } public final void print() { String name = (String)null; Intrinsics.throwNpe(); String var2 = this.hello(name); System.out.print(var2); } } NullPointerException?

Slide 24

Slide 24 text

4USJOH5FNQMBUF

Slide 25

Slide 25 text

package com.cwdoh.devfest2017 class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null fun description() = "$speaker's talk: '$title' at room $room" }

Slide 26

Slide 26 text

class Session { val speaker = "cwdoh" val title: String = "Kotlin: How it works" var room: Int? = null fun description() = "$speaker's talk: '$title' at room $room" } 4USJOH5FNQMBUFDPODBUFOBUJPO public final class Session { @NotNull private final String speaker = "cwdoh"; @NotNull private final String title = "Kotlin: How it works"; @Nullable private Integer room; … @NotNull public final String description() { return "" + this.speaker + "'s talk: ‘" + this.title + "' at room " + this.room; } }

Slide 27

Slide 27 text

#ZUFDPEFPG4USJOH5FNQMBUF4USJOH#VJMEFS // access flags 0x11 public final description()Ljava/lang/String; @Lorg/jetbrains/annotations/NotNull;() // invisible L0 LINENUMBER 8 L0 NEW java/lang/StringBuilder DUP INVOKESPECIAL java/lang/StringBuilder. ()V LDC "" INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 0 GETFIELD com/cwdoh/devfest2017/Session.speaker : Ljava/lang/String; INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; LDC "'s talk: '" INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 0 GETFIELD com/cwdoh/devfest2017/Session.title : Ljava/lang/String; INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; LDC "' at room " INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 0 GETFIELD com/cwdoh/devfest2017/Session.room : Ljava/lang/Integer; INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder; INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String; ARETURN

Slide 28

Slide 28 text

*OIFSJUBODF

Slide 29

Slide 29 text

class NotOpenedClass open class OpenedClass ,FZXPSEPQFO public final class NotOpenedClass { } public class OpenedClass { }

Slide 30

Slide 30 text

interface Interface open class OpenClass class ChildClass: OpenClass(), Interface fun test() { val child = ChildClass() } 0QFOFEDMBTTJOUFSGBDF JOIFSJUBODF public final class ChildClass extends OpenClass implements Interface {} public interface Interface {} public class OpenClass {} public final class SimpleClassKt { public static final void test() { new ChildClass(); } }

Slide 31

Slide 31 text

DPOTUSVDUPS JOJU\^ QSPQFSUZEFDMBSBUJPOT

Slide 32

Slide 32 text

class Person1 constructor(name: String) class Person2(name: String) $POTUSVDUPS public final class Person1 { public Person1(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); } } public final class Person2 { public Person2(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); } }

Slide 33

Slide 33 text

class Person constructor(val name: String) $POTUSVDUPSXJUIWBMWBS public final class Person { @NotNull private final String name; @NotNull public final String getName() { return this.name; } public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; } }

Slide 34

Slide 34 text

class Person constructor(val name: String) { val greetings: String init { greetings = "hello, $name” } } *OJUJBM[JFS public final class Person { @NotNull private String greetings; @NotNull private final String name; @NotNull public final String getGreetings() { return this.greetings; } @NotNull public final String getName() { return this.name; } public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; this.greetings = "hello, " + this.name; } }

Slide 35

Slide 35 text

class Person constructor(val name: String) { val greetings: String var age: Int = null constructor(name: String, age: Int): this(name) { this.age = age } init { greetings = "hello, $name” } } $POTUSVDUPSEFMFHBUJPO*OJUJBMJ[FS public final class Person { @NotNull private final String greetings; private int age; … public Person(@NotNull String name) { Intrinsics.checkParameterIsNotNull(name, "name"); super(); this.name = name; this.age = ((Number)null).intValue(); this.greetings = "hello, " + this.name; } public Person(@NotNull String name, int age) { Intrinsics.checkParameterIsNotNull(name, "name"); this(name); this.age = age; } }

Slide 36

Slide 36 text

1SJPSJUJFT

Slide 37

Slide 37 text

open class Parent { private val a = println("Parent.a") constructor(arg: Unit=println("Parent primary constructor arg")) { println("Parent primary constructor") } init { println("Parent.init") } private val b = println("Parent.b") } class Child : Parent { val a = println("Child.a") init { println("Child.init 1") } constructor(arg: Unit=println("Child primary constructor arg")) : super() { println("Child primary constructor") } val b = println("Child.b") constructor(arg: Int, arg2:Unit= println("Child secondary constructor arg")): this() { println("Child secondary constructor") } init { println("Child.init 2") } } fun main(args: Array) { Child(1) } Child secondary constructor arg Child primary constructor arg Parent primary constructor arg Parent.a Parent.init Parent.b Parent primary constructor Child.a Child.init 1 Child.b Child.init 2 Child primary constructor Child secondary constructor 4PVSDF"OJOEFQUIMPPLBU,PUMJOsTJOJUJBMJ[FST

Slide 38

Slide 38 text

4VNNBSZ ↟$POTUSVDUPSBSHVNFOU ↟$POTUSVDUPSEFMFHBUJPODBMM ↟1SPQFSUZEFDMBSBUJPOT*OJUJBMJ[FS ↟$POTUSVDUPSCPEZ

Slide 39

Slide 39 text

HFUUFSTFUUFS

Slide 40

Slide 40 text

class Props { var size: Int = 0 val isEmpty: Boolean get() = this.size == 0 } $VTUPNHFUUFSTFUUFS public final class Props { private int size; public final int getSize() { return this.size; } public final void setSize(int var1) { this.size = var1; } public final boolean isEmpty() { return this.size == 0; } }

Slide 41

Slide 41 text

class Props { var age: Int = 0 set(value: Int) { age = if (value < 0) 0 else value } } $BVUJPOTUBDLPWFSGMPX public final class Props { private int age; public final int getAge() { return this.age; } public final void setAge(int value) { this.setAge(value < 0? 0:value); } }

Slide 42

Slide 42 text

class Props { var age: Int = 0 private set } TFUUFSHFUUFSNPEJGJFS public final class Props { private int age; public final int getAge() { return this.age; } private final void setAge(int var1) { this.age = var1; } }

Slide 43

Slide 43 text

&OVN

Slide 44

Slide 44 text

&OVN8IFO enum class BlendMode { OPAQUE, TRANSPARENT, FADE, ADD } fun blend(b: BlendMode) { when (b) { BlendMode.OPAQUE -> opaque() BlendMode.TRANSPARENT -> transparent() BlendMode.FADE -> fade() BlendMode.ADD -> add() } } public final class EnumTestKt$WhenMappings { // $FF: synthetic field public static final int[] $EnumSwitchMapping$0 = new int[BlendMode.values().length]; static { $EnumSwitchMapping$0[BlendMode.OPAQUE.ordinal()] = 1; $EnumSwitchMapping$0[BlendMode.TRANSPARENT.ordinal()] = 2; $EnumSwitchMapping$0[BlendMode.FADE.ordinal()] = 3; $EnumSwitchMapping$0[BlendMode.ADD.ordinal()] = 4; } } public final class EnumTestKt { public static final void blend(@NotNull BlendMode b) { Intrinsics.checkParameterIsNotNull(b, "b"); switch(EnumTestKt$WhenMappings.$EnumSwitchMapping$0[b.ordinal()]) { case 1: opaque(); break; case 2: transparent(); break; case 3: fade(); break; case 4: add(); } } }

Slide 45

Slide 45 text

&OVN8IFO enum class BlendMode { OPAQUE, TRANSPARENT, FADE, ADD } fun blend(b: BlendMode) { when (b) { BlendMode.OPAQUE -> opaque() BlendMode.TRANSPARENT -> transparent() BlendMode.FADE -> fade() BlendMode.ADD -> add() } } fun blend2(b: BlendMode) { when (b) { BlendMode.FADE -> fade() BlendMode.ADD -> add() BlendMode.TRANSPARENT -> transparent() BlendMode.OPAQUE -> opaque() } } public final class EnumTestKt$WhenMappings { // $FF: synthetic field public static final int[] $EnumSwitchMapping$0 = new int[BlendMode.values().length]; // $FF: synthetic field public static final int[] $EnumSwitchMapping$1; static { $EnumSwitchMapping$0[BlendMode.OPAQUE.ordinal()] = 1; $EnumSwitchMapping$0[BlendMode.TRANSPARENT.ordinal()] = 2; $EnumSwitchMapping$0[BlendMode.FADE.ordinal()] = 3; $EnumSwitchMapping$0[BlendMode.ADD.ordinal()] = 4; $EnumSwitchMapping$1 = new int[BlendMode.values().length]; $EnumSwitchMapping$1[BlendMode.FADE.ordinal()] = 1; $EnumSwitchMapping$1[BlendMode.ADD.ordinal()] = 2; $EnumSwitchMapping$1[BlendMode.TRANSPARENT.ordinal()] = 3; $EnumSwitchMapping$1[BlendMode.OPAQUE.ordinal()] = 4; } }

Slide 46

Slide 46 text

&OVN8IFO public final static blend(LBlendMode;)V @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 L0 ALOAD 0 LDC "b" INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V L1 LINENUMBER 9 L1 ALOAD 0 GETSTATIC EnumTestKt$WhenMappings.$EnumSwitchMapping$0 : [I SWAP INVOKEVIRTUAL BlendMode.ordinal ()I IALOAD L2 TABLESWITCH 1: L3 2: L4 3: L5 4: L6 default: L7 L3 LINENUMBER 10 L3 INVOKESTATIC EnumTestKt.opaque ()V GOTO L7 L4 …

Slide 47

Slide 47 text

6OTJHOFE*OUFHFS

Slide 48

Slide 48 text

6OTJHOFEJOU @kotlin.ExperimentalUnsignedTypes class UintTest { val a = 42u val b = 21u val c = a + b val d = a - b val e = a * b val f = a / b } int var1 = this.a; int var2 = this.b; int var4 = UInt.constructor-impl(var1 + var2); this.c = var4; var1 = this.a; var2 = this.b; var4 = UInt.constructor-impl(var1 - var2); this.d = var4; var1 = this.a; var2 = this.b; var4 = UInt.constructor-impl(var1 * var2); this.e = var4; var1 = this.a; var2 = this.b; var4 = UnsignedKt.uintDivide-J1ME1BU(var1, var2); this.f = var4;

Slide 49

Slide 49 text

3BOHFT

Slide 50

Slide 50 text

3BOHFTGPSMPPQ fun testForLoop1() { for (i in 0..10) {} } fun testForLoop2() { for (index in 0 until 10) { } } fun testForLoop3() { repeat(10) {} } fun testForLoop4() { (0..10).forEach {} } public final class RangesTestKt { public static final void testForLoop1() { int var0 = 0; for(byte var1 = 10; var0 <= var1; ++var0) { } } public static final void testForLoop2() { int var0 = 0; for(byte var1 = 10; var0 < var1; ++var0) { } } public static final void testForLoop3() { byte var0 = 10; int var1 = 0; for(byte var2 = var0; var1 < var2; ++var1) { } } public static final void testForLoop4() { byte var0 = 0; Iterable $receiver$iv = (Iterable)(new IntRange(var0, 10)); int element$iv; for(Iterator var1 = $receiver$iv.iterator(); var1.hasNext(); element$iv = ((IntIterator)var1).nextInt()) { } } }

Slide 51

Slide 51 text

3BOHFTGPSMPPQ fun testForLoopWithStep() { for(i in 0..10 step 2) { println(i) } } public static final void testForLoopWithStep() { byte var3 = 0; IntProgression var10000 = RangesKt.step((IntProgression)(new IntRange(var3, 10)), 2); int i = var10000.getFirst(); int var1 = var10000.getLast(); int var2 = var10000.getStep(); if (var2 > 0) { if (i > var1) { return; } } else if (i < var1) { return; } while(true) { System.out.println(i); if (i == var1) { return; } i += var2; } }

Slide 52

Slide 52 text

%FMFHBUJPO

Slide 53

Slide 53 text

-B[ZJOJUJBMJ[BUJPO

Slide 54

Slide 54 text

class MainActivity : AppCompatActivity() { private var mWelcomeTextView: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mWelcomeTextView = findViewById(R.id.msgView) as TextView } } :PVSGJSTU"DUJWJUZJO,PUMJOGSPN+BWB

Slide 55

Slide 55 text

class MainActivity : AppCompatActivity() { private lateinit var mWelcomeTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mWelcomeTextView = findViewById(R.id.msgView) as TextView } } 3FNPWJOH/VMMBCMFMBUFJOJU

Slide 56

Slide 56 text

class MainActivity : AppCompatActivity() { private val mWelcomeTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Where am I????? // mWelcomeTextView = // findViewById(R.id.msgView) as TextView } } *GQSPQFSUZWBMVFJTJNNVUBCMFEVSJOH$MBTT-JGFDZDMF

Slide 57

Slide 57 text

class MainActivity : AppCompatActivity() { private val messageView : TextView by lazy { // following code will be executed at first access findViewById(R.id.message_view) as TextView } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } fun onSayHello() { messageView.text = "Hello" } } -B[ZJOJUJBMJ[BUJPO

Slide 58

Slide 58 text

1SPQFSUZEFMFHBUJPO

Slide 59

Slide 59 text

%FDMBSJOHEFMFHBUF class Delegate { operator fun getValue( thisRef: Any?, property: KProperty<*> ): String { // do something // return value } operator fun setValue( thisRef: Any?, property: KProperty<*>, value: String ) { // do something // assign } }

Slide 60

Slide 60 text

WBMWBSQSPQFSUZ5ZQFCZEFMFHBUF

Slide 61

Slide 61 text

6OEFSUIFIPPEPG-B[ZJOJUJBMJ[BUJPO

Slide 62

Slide 62 text

class Demo { val myName : String by lazy { "John" } } -B[ZJOJUJBMJ[BUJPOCZ-B[Z EFMFHBUJPO public final class Demo { // $FF: synthetic field static final KProperty[] $$delegatedProperties = new KProperty[]{ … }; @NotNull private final Lazy myName$delegate; @NotNull public final String getMyName() { Lazy var1 = this.myName$delegate; KProperty var3 = $$delegatedProperties[0]; return (String)var1.getValue(); } public Demo() { this.myName$delegate = LazyKt.lazy((Function0)null.INSTANCE); } }

Slide 63

Slide 63 text

class Demo { val myName : String by lazy { getNameFromPreference() } } initializer delegate

Slide 64

Slide 64 text

myName Lazy getValue() { getNameFromPreference() } initializer class Demo { val myName : String by lazy { getNameFromPreference() } }

Slide 65

Slide 65 text

myName Lazy getValue() UNINITIALIZED_VALUE { getNameFromPreference() } initializer class Demo { val myName : String by lazy { getNameFromPreference() } }

Slide 66

Slide 66 text

myName Lazy getValue() “John” { getNameFromPreference() } initializer class Demo { val myName : String by lazy { getNameFromPreference() } }

Slide 67

Slide 67 text

myName Lazy getValue() “John” initializer null class Demo { val myName : String by lazy { getNameFromPreference() } }

Slide 68

Slide 68 text

class MainActivity : AppCompatActivity() { private val messageView : TextView by lazy { // I’ll be initialized lazily at first access findViewById(R.id.message_view) as TextView } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } fun onSayHello() { messageView.text = "Hello" } } #BDLUPDPEF

Slide 69

Slide 69 text

val messageView: TextView by lazy { findViewById(R.id.message_view) as TextView } property delegate ↟MB[Z HFUTMBNCEBGVODUJPO UIFOSFUVSOT-B[Z5 ↟'JSTUHFUUFSDBMMXJMMFYFDVUFTMBNCEBTUPSFSFTVMUJOJUTFMG ↟-BUFSHFUUFSDBMMTKVTUSFUVSOTUPSFEWBMVF

Slide 70

Slide 70 text

$MBTTEFMFHBUJPO

Slide 71

Slide 71 text

interface Base { fun printX() } class BaseImpl(val x: Int) : Base { override fun printX() { print(x) } } *NQMFNFOUBUJPOXJUIJOUFSGBDF

Slide 72

Slide 72 text

interface A { fun hello(): String } class B : A { override fun hello() = "Hello!!" } class C : A by B() $MBTTEFMFHBUJPO $MBTT$IBTEFMFHBUFENFUIPETPGJOTUBODF# EFGJOFECZJOUFSGBDF"

Slide 73

Slide 73 text

public interface A { @NotNull String hello(); } public final class B implements A { @NotNull public String hello() { return "Hello!!"; } } public final class C implements A { // $FF: synthetic field private final B $$delegate_0 = new B(); @NotNull public String hello() { return this.$$delegate_0.hello(); } } 4BNQMF$MBTTEFMFHBUJPO

Slide 74

Slide 74 text

$MBTTEFMFHBUJPO 8IZ ↟&TTFOUJBMMZ,PUMJODMBTTJTGJOBMJO+7.CZUFDPEF ↟.FBOTJOIFSJUBCMFDMBTTXJMMCFTFUCZrPQFOsPSrBCTUSBDUs ↟4P ,PUMJOQSPWJEFTUIFEFMFHBUFQBUUFSOXBZJOBEEJUJPOUPQVSFJOIFSJUBODF ↟&BTZXBZUPJNQMFNFOUEFMFHBUJPOXJUIPVUDPNQMFYDPEF ↟1SPUFDUTPUIFSNFUIPETCZJOUFSGBDF ↟1SPUFDUTEFMFHBUFEJOTUBODFCZTUPSJOHJUJOQSJWBUFGJFME ↟'MFYJCJMJUZUPJOKFDUOFFEFEJNQMFNFOUBUJPOTCZZPVSDIPJDF

Slide 75

Slide 75 text

&YUFOTJPOT

Slide 76

Slide 76 text

fun String.hello() : String { return "Hello, $this" } fun main(args: Array) { val whom = "cwdoh" println(whom.hello()) } // Result Hello, cwdoh &YUFOTJPOGVODUJPO

Slide 77

Slide 77 text

4PNFSVMFTPG&YUFOTJPOGVODUJPO

Slide 78

Slide 78 text

open class C class D: C() fun C.foo() = "c" fun D.foo() = "d" fun printFoo(c: C) { println(c.foo()) } class Demo { fun run() { printFoo(D()) } } 3VMF&YUFOTJPOTBSFSFTPMWFETUBUJDBMMZ public class C {} public final class D extends C {} public final class SimpleClassKt { @NotNull public static final String foo(@NotNull C $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); return "c"; } @NotNull public static final String foo(@NotNull D $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); return "d"; } public static final void printFoo(@NotNull C c) { Intrinsics.checkParameterIsNotNull(c, "c"); String var1 = foo(c); System.out.println(var1); } } public final class Demo { public final void run() { SimpleClassKt.printFoo((C)(new D())); } }

Slide 79

Slide 79 text

class Person { fun hello() { println("hello!") } } fun Person.hello() { println("উ֞?!!") } fun main(args: Array) { Person().hello() } // Result hello! 3VMFNFNCFSBMXBZTCFBUTFYUFOTJPOJOTBNFTJHOBUVSF public final class Person { public final void hello() { String var1 = "hello!"; System.out.println(var1); } } public final class SimpleClassKt { public static final void hello(@NotNull Person $receiver) { Intrinsics.checkParameterIsNotNull( $receiver, "$receiver"); String var1 = "উ֞?!!"; System.out.println(var1); } public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); (new Person()).hello(); } }

Slide 80

Slide 80 text

class D { fun bar() { println("D.bar()") } } class C { fun baz() { println("C.bar()") } fun D.foo() { bar() // calls D.bar baz() // calls C.baz } fun caller(d: D) { d.foo() } } 3VMF&YUFOTJPOJTEFDMBSFEJOTDPQF public final class C { public final void baz() { String var1 = "C.bar()"; System.out.println(var1); } public final void foo(@NotNull D $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); $receiver.bar(); this.baz(); } public final void caller(@NotNull D d) { Intrinsics.checkParameterIsNotNull(d, "d"); this.foo(d); } } public final class D { public final void bar() { String var1 = "D.bar()"; System.out.println(var1); } }

Slide 81

Slide 81 text

4VNNBSZ ↟&YUFOTJPOBMXBZTSFTPMWFTTUBUJDBMMZ ↟UIFSFsTOPQPMZNPSQIJTN#FDBSFGVMPGXIBUZPVDBMMJUCZ ↟.FNCFSBMXBZTXJOT ↟%FDMBSBUJPOTDPQF ↟1BZBUUFOUJPOUPOBNJOH TDPQF BOEXIBUZPVDBMMFYUFOTJPOCZ

Slide 82

Slide 82 text

data class Length(var centimeters: Int = 0) var Length.meters: Float get() { return centimeters / 100.0f } set(meters: Float) { this.centimeters = (meters * 100.0f).toInt() } &YUFOTJPOQSPQFSUZ

Slide 83

Slide 83 text

&YUFOTJPO1SPQFSUZEPFTOsUEFDMBSFBGJFME CVUKVTUBDDFTTJOUFSGBDF data class Length(var centimeters: Int = 0) var Length.meters: Float get() { return centimeters / 100.0f } set(meters: Float) { this.centimeters = (meters * 100.0f).toInt() } public final class Length { private int centimeters; ... } public final class ExtensionsKt { public static final float getMeters( @NotNull Length $receiver) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); return (float)$receiver.getCentimeters() / 100.0F; } public static final void setMeters( @NotNull Length $receiver, float meters) { Intrinsics.checkParameterIsNotNull($receiver, "$receiver"); $receiver.setCentimeters((int)(meters * 100.0F)); } ... }

Slide 84

Slide 84 text

fun Any?.toString(): String { if (this == null) return “null" return toString() } /VMMBCMFSFDFJWFS public final class SimpleClassKt { @NotNull public static final String toString(@Nullable Object $receiver) { return $receiver == null? "null":$receiver.toString(); } }

Slide 85

Slide 85 text

fun Any?.toString(): String { println("Extension is called.") if (this == null) return "null" return toString() } fun main(args: Array) { val var1 : Any? = null println(var1.toString()) val str1 : String? = null println(str1.toString()) var str2 : String? = "hello" println(str2.toString()) var str3 : String = "world" println(str3.toString()) } $"65*0//VMMBCMFSFDFJWFSCFBUTNFNCFS public final class SimpleClassKt { @NotNull public static final String toString(@Nullable Object $receiver) { String var1 = "Extension is called."; System.out.println(var1); return $receiver == null?"null":$receiver.toString(); } public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, “args"); Object var1 = null; String str1 = toString(var1); System.out.println(str1); str1 = (String)null; String str2 = toString(str1); System.out.println(str2); str2 = "hello"; String str3 = toString(str2); System.out.println(str3); str3 = "world"; String var5 = str3.toString(); System.out.println(var5); } } Extension is called. null Extension is called. null Extension is called. hello world

Slide 86

Slide 86 text

JOMJOF

Slide 87

Slide 87 text

JOMJOFGVODUJPO

Slide 88

Slide 88 text

OPJOMJOFGVODUJPO fun sing() { println("We will we will rock you") println("(Sing it!)") println("We will we will rock you") } fun beatbox() { println("pv zk bschk pv zk") } fun ensemble() { sing() beatbox() sing() beatbox() } public final class SimpleClassKt { public static final void sing() { String var0 = "We will we will rock you"; System.out.println(var0); var0 = "(Sing it!)"; System.out.println(var0); var0 = "We will we will rock you"; System.out.println(var0); } public static final void beatbox() { String var0 = "pv zk bschk pv zk"; System.out.println(var0); } public static final void ensemble() { sing(); beatbox(); sing(); beatbox(); } }

Slide 89

Slide 89 text

JOMJOFGVODUJPO fun sing() { println("We will we will rock you") println("(Sing it!)") println("We will we will rock you") } fun beatbox() { println("pv zk bschk pv zk") } fun ensemble() { sing() beatbox() sing() beatbox() } public final class SimpleClassKt { public static final void sing() { String var1 = "We will we will rock you"; … } public static final void beatbox() { … } public static final void ensemble() { String var0 = "We will we will rock you"; System.out.println(var0); var0 = "(Sing it!)"; System.out.println(var0); var0 = "We will we will rock you"; System.out.println(var0); beatbox(); var0 = "We will we will rock you"; System.out.println(var0); var0 = "(Sing it!)"; System.out.println(var0); var0 = "We will we will rock you"; System.out.println(var0); beatbox(); } }

Slide 90

Slide 90 text

fun log(message: () -> String) { println(message()) } fun test() { log { "Lorem ipsum dolor sit amet, consectetur ..." } } -PHHJOH public final class SimpleClassKt { public static final void log(@NotNull Function0 message) { Intrinsics.checkParameterIsNotNull(message, "message"); Object var1 = message.invoke(); System.out.println(var1); } public static final void test() { log((Function0)null.INSTANCE); } }

Slide 91

Slide 91 text

inline fun trace(message: String) {} fun doSomething() { print("I'm doing something!") trace("doSomething() is doing something!") } FNQUZJOMJOFGVODUJPO public final class SimpleClassKt { public static final void trace(@NotNull String message) { Intrinsics.checkParameterIsNotNull(message, "message"); } public static final void doSomething() { String var0 = "I'm doing something!"; System.out.print(var0); var0 = "doSomething() is doing something!"; } }

Slide 92

Slide 92 text

JOMJOFDMBTT

Slide 93

Slide 93 text

&OVN8IFO inline class Color(private val c: Int) { val a get() = (c shr 24) and 0xff val r get() = (c shr 16) and 0xff val g get() = (c shr 8) and 0xff val b get() = (c ) and 0xff } fun test() { val a = Color(0x7f_10_20_30) val b = Color(0x7f_30_20_10) println(a == b) println(a.equals(b)) } public final class InlineClassKt { public static final void test() { int a = Color.constructor-impl(2131763248); int b = Color.constructor-impl(2133860368); boolean var2 = Intrinsics.areEqual( Color.box-impl(a), Color.box-impl(b)); System.out.println(var2); var2 = Color.equals-impl(a, Color.box-impl(b)); System.out.println(var2); } }

Slide 94

Slide 94 text

"SSBZ

Slide 95

Slide 95 text

*OJUJBMJ[JOH"SSBZ var arr1 = intArrayOf(0, 1, 2) var arr2 = arrayOf(0, 1, 2) var arr3 = IntArray(3) { it } @NotNull private static int[] arr1 = new int[]{0, 1, 2}; @NotNull private static Integer[] arr2 = new Integer[]{0, 1, 2}; @NotNull private static int[] arr3; static { int size$iv = 3; int[] result$iv = new int[size$iv]; int i$iv = 0; for(int var3 = result$iv.length; i$iv < var3; result$iv[i$iv] = i$iv++) { } arr3 = result$iv; }

Slide 96

Slide 96 text

-BNCEB

Slide 97

Slide 97 text

JOMJOFGVODUJPO public class Widget { public interface Listener { void onEvent(Widget widget); } private int listenerCount = 0; public int getListenerCount() { return listenerCount; } public void addListener(Listener listener) {} public void removeListener(Listener listener) {} } val w = Widget() val listener = { widget: Widget -> println("Listened to $widget") } w.addListener(listener) println(w.listenerCount) w.removeListener(listener) println(w.listenerCount)

Slide 98

Slide 98 text

JOMJOFGVODUJPO

Slide 99

Slide 99 text

$PSPVUJOF

Slide 100

Slide 100 text

$PSPVUJOF

Slide 101

Slide 101 text

$PSPVUJOF

Slide 102

Slide 102 text

No content

Slide 103

Slide 103 text

No content

Slide 104

Slide 104 text

4VTQFOEGVODUJPO

Slide 105

Slide 105 text

fun fetchUserDetail(id: String) { val token = auth() val user = getUser(token, id) updateUserData(user) } BVUI Waaaaa~~it HFU6TFS VQEBUF6TFS%BUB 8BBBBB__JU

Slide 106

Slide 106 text

fun fetchUserDetail(id: String) { auth { token -> getUser(token) { updateUserData(it) } } } BVUI HFU6TFS VQEBUF6TFS%BUB

Slide 107

Slide 107 text

suspend fun fetchUserDetail(id: String) { val token = auth() val user = getUser(token, id) updateUserData(user) } suspend BVUI *%-& /POCMPDLJOH HFU6TFS VQEBUF6TFS%BUB *%-& /POCMPDLJOH

Slide 108

Slide 108 text

fun plusOne(initial: Int) : Int { val ONE = 1 var result = initial result += ONE return result } 4UBUF

Slide 109

Slide 109 text

)PXDPSPVUJOFXPSLT

Slide 110

Slide 110 text

suspend fun fetchUserDetail(id: String) { val token = auth() val user = getUser(token, id) updateUserData(user) } }

Slide 111

Slide 111 text

suspend fun fetchUserDetail(id: String) { // ... switch (label) { case 0: val token = auth() case 1: val user = getUser(token, id) case 2: updateUserData(user) } }

Slide 112

Slide 112 text

fun fetchUserDetail(id: String) { // ... switch (label) { case 0: val token = auth() case 1: val user = getUser(token, id) case 2: updateUserData(user) } } -BCFMJOH

Slide 113

Slide 113 text

fun fetchUserDetail(id: String, cont: Continuation) { switch ( label) { case 0: auth( ) case 1: getUser(token, id ) case 2: … } } val sm = object : CoroutineImpl { ... } sm. sm , sm 4UBUF.BDIJOF

Slide 114

Slide 114 text

fun fetchUserDetail(id: String, cont: Contiunation) { val sm = object : CoroutineImpl { ... } switch (sm.label) { case 0: auth(sm) case 1: getUser(token, id, sm) case 2: … } } $POUJOVBUJPO

Slide 115

Slide 115 text

fun fetchUserDetail(id: String, cont: Contiunation) { val sm = object : CoroutineImpl { ... } switch (sm.label) { case 0: sm.id = id sm.label = 1 auth(sm) … } } 4BWFTUBUFT

Slide 116

Slide 116 text

fun fetchUserDetail(id: String, cont: Contiunation) { val sm = object : CoroutineImpl { ... } switch (sm.label) { … case 1: val id = sm.id val token = sm.result as String sm.label = 2 getUser(token, id, sm) … } 3FTUPSFTUBUF

Slide 117

Slide 117 text

fun fetchUserDetail(id: String, cont: Contiunation) { val sm = object : CoroutineImpl { fun resume(...) { fetchUserDetail(null, this) } } switch (sm.label) { case 0: … } } 3FTVNF DBMMCBDL

Slide 118

Slide 118 text

fun fetchUserDetail(id: String, cont: Contiunation) { val sm = cont as? ThisSM ?: object : CoroutineImpl { fun resume(...) { fetchUserDetail(null, this) } } switch (sm.label) { case 0: … } } $POUJOVBUJPO SFVTF

Slide 119

Slide 119 text

https://goo.gl/2Tyx4B (eng.) https://goo.gl/H9iih9 (kor.)

Slide 120

Slide 120 text

UIBOL\ZPV^ BOZ2VFTUJPO BOTXFS