λ°μν
↓ TakeIf, TakeUnless
/**
* generic :
* ν΄λμ€μ μΈν°νμ΄μ€ λ§€κ° λ³μ λλ ν¨μμ λ§€κ° λ³μ λ°ν νμ
μ 미리 νμ νμ§ μκ³
* μ μν νμ μ¬μ©λλ μμ μμ νΉμ νμ
μ μ§μ ν μ μλλ‘ ν΄μ£Όλ κΈ°λ²μ΄ μ λ€λ¦.
*
* μΊμ€ν
μ λ°©μ§ νμ¬ μ±λ₯ ν₯μ κ°λ₯.
*
* ( Listλ Generic μΈν°νμ΄μ€λ‘ μ μ λ¨ → ν μ’
λ₯μ List μμ λ€λ₯Έ νμ
μ μμλ€μ μ μ₯ν μ μλ€.)
*
* λ³΅ν© μ λ€λ¦ νμ
맀κ°λ³μ
*
*
* μ λ€λ¦ νμ
μ μ½ (type constraint)
* - μνμ§ μλ νμ
μ μμ΄ν
μ μ μ₯νμ§ λͺ»νλλ‘ νκ³ μΆμ λ
*
*
* vararg μ get
* : κ°λ³μΈμ vararg ν€μλ - μΈμμ κ°μλ₯Ό κ°λ³μ μΌλ‘ μ λ¬ κ°λ₯.
*
* out ν€μλ : Lootμ μ΄λ€ μλΈ ν΄λμ€ μΈμ€ν΄μ€λ κ°λ³ μΈμλ‘ λ°μ μ μλ€.
* >> μ½νλ¦°μμλ inκ³Ό out ν€μλλ₯Ό μ¬μ©νμ¬ μ λ€λ¦ νμ
맀κ°λ³μλ₯Ό λ λ€μν λ°©λ²μΌλ‘ μ‘°μ ν μ μλ€.
*
*
* reified ν€μλ
*
* */
// μ λ€λ¦ νμ
μ μνκΈ°
// μ λ€λ¦ νμ
맀κ°λ³μ T λ₯Ό κ°λλ€. → μ΄λ€ νμ
μ itemλ λ°μ μ μμΌλ©°, κ·Έ private μμ±μΈ lootμ μ§μ νλ€.
// μ΄λ€ λ¨μ΄λ λ¬Έμμ¬λ μκ΄ μμΌλ νμ€νλ λͺ
μΉμ λ°λ₯΄λ κ²μ΄ μ’λ€.
// <T> → <T : Loot> λ‘ νμ
μ μ½ : μ¦ LootBoxμλ μ΄λ€ μ’
λ₯μ΄λ Loot λ§ μ§μ ν μ μμ.
// LootBoxμ vararg ν€μλλ₯Ό μΆκ°νλ©΄ 맀κ°λ³μκ° λ°°μ΄λ‘ μ²λ¦¬λλ―λ‘ μ¬λ¬ κ°μ μμ΄ν
μ μΈμλ‘ μ λ¬.
class LootBox<T : Loot>(vararg item: T)
{
var open = false
// private var loot: T = item
private var loot: Array<out T> = item
operator fun get(index : Int):T? = loot[index].takeIf { open }
// λ§μ½ open μ΄ false μ΄λ©΄ takeIf μμ nullμ λ°ννλ―λ‘ T? λ‘ νμ
μ§μ .
fun fetch(item: Int): T?{
// return loot.takeIf{ open }
return loot[item].takeIf{ open }
}
// λ³΅ν© μ λ€λ¦ νμ
맀κ°λ³μ
fun <R> fetch(item: Int, lootModFunction: (T)->R):R? {
return lootModFunction(loot[item]).takeIf { open }
}
}
open class Loot (val value:Int)
// Fedora μ Coin μμ value μμ±μ valμ μμ ν μ΄μ : Loot ν΄λμ€μμ μμ λλ value μμ±μ μ¬μ©ν κ²μ΄κΈ° λλ¬Έ
class Fedora(val name:String, value: Int) : Loot(value)
class Coin( value: Int) : Loot(value)
fun main() {
// val lootBoxOne : LootBox<Fedora> = LootBox(Fedora("νλ²ν μ€μ λͺ¨",15))
// val lootBoxTwo : LootBox<Coin> = LootBox(Coin(15))
// lootBoxOne.open = true
// lootBoxOne.fetch()?.run {
// println("${name} μ LootBoxμμ κΊΌλμ΅λλ€.")
// }
//
// val fedora = lootBoxOne[1]
// fedora?.let{println(it.name)}
// ν¨λ¬λ―Έν°λ‘ λ긴건 μΈμ€ν΄μ€ A
UsingGeneric(A()).doShouting()
UsingGeneric(B()).doShouting()
UsingGeneric(C()).doShouting()
doShouting(B())
}
fun <T:A> doShouting(t:T){
t.shout()
}
open class A{
open fun shout(){
println("A κ° μ리칩λλ€.")
}
}
class B : A()
{
override fun shout() {
println("Bκ° μ리칩λλ€.")
}
}
class C : A()
{
override fun shout() {
println("Cκ° μ리칩λλ€.")
}
}
// μνΌ ν΄λμ€λ₯Ό Aλ‘ μ νν μ λλ¦ T μ μΈ
class UsingGeneric<T: A> (val t:T){
fun doShouting(){
t.shout()
}
}
νμ₯.
/**
* ν¨μμ νμ₯μ ν΄λμ€ μμ μμ΄λ κ°λ₯νλ€.
*
* μ°μ νΈμΆ - μ΄νμ ν¨μλ₯Ό νΈμΆν μ μλ κ°μ²΄λ₯Ό μ΄μ ν¨μ νΈμΆμμ λ°ννλ€λ©΄ μ°μν΄μ μ¬λ¬ ν¨μ νΈμΆ κ°λ₯
* νμ₯ ν¨μμ μΆκ°νμ¬ νμ₯ μμ±λ μ μν μ μλ€.
*
* μ°μΆ μμ±μ μ μΈν λͺ¨λ ν΄λμ€ μμ±μ λ°μ΄ν°κ° μ μ₯λλ νμ νλλ₯Ό κ°μ§λ©°, κ²ν°μ μΈν°κ° μλ μμ± λ¨.
* κ·Έλ¬λ νμ₯ μμ±μ μ°μΆ μμ± μ²λΌ νμ νλλ₯Ό κ°μ§ μλλ€.λ°λΌμ μμ±μμ λ°νλ κ°μ μ°μΆ νλ get μ λ°λμ μ μν΄μΌ ν¨.
*
* μλ₯Ό λ€μ΄ μλ μ½λλ μ»΄νμΌ μλ¬. Why? νμ₯ μμ±μ νμ νλλ₯Ό κ°μ§ μμΌλ―λ‘ μ΄κΈ°νν μ μκΈ° λλ¬Έ.
* var String.preferredCharacters = 10
* λ°λΌμ var λμ val μ μ§μ νκ³ μνλ κ°μ λ°ννλ get μ μ μν΄μΌ νλ€.
*
*
* μ½νλ¦°μ λͺ¨λ 컬λ μ
ν΄λμ€μ μΈν°νμ΄μ€μ μνΌ νμ
μ Iterable μ΄λ€.
*
*
* 1. μλ‘μ΄ "extension"ν΄λλ₯Ό λ§λ λ€.
* 2. ν΄λΉ ν΄λ μμ .kt νμΌμ private νμ₯ ν¨μλ₯Ό μ
λ ₯νλ€.
* 3. private μ μμ€λ€.
* 4. ν΄λΉ ν¨μλ₯Ό μ¬μ©νκ³ μΆμ λ€λ₯Έ μΈλΆμ .kt νμΌμμ import λ₯Ό ν΄μ€λ€.
* 5. import μ£Όμ μ¬ν! import λ¬Έμ μ¬μ©νκ³ μ νλ .kt μ μ μΌ μμ μ§μ (packageκ° μμΌλ©΄ κ·Έ λ΄ μ€μ)
* 6. import ν΄μ μ¬μ©ν λ ν¨μλ€μ ν¨κΌ μ¬μ©ν κ²½μ°, as ν€μλλ‘ λ³μΉμ μ§μ νμ¬ μ΄λ¦ μΆ©λμ΄ μκΈ°μ§ μκ² ν μ μλ€.
*
*/
// νμ μμ± : μλ νμ₯ μμ±μ λ¬Έμμ΄μ λͺ¨μ κ°μλ₯Ό μ°μΆνλ€.
val String.numVowels
get()= count{"aeiouy".contains(it)}
// String ν΄λμ€μ νμ₯ ν¨μ μΆκ°νκΈ°
// νμ₯ ν¨μλ₯Ό μ μ μμ, νμ₯ ν¨μ μΆκ°ν νμ
(μμ μ νμ
receiver type)
fun String.addEnthusiasm(amount:Int = 1) = this + "!".repeat(amount)
// Any μμ νμ₯ : λͺ¨λ νμ
μ λν΄ μ¬μ©ν μ μλ€. → easyPrintλ Anyμ λͺ¨λ μλΈνμ
μμ μ¬μ©ν μ μλ€.
// fun Any.easyPrint() = println(this)
// ↓ μ°μ νΈμΆ κ°λ₯ νλλ‘ λ³κ²½ (generic νμ₯ν¨μλ‘ λ³κ²½)
// : 맀κ°λ³μμΈ Tκ° νμ₯ ν¨μμ μμ μ νμ
μΌλ‘ μ¬μ©λκ³ , Any λμ T νμ
μΌλ‘ λ°νλ¨.
fun <T> T.easyPrint(): T{
println(this)
return this
}
// null κ°λ₯ νμ
μ νμ₯ ν¨μ μΆκ°νκΈ°
// infix : νλμ μΈμλ₯Ό κ°λ νμ₯ ν¨μμ ν΄λμ€ ν¨μ λͺ¨λμ μ¬μ©ν μ μμΌλ©°, ν¨μ νΈμΆ λ¬Έλ²μ κ°κ²°νκ² ν΄μ€.
// infix ν€μλλ₯Ό μ§μ ν κ²μ μ€μ ν¨μλΌκ³ νλ©°,
// μ€μ ν¨μλ₯Ό νΈμΆν λλ μμ μ κ°μ²΄μ ν¨κ» ν¨μ νΈμΆ μ¬μ΄μ μ (.)μ λ¬Όλ‘ μ΄κ³ μΈμ μ£Όμμ κ΄νΈλ μλ΅ν μ μλ€.
// μ½νλ¦° μ€μ ν¨μ: shl, shr ushr, and, or , xor, inv
infix fun String?.printWithDefault(default: String) = print(this?: default)
fun main(){
("λ§λ리κ°μ΄ κ·Έ 건물μμ λμμ΅λλ€.".addEnthusiasm()).easyPrint()
42.easyPrint()
// ν¨μ νΈμΆ μ κ³Ό νμμ easyPrint ν¨μλ₯Ό κ°κ° νΈμΆνκ² λ³κ²½/ μλλ μ μλ¬κ° λ κΉ?
// > easyPrint λ‘ λ°νλ κ°μ΄ Any λΌμ.
// generic μΌλ‘ λ°κΎΌ ν
"λ§λλ¦¬κ° κ·Έ 건물μμ λμ΄".easyPrint().addEnthusiasm().easyPrint()
// νμ₯ μμ± μ¬μ©νκΈ°
"How many vowels?".numVowels.easyPrint()
//infix ν€μλ μ΄ νμ₯ ν¨μ (μ€μ ν¨μ)
null printWithDefault "κΈ°λ³Έ λ¬Έμμ΄" // infix ν€μλ μ§μ λ μ€μ ν¨μμμλ§ μ¬μ© κ°λ₯
null.printWithDefault("κΈ°λ³Έ λ¬Έμμ΄") // μ€μ ν¨μμ μΌλ° ν¨μ λͺ¨λμμ μ¬μ© κ°λ₯ν μν
}
//// shuffled.first() μ΄ ν¨μκ° μμ£Ό λ°λ³΅λμλλ°, μ΄λ° μ€λ³΅λ μ½λλ νμ₯ ν¨μλ‘ μΆμΆ νλ€.
//// ↓ μμ£Ό λ°λ³΅ λλ κ² νμ₯ ν¨μλ‘ μΆμΆνκΈ°
//// shuffledμ firstλ Listμ Set νμ
λͺ¨λμ λν΄ μ°μ νΈμΆλ¨. λ°λΌμ λ νμ
λͺ¨λμ νμ₯ ν¨μλ₯Ό μ¬μ©ν μ μκ² νλ €λ©΄
//// λ νμ
μ μνΌ νμ
μΈ Iterableμ μμ μ νμ
μΌλ‘ μ μν΄μΌνλ€.
//private fun <T> Iterable<T>.random():T = this.shuffled().first()
//// νμ₯ ν¨μ μ΄λ¦ λ³κ²½ν΄μ μ°κΈ° as
//import mypkg.io.extractKey
//import mypkg.io.extractKey as extracKeyUtil
//
//
//val value1 = extractKey()
//val value2 = extracKeyUtil()
null κ°λ₯ νμ μ νμ₯ ν¨μ.
ν¨μν νλ‘κ·Έλλ°
https://www.youtube.com/watch?v=6iZDjLvhMN8
μνμ€ / μ±λ₯ μΈ‘μ
/**
* μνμ€ : λ΄μ₯λ μ§μ°(lazy) 컬λ μ
νμ
*
* asSequence ν¨μλ₯Ό μ¬μ©ν΄μ Listλ₯Ό μνμ€λ‘ μ½κ² λ³νν μ μλ€.
*
* μ±λ₯ μΈ‘μ
* - μ½λ μ±λ₯μ μλ €μ£Όλ measureNanoTime , measureTimeInMillis
* >>
* */
fun main() {
val toList = (1..5000).toList().filter{it.isPrime()}.take(1000)
// μμ λ΄μ©μ μ§μ° μνμ€λ₯Ό μ¬μ©νλ©΄
val oneThousandPrimes = generateSequence(3) {
value -> value+1
}.filter { it.isPrime() }.take(1000)
}
// μμμΈμ§λ₯Ό κ²°μ νλ Int νμ
μ νμ₯ ν¨μ
fun Int.isPrime(): Boolean{
(2 until this).map{
if(this % it == 0){
return false
}
}
return true
}
//
λ°μν
'Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ―Έμ Kotlin_Android] MVVM ν¨ν΄ (0) | 2021.07.19 |
---|---|
IntelliJ μ€μΉ μ μ»΄νμΌ μ€λ₯ (0) | 2021.07.19 |
Kotlin_μμ / κ°μ²΄ / μΈν°νμ΄μ€μ μΆμ ν΄λμ€ (0) | 2021.07.02 |
Kotlin_Map / Class (0) | 2021.07.01 |
Kotlin - Scope ν¨μ & Listμ Set (0) | 2021.06.30 |
λκΈ