[System Engineering] (iOS) νλ‘κ·Έλλ° ν¨λ¬λ€μ / ν¨μν νλ‘κ·Έλλ° (feat. swift μ½λλ‘ λΉκ΅νλ©° μμ보기)
μ€ν°λλ₯Ό μ΄μνκ³ μμ΅λλ€. ν΄λΉ repositoryμ κ°λ©΄ λ λ§μ μ 보λ₯Ό λ³΄μ€ μ μμ΅λλ€!
νΉν close λ PRμ 보μλ©΄, μ΄λ€ λΆλΆμ λν΄μ κ³ λ―Όνκ³ μ€ν°λμλ€κ³Ό μ΄μΌκΈ°λλ΄λμ§ λ³΄μ€ μ μμ΅λλ€
https://github.com/JulSaMo/CS-start
GitHub - JulSaMo/CS-start: π CS μ§μ λλ°±κ³Ό β¨
π CS μ§μ λλ°±κ³Ό β¨. Contribute to JulSaMo/CS-start development by creating an account on GitHub.
github.com
π νλ‘κ·Έλλ° ν¨λ¬λ€μ (Programming Paradigm)
νλ‘κ·Έλλ° ν¨λ¬λ€μμ νλ‘κ·Έλλ¨Έμκ² νλ‘κ·Έλλ°μ κ΄μ μΌ λ½μ νκ³ μ½λλ₯Ό μ΄λ»κ² μμ±ν μ§ κ²°μ νλ μν μ νλ€. μλ‘μ΄ νλ‘κ·Έλλ° ν¨λ¬λ€μμ ν΅ν΄μ μλ‘μ΄ λ°©μμΌλ‘ μκ°νλ λ²μ λ°°μ°κ² λκ³ , μ΄λ₯Ό λ°νμΌλ‘ μ½λλ₯Ό μμ±νκ² λλ€.
νλ‘κ·Έλλ° ν¨λ¬λ€μμ μλμ κ°μ΄ ꡬλ³ν μ μλ€.
λͺ λ Ήν νλ‘κ·Έλλ°
πΈλ¬΄μ(what)μ ν κ²μΈμ§ λνλ΄κΈ°λ³΄λ€ μ΄λ»κ²(How) ν κ²μΈμ§λ₯Ό μ€λͺ
νλ λ°©μ
νλ‘κ·Έλλ°μ μν, μνλ₯Ό λ³κ²½μν€λ ꡬ문μ κ΄μ μμ μ°μ°μ μ€λͺ
νλ€.
- μ μ°¨μ§ν₯ νλ‘κ·Έλλ°
- μνλμ΄μΌν μμ°¨μ μΈ μ²λ¦¬ κ³Όμ μ ν¬ν¨νλ λ°©μ (C, C++)
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
- κ°μ²΄λ€μ μ§ν©μΌλ‘ νλ‘κ·Έλ¨μ μνΈμμ©μ νν (C++, Java, C#)
μ μΈν νλ‘κ·Έλλ°
πΈμ΄λ»κ² ν 건μ§(HOW)보λ€λ 무μμ (WHAT)μ ν κ±΄μ§ μ€λͺ
νλ λ°©μ
- ν¨μν νλ‘κ·Έλλ°
- μμ ν¨μλ₯Ό μ‘°ν©νκ³ μννΈμ¨μ΄λ₯Ό λ§λλ λ°©μ (ν΄λ‘μ , νμ€μΌ, 리μ€ν)
π¦ μ΄ν΄λ₯Ό λκΈ°μν μ μΈνκ³Ό λͺ
λ Ήν νλ‘κ·Έλλ°μ μ°¨μ΄μ !
<λͺ
λ Ήν νλ‘κ·Έλλ°> How μ μ§μ€
- μ리μμ μΌμ΄λλ€
- λΆμμΌλ‘ μ΄λνλ€
- μ»΅κ³Ό λ¬Όμ μ°Ύλλ€
- μ»΅μ λ¬Όμ λΆμ΄ λ§μ λ€
<μ μΈν νλ‘κ·Έλλ°> Whatμ μ§μ€
- λ¬Όμ μ°Ύμ λ§μ
보μ!
ν¨μν νλ‘κ·Έλλ°
π- λͺ λ Ήν νλ‘κ·Έλλ°μΌλ‘ κ°λ°νλ κ°λ°μλ€μ μννΈμ¨μ΄μ ν¬κΈ°κ° μ μ 컀μ§μ λ°λΌ 볡μ‘νκ² μμΌμλ μ½λλ₯Ό μ μ§λ³΄μνκΈ° νλ€λ€λ κ²μ λλ
- μ΄λ¬ν λ¨μ μ ν΄κ²°νκΈ° μν΄μ ν¨μν νλ‘κ·Έλλ°μ μ¬μ©νκ²λ¨.
- ν¨μν νλ‘κ·Έλλ°μ κ±°μ λͺ¨λ κ²μ μμν¨μλ‘ λλμ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ―λ‘, μμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν ν¨μλ₯Ό μμ±νμ¬ κ°λ μ±μ λμ΄κ³ μ μ§λ³΄μλ₯Ό μ©μ΄νκ² ν΄μ€
- κ°μ΄λ μν λ³ν 보λ€λ ν¨μ μ체μ μμ©μ μ€μνκ² μ¬κΈ΄λ€
- νλ‘κ·Έλ¨ λμ κ³Όμ μμ μνκ° λ³νμ§ μμΌλ©΄ ν€μ νΈμΆμ΄ κ°κ° μνΈ κ°μ μμ΄ μ€νλλ―λ‘ λ³λ ¬μ²λ¦¬λ₯Ό ν λ λΆμμ©μ΄ κ±°μ μλ€λ μ₯μ μ΄ μμ.
ν¨μν νλ‘κ·Έλλ°μ λν μ΄ν΄
πΈν¨μν νλ‘κ·Έλλ°μ μμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν ν¨μλ₯Ό μμ±νλ€. κ·Έλ κΈ° λλ¬Έμ ν¨μν νλ‘κ·Έλλ°μμλ nκΉμ§ λ°λ³΅λ¬Έμ λλ©΄μ μ«μλ₯Ό μΆλ ₯νκ³ μΆμλ, μλμ κ°μ΄ μ½λλ₯Ό μμ±ν μ μλ€. (μλ process μ½λλ μ΄ν΄λ₯Ό λκΈ°μν μλμ½λμ΄λ€.)
process(10, print(num))
첫λ²μ§Έ μΈμλ λͺ λ² iterationμ λ κ²μΈμ§ 맀κ°λ³μλ‘ λ°μκ³ , λλ²μ§Έ μΈμλ‘ μ λ¬λ°μ κ°μ μΆλ ₯νλΌλ ν¨μλ₯Ό 맀κ°λ³μλ‘ λ°κ³ μλ€. μ¦, μΆλ ₯νλ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λκ²Όλ€λ λ»μΈλ°, μ΄λ κ² λκΈΈ μ μλ μ΄μ λ 'ν¨μν νλ‘κ·Έλλ°μ κΈ°λ³Έμ리, ν¨μλ 1κΈκ°μ²΄λ‘ μ·¨κΈνλ€'λΌλ νΉμ§ λλ¬Έμ΄λ€. (μ΄ ν¨μν νλ‘κ·Έλλ°μ λν μ€λͺ μ λ€μμ μΆκ°λ‘ λ μμ΄μΌ)
λͺ λ Ήν νλ‘κ·Έλλ°κ³Ό λ€λ₯Έμ
π¦λͺ λ Ήν νλ‘κ·Έλλ°μμλ λ©μλλ₯Ό νΈμΆνλ©΄ μν©μ λ°λΌ λ΄λΆμ κ°μ΄ λ°λ μ μλ€. μ°λ¦¬κ° κ°λ°ν ν¨μ λ΄μμ μ μΈλ λ³μμ λ©λͺ¨λ¦¬μ ν λΉλ κ°μ΄ λ°λλ λ±μ λ³νκ° μΌμ΄λ μ μκΈ° λλ¬Έμ΄λ€.
νμ§λ§ ν¨μν νλ‘κ·Έλλ°μ λ©λͺ¨λ¦¬μ ν λ² ν λΉλ κ°μ μλ‘μ΄ κ°μΌλ‘ λ³ν μ μλ€. μ¦, μ½λ μ΄ν΄μ μ€νκ²°κ³Όμ κ΄μ μμ μμνκ² ν¨μμ μ λ¬λ μΈμ κ°λ§ κ²°κ³Όμ μν₯μ μ£Όλ―λ‘, λ€λ₯Έ μνκ°μ κ°μ§ μκ³ μμνκ² ν¨μλ§μΌλ‘ λμνμ¬ μΈμ λ μΌμ ν κ²°κ³Όκ°μ λμΆνλ€.
ν¨μν νλ‘κ·Έλλ°μ νΉμ§
πΈβ¨ λΆμν¨κ³Ό (side Effect)κ° μλ μμ ν¨μλ₯Ό 1κΈ κ°μ²΄ (first-class object)λ‘ κ°μ£Όνμ¬ νλΌλ―Έν°λ λ°νκ°μΌλ‘ μ¬μ©ν μ μμΌλ©°, μ°Έμ‘° ν¬λͺ
μ±μ μ§ν¬ μ μλ€.
λΆμν¨κ³Ό (Side Effect) λ
π¦λΆμν¨κ³Όλ, λ€μκ³Ό κ°μ λ³ν λλ λ³νκ° λ°μνλ μμ μ μλ―Ένλ€.
- λ³μμ κ°μ΄ λ³κ²½λ¨
- μλ£κ΅¬μ‘°λ₯Ό μ μ리μμ μμ ν¨
- μ½μ λλ I/Oκ° λ°μν¨
μ§κΈμ λΆμν¨κ³Όκ° μ΄ν΄κ° μκ° μ μλ€. μμν¨μλ λΆμν¨κ³Όλ₯Ό ν¨κ» μ΄ν΄ν΄λ³΄μ.
μμν¨μ (Pure Function) λ
π¦μμ λΆμν¨κ³Όλ€μ μ κ±°ν ν¨μλ€μ μμν¨μλΌκ³ νλ€. ν¨μν νλ‘κ·Έλλ°μμ μ΄μ©νλ ν¨μλ μ΄λ¬ν μμν¨μμ΄λ€! μ¦, λΆμν¨κ³Όκ° μλ κ²μ΄ μμν¨μμ΄λ―λ‘, λ€μ΄μ¨ μΈμκ° κ°μΌλ©΄ κ²°κ³Όκ° νμ κ°μ ν¨μ
μμλ₯Ό ν΅ν΄ μμ보μ.
π¬var testName = "hello world"
func getName -> String {
return testName
}
μ ν¨μλ μμν¨μμΌκΉ? β
- getNameν¨μλ μΈλΆμ μλ nameμ μν₯μ λ°λλ€.
- nameμ΄ varλ‘ μ μΈλμ΄ μμ΄μ side-effectκ° μ‘΄μ¬ν κ°λ₯μ±μ΄ λκΈ° λλ¬Έμ μμν¨μκ° μλλ€.
κ·ΈλΌ μ ν¨μλ₯Ό μμν¨μλ‘ λ°κΏλ³΄μ.
func getName(_ name: String) -> String {
return name
}
μ΄λ κ² λ°κΎΈλ©΄ μμν¨μμ΄λ€. β
- ν¨μ μ체μ νλΌλ―Έν°λ‘ λ°μ nameμ λ°μ΄ν°λ‘λ§ κ²°μ λκΈ° λλ¬Έμ
μΈλΆμ μν₯μ μ ν λ°μ§ μκ³ νλΌλ―Έν°μ μ
λ ₯μ λν΄μλ λμΌν κ²°κ³Όλ₯Ό λνλΈλ€.
νμ§λ§!!! μμμ var λ‘ μ μΈλμ΄ side effectκ° λ°μν κ°λ₯μ±μ΄ μ‘΄μ¬νλ€κ³ νμμ?
let testName = "hello world"
func getName -> String {
return testName
}
μ΄λ κ² λ°κΏλ μμν¨μμ΄λ€!! β
μμν¨μμ μ₯μ μ μμ보μ
π¬- ν¨μ μμ²΄κ° λ 립μ μ΄λ©° side-effectκ° μκΈ° λλ¬Έμ Threadμ μμ μ±μ 보μ₯λ°μ μ μλ€. (μμν¨μλ λ©λͺ¨λ¦¬, I/Oμ κ΄μ μμ side effectκ° μκΈ° λλ¬Έμ μμ μ±μ 보μ₯λ°λ κ²μ΄λ€.)
- Threadμ μμ μ±μ 보μ₯λ°μ λ³λ ¬μ²λ¦¬λ₯Ό λκΈ°νμμ΄ μ§νν μ μλ€.
1κΈκ°μ²΄ (first class object)λ
π¦1κΈ κ°μ²΄λ λ€μκ³Ό κ°μ 쑰건μ λ§μ‘±νλ κ²λ€μ΄ 1κΈκ°μ²΄κ° λ μ μλ€.
- λ³μλ λ°μ΄ν° ꡬ쑰 μμ λ΄μ μ μλ€.
- νλΌλ―Έν°λ‘ μ λ¬ ν μ μλ€.
- λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€.
- ν λΉμ μ¬μ©λ μ΄λ¦κ³Ό 무κ΄νκ² κ³ μ ν ꡬλ³μ΄ κ°λ₯νλ€.
ν¨μν νλ‘κ·Έλλ°μμ ν¨μλ 1κΈκ°μ²΄λ‘ μ·¨κΈλ°κΈ° λλ¬Έμ μ μμ μμ λ³Έ process(10, print(num)) μ²λΌ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λκΈ°λ λ±μ μμ μ΄ κ°λ₯ν κ²μ΄λ€.
μ°Έμ‘° ν¬λͺ μ± (Referential Transparency)
π¦- λμΌν μΈμμ λν΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°μμΌ νλ€.
- μ°Έμ‘° ν¬λͺ
μ±μ ν΅ν΄ κΈ°μ‘΄μ κ°μ λ³κ²½λμ§ μκ³ μ μ§λλ€.
λͺ λ Ήν νλ‘κ·Έλλ°κ³Ό ν¨μν νλ‘κ·Έλλ°μμ μ¬μ©νλ ν¨μλ side effectμ μ 무 μ λ°λΌ μ°¨μ΄κ° μλ€. μ΄μ λ°λΌμ ν¨μκ° μ°Έμ‘°μ ν¬λͺ νμ§ μνμ§ λλ μ§λλ°, μ°Έμ‘°μ ν¬λͺ νλ€λ κ²μ λ§ κ·Έλλ‘ ν¨μλ₯Ό μ€ννμ¬λ μ΄λ ν μν λ³ν μμ΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°ννμ¬ νλΉ λμΌνκ²(ν¬λͺ νκ²) μ€ν κ²°κ³Όλ₯Ό μ°Έμ‘°(μμΈ‘)ν μ μλ€λ κ²μ μλ―Ένλ€.
ν¨μν νλ‘κ·Έλλ°μ μ₯μ μ μμ보μ!
πΈ- μ¬λ¬κ°μ§ μ°μ° μ²λ¦¬ μμ μ΄ λμμ μΌμ΄λλ νλ‘κ·Έλ¨μ μ§κΈ° μ½λ€.
- λ©ν°μ½μ΄ νΉμ μ¬λ¬ μ°μ° νλ‘μΈμλ₯Ό μ¬μ©νλ μμ€ν μμ ν¨μ¨μ μΈ νλ‘κ·Έλ¨μ λ§λ€κΈ° μ½λ€.
- μνλ³νμ λ°λ₯Έ λΆμμ©μμ μμ λ‘μμ§λ―λ‘ μμνκ² κΈ°λ₯ ꡬνμ μ΄μ μ λ§μΆ° μ€κ³κ° κ°λ₯νλ€.
λͺ λ Ήν νλ‘κ·Έλλ°κ³Ό ν¨μν νλ‘κ·Έλλ° μ½λλ‘ λΉκ΅ν΄λ³΄κΈ°
πdoSomething ν¨μμ doAnotherThing ν¨μλ₯Ό λμμ μ€ννλ μ½λλ₯Ό μμ±νλ€κ³ μΉμ.
// β
λͺ
λ Ήν νλ‘κ·Έλλ°
class CommandProgramming {
func doSomething() {
print("doSomething")
}
func doAnotherThing() {
print("doAnotherThing")
}
func executeAll() {
doSomething()
doAnotherThing()
}
}
// νΈμΆ
excuteAll()
// β
ν¨μν νλ‘κ·Έλλ°
class CommandProgramming {
func doSomething() {
print("doSomething")
}
func doAnotherThing() {
print("doAnotherThing")
}
func executeAll(tasks: [() -> Void)) {
for task in tasks {
task()
}
}
}
// νΈμΆ
excute(tasks: [doAnotherThing, doSomething])
ν¨μν νλ‘κ·Έλλ° μμμλ ν¨μκ° μΌκΈκ°μ²΄ μ΄λ―λ‘, ν¨μλ₯Ό μ λ¬μΈμ λλ λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€. μ°¨μ΄μ μ νλ‘ λ³΄λ©΄ λ€μκ³Ό κ°λ€.
REFERENCE
πhttps://borabong.tistory.com/5
[Swift] ν¨μν νλ‘κ·Έλλ°μ΄λ?
μλ νμΈμπ 보λΌλ΄μ λλ€ :) μ€λμ μ€μννΈ μΈμ΄μ νΉμ§ μ€ νλμΈ ν¨μν νλ‘κ·Έλλ°μ λν΄ μμλ³΄κ² μ΅λλ€ γ γ !! μ€μννΈλ ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μμ μ§ν₯ν©λλ€. κ·Έλ λ€λ©΄, λ
borabong.tistory.com
https://mangkyu.tistory.com/111
[νλ‘κ·Έλλ°] ν¨μν νλ‘κ·Έλλ°(Functional Programming) μ΄λ?
1. ν¨μν νλ‘κ·Έλλ°(Functional Programming)μ λν μ΄ν΄ [ νλ‘κ·Έλλ° ν¨λ¬λ€μ(Programming Paradigm) ] νλ‘κ·Έλλ° ν¨λ¬λ€μ(Programming Paradigm)μ νλ‘κ·Έλλ¨Έμκ² νλ‘κ·Έλλ°μ κ΄μ μ κ°κ² νκ³ μ½λλ₯Ό..
mangkyu.tistory.com
https://jinnify.tistory.com/54
[Swift] 1. μμν¨μ, Pure Function (Functional Programming in Swift)
μμ ν¨μ(Pure Function)μ κ΄ν΄ μμ보λλ‘ νκ² μ΅λλ€. ν¨μν νλ‘κ·Έλλ° Funtional Programmingμ ν¨μλ₯Ό μ€μ¬μΌλ‘ Side-Effectκ° μλλ‘ νλ‘κ·Έλλ°μ νλ κ²μ λ§ν©λλ€. μ¬κΈ°μ λ§νλ ν¨μλ μμ
jinnify.tistory.com