์ปฌ๋ ์
- ๊ธฐ๋ณธ ์ปฌ๋ ์ ํ์ ๐ List, Set, Map
fun main(){
// immutable
val currencyList = listOf("๋ฌ๋ฌ", "์ ๋ก", "์") // add ๋ถ๊ฐ
val numberSet = setOf(1, 2, 3, 4)
val numberMap = mapOf("one" to 1, "two" to 2) // to ์ค์ํจ์๋ก key-value ๊ตฌ์กฐ ์ ๋ฌ
// mutable
// 1) List
val mutableCurrencyList = mutableListOf<String>()
mutableCurrencyList.add("๋ฌ๋ฌ")
mutableCurrencyList.add("์ ๋ก")
mutableCurrencyList.add("์")
// 2) Set
val mutableSet = mutableSetOf<Int>()
// 3) Map
val mutableNumberMap = mutableMapOf<String, Int>()
mutableNumberMap["one"] = 1
mutableNumberMap["two"] = 2
mutableNumberMap["three"] = 3
}
- apply ํจ์ ์ฌ์ฉ ์ ๊ฐ๋ ์ฑ ์ข์์ง
val mutableCurrencyList = mutableListOf<String>().apply {
add("๋ฌ๋ฌ")
add("์ ๋ก")
add("์")
}
- ์ปฌ๋ ์ ๋น๋๋ฅผ ์ฌ์ฉํด ์ปฌ๋ ์ ์์ฑ ๊ฐ๋ฅ ๐ buildList, buildSet, buildMap
val numberList: List<Int> = buildList {
// buildMap ๋ด๋ถ์ MutableMap
add(1)
add(2)
add(3)
}
๐ท ์ปฌ๋ ์ ๋ฐ๋ณต
- ์ปฌ๋ ์ ์ Iterable ๊ตฌํ์ฒด์ด๋ฏ๋ก ์์ฐจ์ ๋ฐ๋ณต ๊ฐ๋ฅ
val iterator = currencyList.iterator()
while (iterator.hasNext()) {
println(iterator.next())
}
for (currency in currencyList) {
println(currency)
}
- forEach, map, filter์ ๊ฐ์ ์ธ๋ผ์ธ ํจ์ ์ ๊ณต
currency.forEach {
println(it)
}
- for loop๋ฅผ map์ผ๋ก ๋ณํํ๊ธฐ ์
val lowerList = listOf("a", "b", "c", "d")
val upperList = mutableListOf<String>()
for(lowerCase in lowerList){
upperList.add(lowercase.uppercase())
}
println(upperList)
// // [A, B, C, D]
- map์ผ๋ก ๋ณํ ํ
val upperList = lowerList.map { it.uppercase() }
println(upperList)
// [A, B, C, D]
- filter ๋ณํ ์
val filteredList = mutableListOf<String>()
for (upperCase in upperList) {
if (upperCase == "A" || upperCase == "C") {
filteredList.add(upperCase)
}
}
println(filteredList)
// [A, C]
- filter ๋ณํ ํ
val filteredList = upperList.filter { it == "A" || it == "C" }
println(filteredList)
// [A, C]
๐ฅ ์๋ฐ 8์ ์คํธ๋ฆผ๊ณผ ๋น๊ต
val filteredList = upperList.stream().filter { it == "A" || it == "C" } println(filteredList) // java.util.stream.ReferencePipeline$2@77b52d12โ
๐ ์ค๊ฐ ์ฐ์ฐ์(map, filter, flatMap ๋ฑ)๋ง ์ฌ์ฉ์ ์๋ฌด๋ฐ ๋์ํ์ง ์์ผ๋ฉฐ ๊ฐ์ ์ป๊ณ ์ถ์ผ๋ฉด ์ต์ข ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํจ
val filteredList = upperList.stream() .filter { it == "A" || it == "C" } .collect(Collectors.toList()) println(filteredList) // [A, C]โ
๐น ์ฝํ๋ฆฐ์์๋ sequence๋ฅผ ์ฌ์ฉํด ์๋ฐ 8 ์คํธ๋ฆผ๊ณผ ๊ฐ์ด Lazyํ๊ฒ ๋์์ํฌ ์ ์์ผ๋ฉฐ ์ํ์ค API๋ ์ต์ข ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ์ค๊ฐ ์ฐ์ฐ์๊ฐ ๋์val filteredList = upperList .asSequence() .filter { it == "A" || it == "C" } .filter {it == "C" } .filter {it == "C" } .filter {it == "C" } .filter {it == "C" } .toList() println(filteredList) // [A, C]
๐ ์ํ์ค API๋ ๊ฐ๊ฐ์ ํจ์๊ฐ ๋์ํ ๋ ์ํ์ค๋ฅผ ์์ฑํ๊ณ ์ต์ข ์ฐ์ฐ์๋ฅผ ํธ์ถํ ๋ 1๊ฐ์ ์ปฌ๋ ์ ์์ฑ
๐ ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ผ์ธ ํจ์๊ฐ ๋น ๋ฅด๋ฏ๋ก ์ธ๋ผ์ธ ํจ์๋ฅผ ์ฌ์ฉํ๋, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ฑฐ๋ ์ฒด์ธ์ด ๋ง์์ง ๋๋ ์ํ์ค API ์ฌ์ฉ ์ถ์ฒ
๋ฐ์ดํฐ ํด๋์ค
๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ฑฐ๋ ์ ๋ฌํ๋ ๋ชฉ์ ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ ๐ DTO
data class Person(val name: String, val age: Int)
- ๋ฐ์ดํฐ ํด๋์ค ์ฌ์ฉ ์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ํจ์
- equals()
- hashCode()
- toString()
- componentN(), copy()
- ๊ธฐ์กด ์๋ฐ์์๋ ์ฃผ๋ก Lombok ์ฌ์ฉ ๐ @Data
- JDK 15์์๋ record
@Data
public class Person {
private final String name;
private final int age;
}
public record Person(String name, int age) {
}
โจ Kotlin decomplie to Java
์ธํ ๋ฆฌ์ ์ด์์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ฝํ๋ฆฐ ํ์ผ์ ์๋ฐ๋ก decompile ํด์ฃผ๋ ๊ฒ์ด๋ค.
Tools > Kotlin > Show Kotlin Bytecode > decompile ์ ๋๋ฅด๋ฉด
์ด๋ ๊ฒ ํ์ผ์ด ์์ฑ๋์ด ์๋ฐ ์ฝ๋๋ก๋ ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ํ์ธํ ์ ์๋ค.
๐ท ๋ฐ์ดํฐํด๋์ค๊ฐ ํ์ํ ์ด์
- ๊ฐ์ฒด ๋๋ฑ์ฑ ๋น๊ต (equals)
// ์ผ๋ฐ ํด๋์ค
class Person(val name: String, val age: Int)
fun main() {
val person1 = Person(name = "tony", age = 12)
val person2 = Person(name = "tony", age = 12)
println(person1 == person2)
}
// false
// ๋ฐ์ดํฐ ํด๋์ค
data class Person(val name: String, val age: Int)
fun main() {
val person1 = Person(name = "tony", age = 12)
val tony2 = Person(name = "tony", age = 12)
println(person1 == person2)
}
// true
- hashCode
- equals ์ฌ์ ์ํ ๋ ๋ฐ๋์ hashCode๋ ์ฌ์ ์
data class Person(val name: String, val age: Int)
fun main() {
val person1 = Person(name = "tony", age = 12)
val person2 = Person(name = "tony", age = 12)
println(person1 == person2)
// true
val set = hashSetOf(person1)
println(set.contains(person2))
// true
}
- toString
data class Person(val name: String, val age: Int)
fun main() {
val person1 = Person(name = "tony", age = 12)
println(person1.toString())
}
// Person(name=tony, age=12)
- copy
- ํ๋กํผํฐ๋ฅผ val๋ก ์ ์งํด ๋ถ๋ณ์ฑ ์ ์ง
- ์ํ๋ ํ๋กํผํฐ๋ง ๋ณ๊ฒฝํ๋ฉด์ ์๋ก์ด ๋ถ๋ณ ๊ฐ์ฒด ์์ฑ
data class Person(val name: String, val age: Int)
fun main() {
val person1 = Person(name = "tony", age = 12)
val person2 = person1.copy(name= "strange")
println(person2.toString())
// Person(name=strange, age=12)
}
- componentN ๐ ํ๋กํผํฐ๋ฅผ ์์๋๋ก ๊ฐ์ ธ์ด
fun main() {
val person1 = Person(name = "tony", age = 12)
println("์ด๋ฆ=${person1.component1()}, ๋์ด=${person1.component2()}")
// ์ด๋ฆ=tony, ๋์ด=12
}
์ฑ๊ธํค๊ณผ ๋๋ฐ๊ฐ์ฒด
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํ๋์ ๋จ์ผ ์ธ์คํด์ค๋ก ์ ํ
๊ฐ์ฒด ์ ์ธ์ ํตํด ์ฑ๊ธํค ๊ธฐ๋ณธ ์ง์ ๐ object ํค์๋ ์ฌ์ฉ
๐ท ์ฑ๊ธํค
object Singleton {
val a = 1234
fun printA() = println(a)
}
fun main() {
println(Singleton.a)
Singleton.printA()
}
๐ท ๋๋ฐ๊ฐ์ฒด
ํด๋์ค ๋ด๋ถ์ ์ ์๋๋ ๊ฐ์ฒด๋ก, ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ๊ฐ์ง ์ ์๊ฒ ํจ
๐ ์๋ฐ์ static ๋ฉค๋ฒ์ ์ ์ฌํ ์ญํ
companion ํค์๋ ์ฌ์ฉํด ํด๋์ค ๋ด๋ถ์ ๊ฐ์ฒด ์ ์ธ ์ฌ์ฉ
class MyClss{
private constructor()
companion object {
val a = 1234
fun newInstance() = MyClass()
}
}
fun main() {
println(MyClass.a)
println(MyClass.newInstance())
// ์ด๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ ์๋ต ๊ฐ๋ฅ
println(MyClass.Companion.a)
println(MyClass.Companion.newInstance())
}
๐ ์์ฑ์๋ฅผ private์ผ๋ก ์จ๊ธฐ๊ณ newInstance ํจ์๋ฅผ ํตํด์๋ง ๊ฐ์ฒด ์์ฑ ๊ฐ๋ฅ
'Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] ์ฝํ๋ฆฐ ์ฌ์ฉํ๋ฉด์ ํ์ฉํ ์ฝ๋ ์ ๋ฆฌ + WebFlux + MongoDB (0) | 2024.07.12 |
---|---|
[Kotlin] ์ฝํ๋ฆฐ ๋ฌธ๋ฒ ๊ณ ๊ธ 2 (0) | 2024.07.09 |
[Kotlin] ์ฝํ๋ฆฐ ๋ฌธ๋ฒ ๊ธฐ์ด 2 (1) | 2024.07.08 |
[Kotlin] ์ฝํ๋ฆฐ ๋ฌธ๋ฒ ๊ธฐ์ด 1 (1) | 2024.07.05 |