
์ฝํ๋ฆฐ์ ์ฒ ํ
: ์ฝํ๋ฆฐ์ ์๋ฐ์์ ์ํธ์ด์ฉ์ฑ์ ์ด์ ์ ๋ง์ถ ์ค์ฉ์ ์ด๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์์ ํ ์ธ์ด์ด๋ค. - Kotlin in Action
์ฝํ๋ฆฐ์ ์ฒ ํ : ๊ฐ๊ฒฐ์ฑ
๊ฐ๋ฐ์๋ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์๊ฐ๋ณด๋ค, ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ฝ๋๋ฐ ์๊ฐ์ ๋ ๋ง์ด ์ด๋ค.
- ์ฝ๋๋ ๊ฐ๊ฒฐํ ์๋ก ๋ด์ฉ์ ํ์ ํ๊ธฐ ์ฝ๊ณ , ์ ์ง๋ณด์์๋ ์ข๋ค.
- ๊ทธ ์ค ํต์ฌ์ ์ธ์ด์ ๊ฐ๊ฒฐ์ฑ(์๋ ํ์ , ์ฌ์ด ๊ตฌ๋ฌธ ๊ตฌ์กฐ, ๋ถ๊ฐ์ ์ธ ์ฝ๋ ์ต๋ํ ์ ๊ฑฐ)
์ฝํ๋ฆฐ์ ํ๋ก๊ทธ๋จ์์ฑ์ ์์ด ๋ถ์์ ์ธ ์์๋ค์ ์ต๋ํ ์ค์ด๊ณ ์ ๋ ธ๋ ฅํ๋ค.
์์ 1)
data class Person(
val id: UUID,
val firstname: String,
val lastname: String,
val address: Address
)
๋ค์๊ณผ ๊ฐ์ด, data class๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด getter, setter, equals, toString ๋ฉ์๋๋ฅผ ์ปดํ์ผ ์์ ์ ์๋์ผ๋ก ์์ฑํด์ค๋ค. (์๋ฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(lombok)์ ๋์์ ๋ฐ์์ ์์ฑ)
์์ 2)
Syntax sugar๊ฐ ์๋ฐ์ ๋นํด ๋ง์ด ๋ค์ด๊ฐ ์๋ค.
(Syntax sugar: ์ฝ๋ ์ฌ๋ ๋๋ ์์ฑํ๋ ์ฌ๋์ด ํธํ๊ฒ ๋์์ธ ๋ ๋ฌธ๋ฒ)
fun double(x: Int): Int = x * 2
์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ฉด, ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ์ฌ๋ ค์ค ์ ์๊ณ ๊ฐ๋ฐ ์งํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค.
2. ์ฝํ๋ฆฐ์ ์ฒ ํ : ์์ ์ฑ
์ํํธ์จ์ด ๋ด์์์ ๋ฐ์ํ ๋ฌธ์ ์ ์ ์ฌ์ ์ ๋ง๊ธฐ ์ํด ๋ฐฉ์ด์ฝ๋๋ฅผ ๋ง์ด ๋ฃ๋๋ค. โ ์์ ์ฑ ํ๋ณด
๋ ํฐ ์์ ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด์๋ ํ๋ก๊ทธ๋จ์ ๋ ๋ง์ ์ฝ๋๋ฅผ ๋ง๋ถ์ฌ์ผ ํ๋ค.(์์ฐ์ฑ ํ๋ฝ์ ๊ฐ์ํด์ผ ํจ)
โ ์์ ์ฑ, ์์ฐ์ฑ ์ฌ์ด์์์ TradeOff
์ฝํ๋ฆฐ์ ์ด tradeoff์ ๋น์ฉ์ ๋ง์ด ์ค์ผ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
1) Null์ด ๋ ์ ์๋ ๊ฐ์ ์ถ์
val nullable: String?= null
kolin์์์ type system์ null์ด ๋ ์ ์๋ ๊ฐ์ ์ถ์ ํ๋ค.
์คํ ์์ ์ NullPointException์ด ๋ฐ์ํ ์ ์๋ ๊ฐ์ ๊ธ์งํ ์ ์๋ค.
2) ํ์ ๊ฒ์ฌ์ ์บ์คํธ๊ฐ ํ ์ฐ์ฐ์์ ์ํด ์ด๋ฃจ์ด์ง๋ฉฐ, ClassCastException ๋ฐ์์ ๋ฐฉ์ง
val value = loadValue()
if(value is String){
value.uppercase(Locale.getDefault())
}
3) break๋ฌธ์ด ์์ด๋ ๋๋ฉฐ, ์ด๊ฑฐํ ๊ฐ์ ํน๋ณํ ํ์ ๊ณผ ํจ๊ป ์ฐ๋ฉด ๋ชจ๋ ๊ฐ์ด ํ๊ฐ๋์๋์ง ํ์ธํ๋ค.
val message = when (state) {
State.IDLE -> "idle"
State.RUNNING -> "running"
State.FINISHED -> "finished"
}
์ด ๋ชจ๋ ๊ณผ์ ์ด ์ปดํ์ผ ๋จ๊ณ์์ ์ ๊ณต๋๊ธฐ ๋๋ฌธ์, ์์ฐ์ฑ์ ์ ํ๋ฅผ ๋ฎ์ถ๋ฉด์ ์์ ์ฑ์ ํ๋ณดํ ์ ์๋ค.
Kotlin code ์์
1. Null์ ์์ ํ๊ฒ ๋ค๋ฃจ๊ธฐ
kotlin type system์ null์ด ๋ ์ ์๋ ๊ฐ์ ์ถ์ ํ๋ค.
์คํ ์์ ์ NullpointException์ด ๋ฐ์ํ ์ ์๋ ์ฝ๋์ ์ฌ์ฉ์ ๊ธ์งํ๋ค.
Postํ์ ์ ๋ค์ ?๊ฐ ๋ถ์ด์๋๋ฐ ์ด ArrayList์ ๋ด๊ฒจ์๋ ๊ฐ์ด Null์ด ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ NULL์ด ์๋๋ผ๋ ๊ฒ์ ์ฌ์ ์ ํ์ธํด์ฃผ์ง ์์ผ๋ฉด ์ปดํ์ผ ์์ฒด๊ฐ ๋์ง ์๋๋ค.
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋, ์๋ฐ์์์ฒ๋ผ if๋ฌธ์ ์ฌ์ฉํด์ Null์ ํ์ธํด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
fun from(posts: Array<Post?>): Array<PostDto> {
return posts.map({ post ->
if(post == null)
throw Error("")
}
if(post.id == null) {
throw Error("")
}
PostDto(
post,
post.text,
post.author_id
)
}).toTypedArray()
}
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ Kotlin์์ ์ ๊ณตํ๋ ํธ์ถ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค. ?.
์ ์ด์ฉํด post ๊ฐ์ฒด๊ฐ null์ผ ์ ์์์ ์๋ฏธํ๊ณ , null์ด ์๋ ๊ฒฝ์ฐ์๋ id๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ณ , null์ผ ๊ฒฝ์ฐ์๋ Null ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
fun from(posts: Array<Post?>): Array<PostDto> {
return posts.map({ post ->
if(post?.id == null) {
throw Error("")
}
PostDto(
post.id,
post.text,
post.author_id
)
}).toTypedArray()
}
์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋, ์๋น์ค ์ฐ์ฐ์๋ฅผ ์ด์ฉํด null ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. post ๊ฐ์ด null์ด ์๋๋ผ๋ฉด id ๊ฐ์ ๊ฐ์ ธ์ค๊ณ , id ๊ฐ์ด null์ด๋ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์ํ๋ค๋ ์๋ฏธ๋ก ํด์์ด ๊ฐ๋ฅํ๋ค.
fun from(posts: Array<Post?>): Array<PostDto> {
return posts.map({ post ->
PostDto(
post?.id?: throw Error(""),
post.text,
post.author_id
)
}).toTypedArray()
}
null์ด ๋ค์ด๊ฐ์ง ์์๊ฒ์ด๋ผ ๋จ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ !!
๋ฅผ ์ฌ์ฉํ๋ค.
fun from(posts: Array<Post?>): Array<PostDto> {
return posts.map({ post ->
PostDto(
post?.id!!,
post.text,
post.author_id
)
}).toTypedArray()
}
์ด id๊ฐ์ null์ผ ์ ์์์ ๋จ์ ํ๋ค. ๋ง์ฝ์ null์ด ๊ฒฝ์ฐ runtimeException์ด ๋ฐ์ํ๋ค.
2. ๋ฌธ(statement)๊ณผ ์(expression)
fun mapItem(items : NewsItem<*>) = NewsItemDto {
if(item is NewsItem.NewTopic) {
return NewsItemDto(item.content.title, item.content.author.username)
} else if(item is NewsItem.NewPost) {
return NewsItemDto(item.content.text, item.content.author)
} else {
throw IllegalArgumentException("")
}
์์ ์ฝ๋๋ ๋ถ๊ธฐ๋ฌธ์ ์ด์ฉํด ์ ๋ฌ๋ฐ์ id ํ์ ์ด ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ค.
์๋ฐ์์๋ ๋ชจ๋ ์ ์ด๊ตฌ์กฐ๊ฐ ๋ฌธ์ด์ง๋ง, ์ฝํ๋ฆฐ์์๋ loop๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ ์ด๊ตฌ์กฐ๊ฐ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
(์์ ๊ฐ์ ๋ง๋ค์ด๋ด๊ณ , ๋ฌธ์ ๊ฐ์ ๋ง๋ค์ด๋ผ ์ ์๋ค.)
๋ฐ๋ผ์ kotlin์์์ if ๋ฌธ์ ์์ด๊ธฐ ๋๋ฌธ์, ํ๊ฐ๋ ๊ฐ์ ์ฆ์ ๋ฐํํ ์ ์๋ค.
์ฆ, return๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ํจ์์ ๋ฐํ๊ฐ์ผ๋ก if๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
์์)
fun mapItem(items : NewsItem<*>) = if(item is NewsItem.NewTopic) {
NewsItemDto(item.content.title, item.content.author.username)
} else if(item is NewsItem.NewPost) {
NewsItemDto(item.content.text, item.content.author)
} else {
throw IllegalArgumentException("")
}
3. ๋ด์ธํด์ ๊น๋จน์ง ๋ง๊ธฐ
์ฝํ๋ฆฐ์์๋ ์๋ฐ์ Switch๋ฌธ๊ณผ ๋น์ทํ when๋ฌธ์ ์ ๊ณตํ๋ค. ๊ฒฐ๊ณผ๊ฐ์ ๊ทธ ์ฆ์ ๋ฐํํ ์ ์๊ณ , ํจํด๋งค์นญ์ ์ด์ฉํด ํ๋ถํ ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๋ค.
๋๊ธด ์์ดํ ๊ฐ์ฒด์ ํ์ ์ ํ์ ํด, ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ์ ์๋ค
kotlin์ ํตํด ํจ์ฌ ๋ if๋ฌธ ๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
abstract class NewsItem<out C> {
val type : String
get() = javaClass.simpleName
abstract val content: C
data class NewTopic(...) : NewsItem<TopicDetails>()
data class NewPost(...) : NewsItem<Post>()
}
fun mapItem(items : NewsItem<*>) = when(item) {
is NewsItem.NewTopic -> NewsItemDto(item.c...t.title, item.c...r.username)
is NewsItem.NewPost -> NewsItemDto(item.c...t.text, item.c...t.author)
else -> throw IllegalArgumentException("")
}
item๊ฐ์ฒด์ ํ์ ์ด ๋ฌด์์ด๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํด์ฃผ๊ณ ์๋ค. newsitem์ ๊ฒฝ์ฐ์๋ ์ถ์ํด๋์ค๋ก ์ ์๊ฐ ๋์ด์๊ณ , ํ์์ topic๊ณผ post๋ฅผ ๋ณด๊ดํ๋ ๊ตฌ์กฐ์ด๋ค.
์ด ์ํ์์ else branch๋ฅผ ์ง์ฐ๊ฒ ๋๋ค๋ฉด, ์ถ๊ฐํ๋ผ๋ ์๋ฌ๊ฐ ๋ฌ๋ค. ์ปดํ์ผ๋ฌ๊ฐ ํ์ ํด๋์ค์ ์ข ๋ฅ๋ฅผ ์์ง ๋ชปํด์ ๊ทธ๋ฐ๋ค.
sealed class NewsItem<out C> {
val type : String
get() = javaClass.simpleName
abstract val content: C
data class NewTopic(...) : NewsItem<TopicDetails>()
data class NewPost(...) : NewsItem<Post>()
}
fun mapItem(items : NewsItem<*>) = when(item) {
is NewsItem.NewTopic -> NewsItemDto(item.c...t.title, item.c...r.username)
is NewsItem.NewPost -> NewsItemDto(item.c...t.text, item.c...t.author)
}
sealed class๋ ์ ํ๋ ํด๋์ค์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๋ง๋ค๋ ์ฌ์ฉํ๋ค. ์ฆ, ํด๋์ค ์ธ๋ถ์ ์์ ์ ์์ํ ํด๋์ค๋ฅผ ๋ ์ ์๊ณ , ์์ํ๋ ค๋ฉด ๋ฐ๋์ Sealed class ๋ด๋ถ์ ์ค์ฒฉํด์ ์์ํด์ผ ํ๋ค.
๋ฐ๋ผ์, when์์์ sealed class์ ๋ชจ๋ ํ์ ํด๋์ค๋ฅผ ์ฒ๋ฆฌํ๋ค๋ฉด else ๋ถ๊ธฐ๊ฐ ํ์๊ฐ ์๋ค. ์ปดํ์ผ๋ฌ์์ sealed class์ ์์ํด๋์ค๊ฐ 2๊ฐ๋ง ์๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
class Post(
val id: Long? = null,
val text: String,
val author: AggregateReference<User, Long>,
val topic: AggregateReference<Topic, Long>,
val createdAt: Date = Date(),
val updatedAt: Date = Date()
) {
constructor(
text: String, author: AggregateReference<Uer, Long>,
topic: AggregateReference<Topic, Long>, createdAt: Date
): this(null, text, author, topic, createdAt, createdAt)
constructor(
text: String, author: AggregateReference<Uer, Long>,
topic: AggregateReference<Topic, Long>
): this(text, author, topic, Date())
}
์ด post์๋ 3๊ฐ์ ์์ฑ์๊ฐ ์์ฑ๋์ด์๋ค. ์ด๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์ด๋ณด์.
Post(null, "", Ref.to(authorId), Ref.to(topicId), Date(), Date())
Post("", Ref.to(authorId), Ref.to(topicId), Date())
Post("", Ref.to(authorId), Ref.to(topicId))
์์ฑ์๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
authorId, topicId๋ ๊ฐ์ Long type์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ด ๋ค์ด๊ฐ๋ค. ์ค์ํ ์ฌ์ง๊ฐ ๋ฐ์ํ๋ค.
์ฝํ๋ฆฐ์์๋ Named parameter๋ผ๊ณ ํด์ ์์ฑ์์ ๋ค์ด๊ฐ๋ ๊ฐ์ ๋ช ์ํ ์ ์๋ค. ์ด๋ฆ์ ๋ช ์ํ๋ค๋ฉด, ์ถํ์ ์์ฑ์๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์ํ๋ ์์ฑ์ ๋ช ํํ๊ฒ ๋ฐ์ธ๋ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
๊ธฐ๋ณธ์ธ์๋ ์๋ค. ์ธ์์ ๊ธฐ๋ณธ๊ฐ์ ๋ถ์ฌํด ๊ตณ์ด ์์ฑ์๋ฅผ overloadingํ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์๋ค.
class Post(
val id: Long?= null,
val text: String,
val author: AggregateReference<User, Long>,
val topic: AggregateReference<Topic, Long>,
val createdAt: Date = Date(),
val updatedAt: Date = Date()
)
Post(
text="..",
author=AggregateReference.to(authorId),
topic = AggregateReference.to(topicId)
)
named parameter์ ๊ธฐ๋ณธ์ธ์๋ฅผ ์ฌ์ฉํด ์์ฑ์๋ฅผ overloadingํ์ง ์๊ณ ๋ ํจ์ถ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ ๋ฌ๋์ง ์์ ๋๋จธ์ง ์ธ์ (id, createdAt, updatedAt)์ ๊ธฐ๋ณธ๊ฐ์ ์ด์ฉํด ์ฌ์ฉํ ์ ์๋ค.
์ฆ, ๋น๋ ํจํด์ ์ธ์ด๋ ๋ฒจ์์ ์ฌ์ฉํ ์ ์๋ค.
4. ํจ์ํ์
์ฝํ๋ฆฐ์์๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๊ธฐ ์ํด ์ธํฐํ์ด์ค ์์ fun์ด๋ผ๋ ํค์๋๋ฅผ ๋ถ์ฌ์ผ ํ๋ค. AuthorMapper๋ ๋๋ค๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๋ค.
ํจ์ํ ์ธํฐํ์ด์ค๋?
1๊ฐ์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์๋ ์ธํฐํ์ด์ค
ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋ฐ, ์ฝํ๋ฆฐ์ ๋๋ค์์ ํจ์ํ ์ธํฐํ์ด์ค๋ก๋ง ์ ๊ทผ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
class ForumQueryService(
val executor: ThreadPoolTaskExecutor,
val userQueryRepository: UserQueryRepository,
val topicQueryRepository: TopicQueryRepository,
val postQueryRepository: PostQueryRepository
) : ForumNewsPublisher, ForumReader {
override fun loadPosts(topicId: UUID): Posts {
val topic = topicQueryRepository.findById(topicId)
val posts = postQueryRepository.findByTopic(topic)
return Posts(
TopicDetails.of(
topic,
{ ref ->
userQueryRepository.findById(ref.id!!)
}
),
posts
)
}
fun interface AuthorMapper {
fun map(ref: AggregateReference<User, Long>): User
}
์ฝํ๋ฆฐ์์๋ ์กฐ๊ธ ๋ ํจ์ํ์ ๊ด๋ จ๋ feature๋ค์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
์ฝํ๋ฆฐ์ ํจ์๊ฐ 1๊ธ์๋ฏผ์ด๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ๋ณ์๋ก ์ ์ฅํ ์๋ ์๊ณ , ์๋ก์ด ํจ์๋ฅผ ๋ด๋ถ์ ์ ์ธํ ์๋ ์๋ค.
- 1๊ธ ์๋ฏผ์ ์กฐ๊ฑด
- ๋ณ์์ ๋ด์ ์ ์๋ค.
- ํจ์(ํน์ ๋ฉ์๋)์ ์ธ์(๋งค๊ฐ๋ณ์, Parameter)๋ก ์ ๋ฌํ ์ ์๋ค.
- ํจ์(ํน์ ๋ฉ์๋)์ ๋ฐํ๊ฐ(return)์ผ๋ก ์ ๋ฌํ ์ ์๋ค.
class ForumQueryService(
val executor: ThreadPoolTaskExecutor,
val userQueryRepository: UserQueryRepository,
val topicQueryRepository: TopicQueryRepository,
val postQueryRepository: PostQueryRepository
) : ForumNewsPublisher, ForumReader {
companion object {
fun of(
topic: Topic,
authorMapper: (ref:AggregateRefefence<User, Long>) -> User
):TopicDetails{
return TopicDetails(
id=topic.id,
titkle = topic.title,
author = authorMapper.map(topic.author),
createdAt = topic.createdAt,
updatedAt = topic.updatedAt
)
}
}
}
Id๋ฅผ ๋ฐ์์ User๋ก ๋ฐํํ๋ ํจ์๋ฅผ ์ ์ธํ๋ฉด, ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ค
์ด๋ค ํจ์๊ฐ ๋ค๋ฅธ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ์์๋ ์ด๋ฅผ ํจ์ํ์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํจ์ํ ์ธํฐํ์ด์ค ์์ด๋ ์๋ก์ด ํจ์ํ์ ์ ์ ์ธํด์ ์ฌ์ฉํ ์ ์๋ค. ์ด ํจ์๋ ๋๋ค๋ฅผ ์ด์ฉํด ์์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
5. ์ฝ๋ฉ ์ปจ๋ฒค์
์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ฝํ๋ฆฐ ๊ณต์ ์ฌ์ดํธ์์ ์ ์์ ํ๊ณ ์๋ค.
์ด ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ฆฐํธ์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก์ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์ฝ๋ฉ ์ปจ๋ฒค์ ์ ํตํด ์ ์ง ๋ณด์ ๊ด์ ์์ ํฐ ์ด๋์ ์ทจํ ์ ์๋ค.
์ฐธ๊ณ
์ ํํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ ์ ์ต์ ์ ๋คํ์ง๋ง, ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค!
ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ ๋ฐ์ํ๊ฒ ์ต๋๋ค๐
'๐ค study > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- ์ฝํ๋ฆฐ์ ์ฒ ํ
- ์ฝํ๋ฆฐ์ ์ฒ ํ : ๊ฐ๊ฒฐ์ฑ
- 2. ์ฝํ๋ฆฐ์ ์ฒ ํ : ์์ ์ฑ
- 1) Null์ด ๋ ์ ์๋ ๊ฐ์ ์ถ์
- 2) ํ์ ๊ฒ์ฌ์ ์บ์คํธ๊ฐ ํ ์ฐ์ฐ์์ ์ํด ์ด๋ฃจ์ด์ง๋ฉฐ, ClassCastException ๋ฐ์์ ๋ฐฉ์ง
- 3) break๋ฌธ์ด ์์ด๋ ๋๋ฉฐ, ์ด๊ฑฐํ ๊ฐ์ ํน๋ณํ ํ์ ๊ณผ ํจ๊ป ์ฐ๋ฉด ๋ชจ๋ ๊ฐ์ด ํ๊ฐ๋์๋์ง ํ์ธํ๋ค.
- Kotlin code ์์
- 1. Null์ ์์ ํ๊ฒ ๋ค๋ฃจ๊ธฐ
- 2. ๋ฌธ(statement)๊ณผ ์(expression)
- 3. ๋ด์ธํด์ ๊น๋จน์ง ๋ง๊ธฐ
- 4. ํจ์ํ์
- 5. ์ฝ๋ฉ ์ปจ๋ฒค์
- ์ฐธ๊ณ