ํจ์ ํธ์ถ๊ณผ ์ ์
fun <T> joinToString(
collection: Collection<T>,
separator: String,
prefix: String,
postfix: String
): String {
val result = StringBuilder(prefix)
for ((index, element) in collection.withIndex()) {
if (index > 0) result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
ํจ์์ ๊ดํด ์๊ธฐํ๋ ์ด๋ฒ 3์ฅ์์ ๊ณ์ ์ฌ์ฉ๋ ์ ๋ค๋ฆญ ํจ์๋ค. ๊ตฌ๋ถ์๋ฅผ ๋ฐ์์ ์๋ค๋ก “(“, “)”๋ฅผ ๋ถ์ฌ์ ๋ฐํํ๋ ํจ์๋ค.
ํ๋ ํ๋ ์ดํด๋ณด์.
์ฝํ๋ฆฐ์์๋ ์ธ์์ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ค. ํจ์๋ฅผ ํธ์ถํ ๋ separator = "." ์ ๊ฐ์ ํ์์ผ๋ก ์ธ์๋ฅผ ๋ฃ์ด ์ ๋ฌํ ์ ์๋๋ฐ, ์ค๊ฐ์๋ง ๋ฃ์ ์๋ ์๊ณ , ๋ช ๋ช ํ ์ธ์ ์ดํ๋ก๋ ๋ชจ๋ ์ด๋ฆ์ ๋ถ์ฌ ํธ์ถํด์ผ๋๋ค๋ ๊ท์น์ด ์๋ค. ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ธ์๋ฅผ ํ์คํ ๊ตฌ๋ถํ ์ ์์ด ์ฌ๋ฌ๊ฐ์ ์ธ์๋ฅผ ๊ฐ๋ ํจ์์ ๋ํ ํผ๋์ ์ค์ผ ์ ์๋ค.
์ธ์์ ์ด๋ฆ์ ๋ถ์ด๋ ํ๋์ ๋ํดํธ ํ๋ผ๋ฏธํฐ์ ์ฐ๊ฒฐ๋๋๋ฐ, ํจ์ ์ ์ธ์ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์ง์ ํด๋๋ฉด ํด๋น ์ธ์์ ๊ฐ์ด ๋ค์ด์ค์ง ์์ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ง์ ํด๋ ๊ฐ์ผ๋ก ํ๋ผ๋ฏธํฐ ์ ๋ ฅ๊ฐ์ ๋์ ํ๋ค. ์ด๊ฒ์ ๋ํดํธ ํ๋ผ๋ฏธํฐ๋ผ๊ณ ํ๋ฉฐ, ๋ํดํธ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ํจ์๋ฅผ ์ด๋ฆ๋ถ์ฌ ์ฌ์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ ์์์ ๊ด๊ณ์์ด ์ธ์๋ฅผ ์ ๋ฌ ํ ์ ์๊ฒ ๋๋ค.
์ต์์ ํจ์์ ์ต์์ ํ๋กํผํฐ
์ฝํ๋ฆฐ์์๋ ํจ์๋ฅผ ๊ผญ ํด๋์ค์์ ๋ฉ์๋๋ก ์์ฑํ ํ์๊ฐ ์๋ค. ๊ทธ๋ฅ ํ์ผ์ ์์ฑํด์ ํจ์๋ฅผ ์ ์ผ๋ฉด ๋๊ณ , ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ํจ์๊ฐ ๋ค์ด์๋ ํ์ผ์ ํจํค์ง๋ง importํด์ฃผ๋ฉด ์ฌ์ฉํ ์ ์๋ค. ์ด๋ป๊ฒ ์ด๊ฒ ๊ฐ๋ฅํ ๊น? ๊ทธ ์ด์ ๋ ์ฝํ๋ฆฐ ์ปดํ์ผ๋ฌ๊ฐ ์ต์์ํจ์๊ฐ ๋ค์ด์๋ ํ์ผ์ ์ปดํ์ผ ํ ๋ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด์ JVM์ ๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
package ch03.JoinToString
fun <T> joinToString(
...
){ ... }
์ด๋ฐ์์ผ๋ก ์ ์ํ๊ณ , ์ฌ์ฉํ ์ ์๋ค. ์ฝํ๋ฆฐ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ์๋ก์ด ํด๋์ค์ ์ด๋ฆ์ ํจ์๊ฐ ๋ค์ด์๋ ํ์ผ๊ณผ ๋์ํ๊ณ , ์ต์์ ํจ์๋ ์ ์ ํจ์๋ก ์กด์ฌํ๊ฒ ๋๋ค. ์ด๋ฐ ๋ชจ์์ ํจ์๋ฟ๋ง ์๋๋ผ ํ๋กํผํฐ๋ ๊ฐ๋ฅํ๋ฐ, ํด๋์ค ๋ฒ์ ๋ฐ์์ const val๋ก ์์๋ฅผ ์ ์ธํ๋๊ฒ ๊ทธ ์์๋ค. const val์ ์๋ฐ์ public static final๋ก ์ปดํ์ผ๋๋ค. ๋จ const ๋ primitiveํ์ ๋ค๊ณผ, String ํ์ ๋ง ๊ฐ๋ฅํ๋ค.
ํ์ฅํจ์์ ํ์ฅ ํ๋กํผํฐ
ํ์ฅํจ์
ํ์ฅํจ์๋ ๊ธฐ์กด API๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํด๋์ค ๋ฐ์์ ํด๋น ํด๋์ค์ ๋ฉค๋ฒ ๋ฉ์๋์ธ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ํจ์๋ค. ์์๋ฅผ ๋ณด์.
fun String.lastChar(): Char = this.get(this.length - 1)
Stringํด๋์ค๋ฅผ ํ์ฅํด์ ๋ง๋ lastChar()ํจ์๋ค. Stringํด๋์ค ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์๊ฒ๋๋ค. ์ด๋ ํ์ฅํ ํด๋์ค ์ด๋ฆ(์ฌ๊ธฐ์๋ String)์ ์์ ๊ฐ์ฒด ํ์ (receiver type)์ด๋ผ๊ณ ํ๊ณ this.get()์์ ์ฌ์ฉ๋๋ this๊ฐ ํธ์ถ๋๋ ๋์ ๊ฐ์ผ๋ก ์์ ๊ฐ์ฒด(receiver object)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฆ ์์ ๊ฐ์ฒด๋ ํด๋์ค์ ์ธ์คํด์ค ๊ฐ์ฒด๋ผ๊ณ ๋ ํ ์ ์๋ค. ํ์ฅํจ์๋ ๋ด๋ถ์ ์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ์คํ์์ ์ ๋ถ๊ฐ๋น์ฉ์ด ๋ค์ง ์๋๋ค.
์ ์ฝ๋์์ ์ฌ์ฉ๋ this๋ ๊ฐ๋ ์ฑ์ ์ํด ์ฌ์ฉ๋ ๊ฒ์ด์ง ํจ์ ๋ณธ๋ฌธ์์ ์๋ต๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ ํด๋์ค ๋ฐ์์ ์ ์๋ ํ์ฅํจ์๋ ์บก์ํ๋ฅผ ๊นฐ๊น? ์ ๋ต์ “๊นจ์ง์๋๋ค”์ด๋ค. ํ์ฅํจ์๋ ํด๋์ค์ private, protected ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๊ธฐ๋๋ฌธ์ ์บก์ํ๋ฅผ ์งํค๊ณ ์๋ค๊ณ ํ ์ ์๋ค. ์ด๋ ๊ฒ ๋ง๋ ํ์ฅํจ์๋ importํด์ ์ฌ์ฉํ ์ ์๋ค.
import string.lastChar
import string.*
์๋ ์ ๋ชจ๋ ํ์ฅํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ import๊ตฌ๋ฌธ์ด๋ค. ํ์ฅํจ์์ ๋ค๋ฅธ ํจํค์ง์ ํจ์๊ฐ ์ด๋ฆ์ด ๊ฒน์น๋ฉด as๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ํ์ฅํจ์๋ฅผ ๋ณ๋ช ์ง์ด ์ฌ์ฉํ ์๋ ์๋ค.
๋ง๋ฅ ์ข์ ๊ฒ ๊ฐ์ ํ์ฅํจ์๋ ๋ชปํ๋๊ฒ ์๋๋ฐ, ์ค๋ฒ๋ผ์ด๋ฉ์ด๋ค. ์๋๋ก์ด๋์์ setOnClickListener์ object๋ก View์ onClick์ด ์ค๋ฒ๋ผ์ด๋ฉ๋๋๋ฐ, ์ด๋ฌ๋ฉด ์ค๋ฒ๋ผ์ด๋ฉ ํ ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ๊ทธ๋ฌ๋ ์ด๊ฑด ํด๋์ค ์์ ๋ค์ด์๋ ๊ฒ์ด๋ผ ๊ฐ๋ฅํ ๊ฒ์ด๊ณ , ํ์ฅํจ์๋ ํด๋์ค ๋ฐ์ ์์ด์ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์๋ค. ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ ๊ฒ์ด ๋ฐํด ํ์ฅํจ์๋ ์์ ๊ฐ์ฒด, ์์ ๊ฐ์ฒด ํ์ ์ ์ํด ์ ์ ์ผ๋ก ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
val view: View = Button()
view.showOff()
view๋ณ์๋ Viewํ์ ์ด๊ธฐ ๋๋ฌธ์ View์ ํ์ฅํจ์ showOff๋ฅผ ์คํํ์ง Button์ showOff๋ฅผ ์คํํ์ง ์๋๋ค. view: Button ์ด์๋ค๋ฉด Button์ showOff๋ฅผ ์คํํ์ ๊ฒ์ด๋ค.
ํ์ฅ ํ๋กํผํฐ
ํ์ฅ ํ๋กํผํฐ๋ ํจ์ํํ๊ฐ ์๋๋ผ ํ๋กํผํฐ ํํ๋ก ์ ์ํ๋ ํจ์๋ผ๊ณ ๋ณด๋ ๊ฒ ํธํ๋ค. ์ธ์คํด์ค์ ์ํ๋ฅผ ์ ์ฅํ ์์๊ณ ๋จ์ง ํ๋กํผํฐ ๋ฌธ๋ฒ๋ง ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ฅํจ์๋ฅผ ํ๋กํผํฐ ๋ฌธ๋ฒ์ผ๋ก ๋ฐ๊พธ๋ ค๋ฉด get()์ ์ด์ฉํด์ผํ๋ค. ๊ฐ์ ์ ์ฅํ ์ ์์ด backing field๊ฐ ์๊ธฐ ๋๋ฌธ์ get()์ผ๋ก ๊ฒํฐ๋ฅผ ์ ์ํด์ค์ผํ๋ฉฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ set()์ ์ด์ฉํด ๊ฐ๋จํ ์กฐ์๋ ๊ฐ๋ฅํ๊ธดํ๋ค. ์๋๊ฐ ๊ทธ ์์๋ค.
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value: Char) {
this.setCharAt(length - 1, value)
}
Collection
์ฝํ๋ฆฐ์ ์ปฌ๋ ์ ์ ์๋ฐ ์ปฌ๋ ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค. ๊ฑฐ๊ธฐ์ ํ์ฅํจ์๋ก ์ฝํ๋ฆฐ์์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ API๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
varargs
์ด๊ฑด ์ต์ํ ํํ์ด๋ค. ๊ฐ๋ณ๊ธธ์ด ์ธ์์ธ๋ฐ, ์ํ๋ ๋งํผ ๊ฐ์ ๋ฃ์ด ์ธ์๋ก ๋๊ธฐ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ด ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค. ๋ฐฐ์ด์ ๊ฐ๋ณ์ธ์๋ก ๋๊ธธ๋๋ ์ฝํ๋ฆฐ๊ณผ ์๋ฐ๊ฐ ๋ค๋ฅธ๋ฐ, ์ฝํ๋ฆฐ์์๋ ์ ๋ฌํ ๋ฐฐ์ด ์์ ์คํ๋ ๋ ์ฐ์ฐ์์ธ *๋ฅผ ๋ถ์ด๋ฉด ์์๋ค์ ํผ์ณ์ ์ธ์๋ก ๋ฃ์ด์ค๋ค.
val list = listOf("args: ", *args)
์ค์ํธ์ถ๊ณผ ๊ตฌ์กฐ ๋ถํด
mapOf(a to b)์์ a๋ key, b๋ value๋ก ๋งตํ๋์ด ์ ์ฅ๋๋ค. ์ด๋ ์ฌ์ฉ๋๋ to๋ ํค์๋๊ฐ ์๋๋ผ ์ผ๋ฐ ๋ฉ์๋(ํ์ฅํจ์๋ค)์ด๊ณ , ์ค์ํธ์ถ(infix)๋ก ์ฌ์ฉ๋ ๊ฒ์ด๋ค. ์์ ๊ฐ์ฒด to ์ ์ผํ ๋ฉ์๋ ์ธ์๋ก ๋๋๋ฐ toํจ์์ ๋ฐํ์ด Pair์์ ์๋ฉด ๊ตฌ์กฐ๋ถํด๊น์ง ์ดํดํ ์ ์๋ค. Pair๋ ์๋ฐ์๋ ์๋ ๊ฐ๋ ์ธ๋ฐ ์์์์ ๋ํ๋ธ๋ค.
val (num, name) = 1 to "one"
์ผ๋กํ๋ฉด num์ 1, name์ one์ด ๋ค์ด๊ฐ๋๋ฐ, ์ด๊ฑธ ๊ตฌ์กฐ๋ถํด์ ์ธ, destructuring declaration์ด๋ผ๊ณ ํ๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ตฌ์กฐ๋ถํด์ ์ธ์ ์ฌ์ฉํ๋ค. for๋ฌธ์์ ์ฌ์ฉํ .withIndex()๊ฐ ๊ทธ ์ ์ฒด๋ค.
to๊ฐ map์์ ์ฌ์ฉ๋ผ์ map์์๋ง ์ฌ์ฉํด์ผ๋๋ ์ค ์ ์๋ ์๋๋ฐ, ์์์์ด ํ์ํ๋ฉด to๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฌธ์์ด๊ณผ ์ ๊ท์
์ ๊ท์์ ๊ผญ ํ๋ฒ ์ตํ๊ณ ๋์ด๊ฐ์ผํ๋ ๋ถ๋ถ์ด๋ค. ์๋ฐ์ ๋ฌธ์์ด ๋ฉ์๋ ์ค split()์ ์ธ์๋ก “.”์ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด๊ฑด split์ ์ธ์๊ฐ ์ ๊ท์์ด๊ณ .์ด ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ํ๋ด๋ ์ ๊ท์์ผ๋ก ํด์๋๊ธฐ ๋๋ฌธ์ด๋ค.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
String test = "12.51.6262.6515.";
System.out.println(Arrays.toString(test.split(".")));
}
}
๋น ๋ฌธ์์ด์ ๋ฐํํ๋ ๊ฑธ ๋ณผ ์ ์๋ค. ์ฝํ๋ฆฐ์์๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ String์ผ๋ก ๋ฐ๊ณ .toRegex()๋ก ์ ๊ท์์์ ๋ช ์ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ฐ๋ฉด ์ ๊ท์์ ํํํ ๋ \ ์ญ์ฌ๋์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด \\๋ก ํํํ๋๊ฑธ “”” “"”๋ฅผ ์ด์ฉํด ์ด์ค์ผ์ดํ ํ ๋ ธ๋์ ์ค์ผ ์ ์๊ฒ๋๋ค. ์ถ๊ฐ๋ก ์ผ์ค ๋ฐ์ดํ์๋ ๋ฌธ์์ด ํ ํ๋ฆฟ์ ๋ฃ์ ์ ์๋ค.
์ ๊ท์ ๋ฌธ๋ฒ์ ํ์ํ ๋๋ง๋ค ์ฐพ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ก์ปฌ ํจ์
์ฝ๋ ์ค๋ณต์ ์ค์ด๋ ๋ฐฉ๋ฒ ์ค์ ํ๋์ธ๋ฐ, ํจ์์์ ์ถ์ถํ ํจ์๋ฅผ ์ํจ์ ๋ด๋ถ์ ์ค์ฒฉ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ทธ๋ฅ ํจ์ ์์ ๋ ํจ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ด๋ค.
fun User.validateBeforeSave() {
fun validate(value: String, fieldName: String) {
if (value.isEmpty()) {
throw IllegalArgumentException(
"Can't save user $id: empty $fieldName")
}
}
validate(name, "Name")
validate(address, "Address")
}
validate๊ฐ ๋ก์ปฌํจ์๋ค. ํจ์ ์ค์ฝํ๋ฅผ ๋ณด๋ฉด ์ ์ด๋ validateBeforeSaveํจ์, ์ฆ validateํจ์ ๋ฐ๊นฅ์ ์๋ ํ๋ผ๋ฏธํฐ, ๋ณ์์ ์ ๊ทผํ ์ ์๊ฒ๋๋ค. ํจ์ ์ค์ฒฉ์ 1 depth๊น์ง๋ง ํ๋๊ฒ ๊ถ์ฅ์ฌํญ์ด๋ค.
"๋๊ธ, ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์๋ฉด ํฐ ํ์ด ๋ฉ๋๋ค"
'๐๐๏ธ > ์ฝํ๋ฆฐ ์ธ ์ก์ ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Kotlin in action(5) (0) | 2023.10.10 |
---|---|
Kotlin in action(4) (0) | 2023.10.10 |
Kotlin in action(3) (0) | 2023.10.10 |
Kotlin in action(9) (0) | 2023.10.10 |
Kotlin in action(1) (0) | 2023.10.10 |