2. Not a test
To understand Kotlin language
For fun(remember easily)
3. Not a test
To understand Kotlin language
For fun(remember easily)
4. Not a test
To understand Kotlin language
For fun(remember easily)
5. Engineer with Lover
data class Engineer(
val name: String,
val lover: Lover?
)
data class Lover(
val name: String,
val phoneNumber: String?
)
fun main(args: Array<String>) {
val james =
Engineer(
name = "James",
lover = Lover(
name = "Soo",
phoneNumber = null
)
)
james.lover?.let { girlFriend ->
girlFriend.phoneNumber?.let {
print("${girlFriend.name} phone number is $it")
}
} ?: run {
print("There is no lover.")
}
}
6. Engineer with Lover
data class Engineer(
val name: String,
val lover: Lover?
)
data class Lover(
val name: String,
val phoneNumber: String?
)
fun main(args: Array<String>) {
val james =
Engineer(
name = "James",
lover = Lover(
name = "Soo",
phoneNumber = null
)
)
james.lover?.let { girlFriend ->
girlFriend.phoneNumber?.let {
print("${girlFriend.name} phone number is $it")
}
} ?: run {
print("There is no lover.")
}
}
/**
* 1. "There is no lover."
* 2. "Soo phone number is null"
* 3. nothing
* */
7. Engineer with Lover
data class Engineer(
val name: String,
val lover: Lover?
)
data class Lover(
val name: String,
val phoneNumber: String?
)
fun main(args: Array<String>) {
val james =
Engineer(
name = "James",
lover = Lover(
name = "Soo",
phoneNumber = null
)
)
james.lover?.let { girlFriend ->
girlFriend.phoneNumber?.let {
print("${girlFriend.name} phone number is $it")
}
} ?: run {
print("There is no lover.")
}
}
/**
* 1. "There is no lover."
* 2. "Soo phone number is null"
* 3. nothing
* */
8. Engineer with Lover
data class Engineer(
val name: String,
val lover: Lover?
)
data class Lover(
val name: String,
val phoneNumber: String?
)
fun main(args: Array<String>) {
val james =
Engineer(
name = "James",
lover = Lover(
name = "Soo",
phoneNumber = null
)
)
james.lover?.let { girlFriend ->
girlFriend.phoneNumber?.let {
print("${girlFriend.name} phone number is $it")
}
} ?: run {
print("There is no lover.")
}
}
/**
* 1. "There is no lover."
* 2. "Soo phone number is null"
* 3. nothing
* */
9. let s check return, expression
data class Engineer(
val name: String,
val lover: Lover?
)
data class Lover(
val name: String,
val phoneNumber: String?
)
fun main(args: Array<String>) {
val james =
Engineer(
name = "James",
lover = Lover(
name = "Soo",
phoneNumber = null
)
)
james.lover?.let { girlFriend ->
girlFriend.phoneNumber?.let {
print("${girlFriend.name} phone number is $it")
}
} ?: run {
print("There is no lover.")
}
}
/**
* 1. "There is no lover."
* 2. "Soo phone number is null"
* 3. nothing
* */
10. Book, full of text
class Book {
var preface: Preface? = null
}
class Preface {
val text: String? = null
}
fun main(args: Array<String>) {
val book = Book()
val hasText: Boolean = book.preface?.text != null ?: false
print("hasText:$hasText")
}
11. Book, full of text
class Book {
var preface: Preface? = null
}
class Preface {
val text: String? = null
}
fun main(args: Array<String>) {
val book = Book()
val hasText: Boolean = book.preface?.text != null ?: false
print("hasText:$hasText")
}
/**
* 1. true
* 2. false
* */
12. Book, full of text
class Book {
var preface: Preface? = null
}
class Preface {
val text: String? = null
}
fun main(args: Array<String>) {
val book = Book()
val hasText: Boolean = book.preface?.text != null ?: false
print("hasText:$hasText")
}
/**
* 1. true
* 2. false
* */
13. Book, full of text
class Book {
var preface: Preface? = null
}
class Preface {
val text: String? = null
}
fun main(args: Array<String>) {
val book = Book()
val hasText: Boolean = book.preface?.text != null ?: false
print("hasText:$hasText")
}
/**
* 1. true
* 2. false
* */
14. Memo
import org.junit.Test
import org.junit.Assert.*
class MemoTest {
data class Memo(
val content: String? = null,
val photo: Photo? = null
)
data class Photo(
val imageUrl: String? = null
)
@Test
fun checkDefaultConstructor() {
val memo = Memo()
val content = memo.content ?: "empty"
val photoUrl = memo.photo?.run { imageUrl }
assert(content == "empty")
assert(photoUrl != null)
}
}
15. Memo
import org.junit.Test
import org.junit.Assert.*
class MemoTest {
data class Memo(
val content: String? = null,
val photo: Photo? = null
)
data class Photo(
val imageUrl: String? = null
)
@Test
fun checkDefaultConstructor() {
val memo = Memo()
val content = memo.content ?: "empty"
val photoUrl = memo.photo?.run { imageUrl }
assert(content == "empty")
assert(photoUrl != null)
}
}
/**
* 1. Success
* 2. Fail
* */
16. Memo
import org.junit.Test
import org.junit.Assert.*
class MemoTest {
data class Memo(
val content: String? = null,
val photo: Photo? = null
)
data class Photo(
val imageUrl: String? = null
)
@Test
fun checkDefaultConstructor() {
val memo = Memo()
val content = memo.content ?: "empty"
val photoUrl = memo.photo?.run { imageUrl }
assert(content == "empty")
assert(photoUrl != null)
}
}
/**
* 1. Success
* 2. Fail
* */
17. Memo
import org.junit.Test
import org.junit.Assert.*
class MemoTest {
data class Memo(
val content: String? = null,
val photo: Photo? = null
)
data class Photo(
val imageUrl: String? = null
)
@Test
fun checkDefaultConstructor() {
val memo = Memo()
val content = memo.content ?: "empty"
val photoUrl = memo.photo?.run { imageUrl }
assert(content == "empty")
assert(photoUrl != null)
}
}
/**
* 1. Success
* 2. Fail
* */
18. Memo
import org.junit.Test
import org.junit.Assert.*
class MemoTest {
data class Memo(
val content: String? = null,
val photo: Photo? = null
)
data class Photo(
val imageUrl: String? = null
)
@Test
fun checkDefaultConstructor() {
val memo = Memo()
val content = memo.content ?: "empty"
val photoUrl = memo.photo?.run { imageUrl }
assert(content == "empty")
assert(photoUrl != null)
}
}
/**
* 1. Success
* 2. Fail
* */
/**
* Throws an [AssertionError] calculated by [lazyMessage] if the [value] is false
* and runtime assertions have been enabled on the JVM using the *-ea* JVM option.
*/
@kotlin.internal.InlineOnly
public inline fun assert(value: Boolean, lazyMessage: () -> Any) {
if (_Assertions.ENABLED) {
if (!value) {
val message = lazyMessage()
throw AssertionError(message)
}
}
}
19. Writing failing test rst.
import org.junit.Test
import org.junit.Assert.*
class MemoTest {
data class Memo(
val content: String? = null,
val photo: Photo? = null
)
data class Photo(
val imageUrl: String? = null
)
@Test
fun checkDefaultConstructor() {
val memo = Memo()
val content = memo.content ?: "empty"
val photoUrl = memo.photo?.run { imageUrl }
assert(content == "empty")
assert(photoUrl != null)
}
}
/**
* 1. Success
* 2. Fail
* */
20. Null everywhere
private var account: String? = null
private var password: String? = null
fun main(args: Array<String>) {
val textBuilder = StringBuilder()
if (account?.toString() != null) {
textBuilder.append("account is $account.")
appendPassword(textBuilder)
} else {
textBuilder.append("account is empty.")
appendPassword(textBuilder)
}
print(textBuilder.toString())
}
private fun appendPassword(textBuilder: StringBuilder) {
if (password.toString() != null) {
textBuilder.append("password is $password.")
} else {
textBuilder.append("password is empty.")
}
}
21. Null everywhere
private var account: String? = null
private var password: String? = null
fun main(args: Array<String>) {
val textBuilder = StringBuilder()
if (account?.toString() != null) {
textBuilder.append("account is $account.")
appendPassword(textBuilder)
} else {
textBuilder.append("account is empty.")
appendPassword(textBuilder)
}
print(textBuilder.toString())
}
private fun appendPassword(textBuilder: StringBuilder) {
if (password.toString() != null) {
textBuilder.append("password is $password.")
} else {
textBuilder.append("password is empty.")
}
}
/**
* The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.
*/
public open class Any {
/**
* Returns a string representation of the object.
*/
public open fun toString(): String
}
/**
* Returns a string representation of the object. Can be called with a null receiver, in which case
* it returns the string "null".
*/
public fun Any?.toString(): String
22. Check before use.
private var account: String? = null
private var password: String? = null
fun main(args: Array<String>) {
val textBuilder = StringBuilder()
if (account?.toString() != null) {
textBuilder.append("account is $account.")
appendPassword(textBuilder)
} else {
textBuilder.append("account is empty.")
appendPassword(textBuilder)
}
print(textBuilder.toString())
}
private fun appendPassword(textBuilder: StringBuilder) {
if (password.toString() != null) {
textBuilder.append("password is $password.")
} else {
textBuilder.append("password is empty.")
}
}
23. My Data class
sealed class BankAccount {
abstract val id: String
abstract val name: String
override fun equals(other: Any?): Boolean {
return (other as? BankAccount)?.id == id
}
override fun hashCode(): Int {
return id.hashCode()
}
}
data class CheckingAccount(
override val id: String,
override val name: String,
val number: String
) : BankAccount()
fun main(args: Array<String>) {
val a = CheckingAccount(id = "001", name = "hello", number = "number")
val b = a.copy(number = "abc")
print("a and b is equal:${a == b}")
}
24. My Data class
sealed class BankAccount {
abstract val id: String
abstract val name: String
override fun equals(other: Any?): Boolean {
return (other as? BankAccount)?.id == id
}
override fun hashCode(): Int {
return id.hashCode()
}
}
data class CheckingAccount(
override val id: String,
override val name: String,
val number: String
) : BankAccount()
fun main(args: Array<String>) {
val a = CheckingAccount(id = "001", name = "hello", number = "number")
val b = a.copy(number = "abc")
print("a and b is equal:${a == b}")
}
/**
* 1. “a and b is equal:true”
* 2. “a and b is equal:false”
* */
25. My Data class
sealed class BankAccount {
abstract val id: String
abstract val name: String
override fun equals(other: Any?): Boolean {
return (other as? BankAccount)?.id == id
}
override fun hashCode(): Int {
return id.hashCode()
}
}
data class CheckingAccount(
override val id: String,
override val name: String,
val number: String
) : BankAccount()
fun main(args: Array<String>) {
val a = CheckingAccount(id = "001", name = "hello", number = "number")
val b = a.copy(number = "abc")
print("a and b is equal:${a == b}")
}
/**
* 1. “a and b is equal:true”
* 2. “a and b is equal:false”
* */
26. My Data class
sealed class BankAccount {
abstract val id: String
abstract val name: String
override fun equals(other: Any?): Boolean {
return (other as? BankAccount)?.id == id
}
override fun hashCode(): Int {
return id.hashCode()
}
}
data class CheckingAccount(
override val id: String,
override val name: String,
val number: String
) : BankAccount() {
override fun equals(other: Any?): Boolean {
return super.equals(other)
}
override fun hashCode(): Int {
return super.hashCode()
}
}
fun main(args: Array<String>) {
val a = CheckingAccount(id = "001", name = "hello", number = "number")
val b = a.copy(number = "abc")
print("a and b is equal:${a == b}")
}
27. My Data class
sealed class BankAccount {
abstract val id: String
abstract val name: String
final override fun equals(other: Any?): Boolean {
return (other as? BankAccount)?.id == id
}
final override fun hashCode(): Int {
return id.hashCode()
}
}
data class CheckingAccount(
override val id: String,
override val name: String,
val number: String
) : BankAccount()
fun main(args: Array<String>) {
val a = CheckingAccount(id = "001", name = "hello", number = "number")
val b = a.copy(number = "abc")
print("a and b is equal:${a == b}")
}
28. Double check doc.
sealed class BankAccount {
abstract val id: String
abstract val name: String
final override fun equals(other: Any?): Boolean {
return (other as? BankAccount)?.id == id
}
final override fun hashCode(): Int {
return id.hashCode()
}
}
data class CheckingAccount(
override val id: String,
override val name: String,
val number: String
) : BankAccount()
fun main(args: Array<String>) {
val a = CheckingAccount(id = "001", name = "hello", number = "number")
val b = a.copy(number = "abc")
print("a and b is equal:${a == b}")
}
29. My name is
class User {
lateinit var name: String
}
fun User.newInstance(name: String) = User().apply { this.name = name }
fun main(args: Array<String>) {
val james = User.newInstance("james")
print("Hello, my name is ${james.name}")
}
30. My name is
class User {
lateinit var name: String
}
fun User.newInstance(name: String) = User().apply { this.name = name }
fun main(args: Array<String>) {
val james = User.newInstance("james")
print("Hello, my name is ${james.name}")
}
31. My name is
class User {
lateinit var name: String
}
fun User.Companion.newInstance(name: String) = User().apply { … }
fun main(args: Array<String>) {
val james = User.newInstance("james")
print("Hello, my name is ${james.name}")
}
32. My name is
class User {
lateinit var name: String
companion object
}
fun User.Companion.newInstance(name: String) = User().apply { ... }
fun main(args: Array<String>) {
val james = User.newInstance("james")
print("Hello, my name is ${james.name}")
}
33. Gotta get that!
class Company {
val members =
mutableListOf(
"Mireuk",
"Sunghyun",
"ChaeYoon",
"BeomJoon"
)
val sizeValue: Int = getMemberCount()
val sizeGet: Int
get() = getMemberCount()
val sizeLazy by lazy { getMemberCount() }
private fun getMemberCount(): Int = members.size
}
fun main(args: Array<String>) {
Company().run {
println("1:$sizeValue, 2:$sizeGet, 3:$sizeLazy")
members.add("YOU")
println("4:$sizeValue, 5:$sizeGet, 6:$sizeLazy")
}
}
34. Gotta get that!
class Company {
val members =
mutableListOf(
"Mireuk",
"Sunghyun",
"ChaeYoon",
"BeomJoon"
)
val sizeValue: Int = getMemberCount()
val sizeGet: Int
get() = getMemberCount()
val sizeLazy by lazy { getMemberCount() }
private fun getMemberCount(): Int = members.size
}
fun main(args: Array<String>) {
Company().run {
println("1:$sizeValue, 2:$sizeGet, 3:$sizeLazy")
members.add("YOU")
println("4:$sizeValue, 5:$sizeGet, 6:$sizeLazy")
}
}
/**
* 1: 4, 2: 4, 3: 4
* 4: 4, 5: 5, 6: 4
* */
35. value is nal.
class Company {
val members =
mutableListOf(
"Mireuk",
"Sunghyun",
"ChaeYoon",
"BeomJoon"
)
val sizeValue: Int = getMemberCount()
val sizeGet: Int
get() = getMemberCount()
val sizeLazy by lazy { getMemberCount() }
private fun getMemberCount(): Int = members.size
}
fun main(args: Array<String>) {
Company().run {
println("1:$sizeValue, 2:$sizeGet, 3:$sizeLazy")
members.add("YOU")
println("4:$sizeValue, 5:$sizeGet, 6:$sizeLazy")
}
}
/**
* 1: 4, 2: 4, 3: 4
* 4: 4, 5: 5, 6: 4
* */