곡뢀 μ—°μŠ΅μž₯ :-)

TIL_20171110

|

였늘 배운 / λŠλ‚€ 것

  • μœ λ‹› ν…ŒμŠ€νŠΈ μ§„μž…. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ λ§Œλ“€κΈ°κ°€ μ–΄λ ΅λ‹€. 감이 μ•ˆμ˜¨λ‹¬κΉŒ
    • @testable μ΄λΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆλŠ”λ° 이건 λͺ¨λ“ˆμ„ μž„ν¬νŠΈν•œλ‹€λŠ” κ°œλ…μ΄λΌμ„œ λ‚΄κ°€ μ§  ν”„λ‘œμ νŠΈκ°€ λͺ¨λ“ˆμ΄μ–΄μ•Όλ§Œ 효용이 μžˆμ–΄μ„œ μ‚¬λ‹€λ¦¬κ²Œμž„ λ―Έμ…˜μ—μ„œλŠ” (λͺ¨λ“ˆμ΄ μ•„λ‹ˆλΌ)νš¨κ³Όκ°€ μ—†μ—ˆκ³ , ν…ŒμŠ€νŠΈλ₯Ό ν•˜κ³ μ‹Άμ€ swift파일의 target membership에 μ‹€ν–‰νŒŒμΌκ³Ό ν…ŒμŠ€νŠΈνŒŒμΌμ΄ 같이 μ²΄ν¬λ˜μ–΄μžˆλŠ”μ§€ λ΄μ•Όν•œλ‹€!
  • Data Object λ§Œλ“€κΈ°
    • 사닀리 κ²Œμž„μ˜ 사닀리 좜λ ₯λΆ€μ—μ„œ 계속 사닀리λ₯Ό λ§Œλ“œλŠ” ν•¨μˆ˜μ— ν•œλ²ˆμ”© μ ‘κ·Όν•΄μ„œ ν”„λ¦°νŠΈν•˜κ³  μžˆλŠ” 뢀뢄이 μžˆμ—ˆλŠ”λ° κ·Έ 뢀뢄에 λŒ€ν•œ ν”Όλ“œλ°±μ„ λ°›μ•˜λ‹€.
      • 둜직이 μžˆλŠ” 객체끼리 의쑴적이면 μ•ˆλ¨! 객체 μ‚¬μ΄μ‚¬μ΄μ—λŠ” β€œλ°μ΄ν„°λ§Œβ€ λ„˜κΈ°κ³  λ„˜μ–΄κ°€μ•Ό ν•œλ‹€.
      • 둜직이 μžˆλŠ” κ°μ²΄λŠ” 이전 둜직이 λ§Œλ“  Data만 가지고 μžμ‹ μ˜ λ™μž‘μ„ μ²˜λ¦¬ν•΄μ•Όν•œλ‹€. ν”„λ‘œκ·Έλž¨μ˜ 흐름이 둜직 - 데이터 - 둜직 - 데이터 … 이런 μ‹μœΌλ‘œ μ—°κ²°λ˜μ•Ό ν•œλ‹€λŠ” 뜻.

μ•žμœΌλ‘œ ν•  것

  • Data Object λ§Œλ“€μ–΄ λ¦¬νŒ©ν† λ§
  • λ¦¬νŒ©ν† λ§ ν›„ μ‚¬λ‹€λ¦¬κ²Œμž„ ν…ŒμŠ€νŠΈ 진행!

TIL_20171109

|

였늘 배운 / λŠλ‚€ 것

  • ν΄λž˜μŠ€μ™€ ꡬ쑰체 - λΉ…λ„ˆλ“œλžœμΉ˜ λ³΄λ©΄μ„œ 정리
    • 그런데 μ–΄λ–€ μ˜ˆμ‹œμ—μ„œ μ„œλΈŒν΄λž˜μŠ€μ˜ λ©”μ„œλ“œκ°€ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. μ•„λ¬΄λž˜λ„ 슈퍼클래슀의 ν”„λ‘œνΌν‹°μ— μ˜΅μ…”λ„κ°’μ΄ μžˆμ—ˆλŠ”λ° 그게 μ œλŒ€λ‘œ λ°”μΈλ”©λ˜μ§€ μ•Šμ•„μ„œ 생긴 λ¬Έμ œκ°™λ‹€. λ‹€μŒμ— 질문 ν›„ ν•΄κ²°ν•˜λ©΄ λ”°λ‘œ 정리할 μ˜ˆμ •
  • νƒ€μž…λ©”μ„œλ“œ 곡뢀 / 정리
  • μ‚¬λ‹€λ¦¬κ²Œμž„ step 3 - mergeμ™„λ£Œ
    • μ ‘κ·Όμ œμ–΄μžλ₯Ό μ΅œλŒ€ν•œ λ°©μ–΄μ μœΌλ‘œ μ“°μž
    • Data ObjectλŠ” getterλ‚˜ setterκ°€ ν•„μš”μ—†λ‹€.
    • ν”„λ‘œνΌν‹°μ— (set) ν‚€μ›Œλ“œλ₯Ό μ“°λ©΄ ν”„λ‘œνΌν‹° 값을 set(λ°”κΏˆ)ν•˜λŠ” 것을 막고 get(μ½μ–΄μ˜΄)만 κ°€λŠ₯ν•˜κ²Œλ§Œ μ œν•œν•  수 μžˆλ‹€. κ·Έλž˜μ„œ(set)을 μ“°λ©΄ getterλ₯Ό μ“Έ ν•„μš”κ°€ μ—†λ‹€.
    • 아무리 μ‚¬μ†Œν•œ printκΈ°λŠ₯이라도 ν•¨μˆ˜μ˜ κΈ°λŠ₯κ³Ό λœ»μ— 맞게 좜λ ₯ν•˜λŠ” λ¬Έμžμ—΄μ„ λ‚˜λˆ„κ±°λ‚˜ μ›λž˜ μ‘΄μž¬ν•˜λŠ” ν‚€μ›Œλ“œμ™€ κΈ°λŠ₯을 ν™œμš©ν•΄μ„œ μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ λ§Œλ“œλŠ” 방법을 μ—°κ΅¬ν•˜μž.
      • (print("|")λ₯Ό λ‹€μŒ μ€„μ—μ„œ λ”°λ‘œ μ°λŠ” λŒ€μ‹ μ— terminator에 λ°”λ‘œ "|"λ₯Ό μΆ”κ°€ν•΄μ„œ ν™œμš©μ„±μ„ 높일 수 μžˆμ—ˆλ‹€. )
      • "-----|"둜 μ„Έλ‘œ barκΉŒμ§€ ν•œκΊΌλ²ˆμ— 좜λ ₯ν•˜λŠ” λŒ€μ‹ μ— bar만 μƒμ„±ν•œλ‹€λŠ” λ©”μ†Œλ“œμ˜ λœ»μ— 맞게 "-----"둜 λ³€κ²½
    • μ–΄λ–€ ν•œ μΈμŠ€ν„΄μŠ€κ°€ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€κ°μ²΄μ— μ ‘κ·Όν•˜κ³  있으면, κΌ­ ν”„λ‘œνΌν‹°μ— μ„ μ–Έλ˜μ–΄μžˆκ±°λ‚˜ λ§€κ°œλ³€μˆ˜λ‘œ 전달받아야 함. μ „μ—­λ³€μˆ˜μ— μ ‘κ·Όν•΄μ„œ κ°’μ΄λ‚˜ ν•¨μˆ˜λ₯Ό λ°”λ‘œ κΊΌλ‚΄μ˜€λŠ” 것은 λ‚˜μœ ꡬ쑰!

μ•žμœΌλ‘œ ν•  것

  • μ΄ˆκΈ°ν™”

  • ν΄λž˜μŠ€μ™€ ꡬ쑰체 μƒμ†μ—μ„œ ν…ŒμŠ€νŠΈν•˜λ‹€κ°€ μ•ˆλλ˜ λΆ€λΆ„ (μœ„μ— μ–ΈκΈ‰) 질문

  • guard ꡬ문 μ§ˆλ¬Έν–ˆλ˜ 것 λ‹΅λ³€ μ–»μŒ. λ‹€μ‹œ ν…ŒμŠ€νŠΈν•΄λ³΄κ³  μ •λ¦¬ν•˜μž

  • 사닀리 step4 λ‹¨μœ„ν…ŒμŠ€νŠΈ ν—ˆλ¦¬ν—ˆλ¦¬μ—…

    ​

νƒ€μž…λ©”μ„œλ“œ

|

νƒ€μž…λ©”μ„œλ“œ

νƒ€μž…λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό λ§ν•œλ‹€. (μžλ°”λ‘œ 치면 staticλ©”μ„œλ“œ)

struct의 νƒ€μž…λ©”μ„œλ“œλŠ” static ν‚€μ›Œλ“œλ₯Ό 뢙인닀.

struct Square {
  static func numberOfSides() -> Int{
    return 4
  }
}

class의 νƒ€μž…λ©”μ„œλ“œμ—λŠ” class ν‚€μ›Œλ“œλ₯Ό 뢙인닀.

class Zombie: Monster {
  class func makeNoise() -> String {
    return "Brains..."
  }
}

νƒ€μž…λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” νƒ€μž… μžμ²΄μ— λ‹€μŒμ²˜λŸΌ ν˜ΈμΆœν•˜λ©΄ λœλ‹€.

let sides = Square.numberOfSides()
let noise = Zombie.makeNoise()
μ„œλΈŒν΄λž˜μŠ€μ—μ„œμ˜ μ˜€λ²„λΌμ΄λ“œ

μ„œλΈŒν΄λž˜μŠ€λŠ” ν΄λž˜μŠ€λ©”μ„œλ“œλ₯Ό 자체적으둜 κ΅¬ν˜„ (μ˜€λ²„λΌμ΄λ“œ)ν•  수 μžˆλ‹€.

class GiantZombie: Zombie {
  override class func makeNoise() -> String {
    return "rrrr...!!"
  }
}

μ—¬κΈ°μ„œ GiantZombieλŠ” Zombie의 μ„œλΈŒν΄λž˜μŠ€μ΄λ©°, classλ©”μ„œλ“œμ˜ μ˜€λ²„λΌμ΄λ“œλ₯Ό μ œκ³΅ν•˜κ³ μžˆλ‹€. (makeNoise()) λ§Œμ•½ classλ©”μ„œλ“œκ°€ μ˜€λ²„λΌμ΄λ“œλ˜μ§€ μ•Šλ„λ‘ ν•˜κ³  μ’€λΉ„κ°€ λͺ¨λ‘ 같은 μ†Œλ¦¬λ₯Ό λ‚Έλ‹€κ³  ν•˜λ©΄ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Όν• κΉŒ?

//Zombie 클래슀의 ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό staticν‚€μ›Œλ“œ μ²˜λ¦¬ν•΄μ£Όλ©΄ λœλ‹€.

class Zombie: Monster {
  static func makeSpookyNoise() -> String {
    return "Brains..."
  }
}

static ν‚€μ›Œλ“œλ₯Ό μ§€μ •ν•˜λ©΄ makeSpookyNoise() λ©”μ„œλ“œμ˜ μ„œλΈŒν΄λž˜μŠ€ 버전을 μ œκ³΅ν•˜μ§€ μ•Šκ² λ‹€λŠ” 뜻이 λœλ‹€! static λŒ€μ‹  final classλ₯Ό μ‚¬μš©ν•΄λ„λœλ‹€.

νƒ€μž…λ©”μ„œλ“œμ˜ μˆ˜μ€€ (μ‹œμ•Ό?)

νƒ€μž…λ©”μ„œλ“œλŠ” νƒ€μž… μˆ˜μ€€μ˜ 값을 μ²˜λ¦¬ν•  수 μžˆλ‹€. λ‹€λ₯Έ νƒ€μž…λ©”μ„œλ“œλ₯Ό 호좜 ν•  수 있으며, νƒ€μž… ν”„λ‘œνΌν‹°λ„ μ²˜λ¦¬ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ νƒ€μž…λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ˜ 값을 μ²˜λ¦¬ν•  μˆ˜λŠ” μ—†λ‹€. νƒ€μž…λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œλ₯Ό 호좜 ν•  수 μ—†μœΌλ©°, μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ„ μ²˜λ¦¬ν•  수 μ—†λ‹€. (μΈμŠ€ν„΄μŠ€κ°€ νƒ€μž…λ³΄λ‹€ 더 narrowν•˜κ³  strictν•˜κΈ°λ•Œλ¬Έμ— νƒ€μž… μˆ˜μ€€μ—μ„œ 처리 ν•  수 μ—†μŒ - νƒ€μž… μˆ˜μ€€μ€ μΈμŠ€ν„΄μŠ€κ°€ 없어도 접근이 κ°€λŠ₯ν•œλ° μΈμŠ€ν„΄μŠ€λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ°˜λ“œμ‹œ ν•„μš”ν•˜κΈ° λ•Œλ¬Έ.)

클래슀 vs ꡬ쑰체의 차이점 - 상속

|

상속은 ν΄λž˜μŠ€μ™€ ꡬ쑰체λ₯Ό ꡬ뢄할 λ•Œμ˜ λŒ€ν‘œμ μΈ 차이점이닀.

상속

  • 상속은 ꡬ쑰체와 λ‹€λ₯Έ 클래슀만의 νŠΉμ§•μ΄λ‹€.
  • μƒμ†μ˜ μ˜λ―ΈλŠ” ν•œ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀 μ•ˆμ—μ„œ μ •μ˜λ˜λŠ” 관계λ₯Ό λ§ν•œλ‹€.
  • μ„œλΈŒν΄λž˜μŠ€ / 슈퍼클래슀 : μ„œλΈŒν΄λž˜μŠ€λŠ” 슈퍼클래슀의 ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό μƒμ†ν•œλ‹€.
Monster / Zombie / Town μ˜ˆμ‹œ
//Town struct
struct Town {
    var population = 5_422
    var numberOfStopLights = 4
    
    func printDescription() {
      print("인ꡬ: \(myTown.population)", "κ°€λ‘œλ“± 수: \(myTown.numberOfStopLights)")
    }
  
    mutating func changePopulation(by amount: Int) {
        population += amount
    }
}


//Monster class
class Monster {
    var town: Town?
    var name = "Monster"
    
    func terrorizeTown() {
        if town != nil {
            print("\(name)이 λ„μ‹œλ₯Ό 곡격쀑이닀! ")
        } else {
            print("\(name)은 아직 곡격할 λ„μ‹œλ₯Ό 찾지 λͺ»ν–ˆλ‹€!")
        }
    }
}


//Zombie class
class Zombie {
  var walksWithLimp = true
  
  override func terroizeTown(){
    town?.changePopulation(by: -10)
    super.terrorizeTown()
  }
}

/*
Monsterλ₯Ό 상속받은 ZombieλŠ” Monster의 λͺ¨λ“  ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό μƒμ†λ°›λŠ”λ‹€.
상속받은 λ©”μ†Œλ“œλ₯Ό Zombie λ‚΄μ—μ„œ overrideν•΄μ„œ κΈ°λŠ₯을 더 μΆ”κ°€/λ³€κ²½ν•œλ‹€.
*/

###

TIL_20171108

|

였늘 배운 / λŠλ‚€ 것

  • μ‚¬λ‹€λ¦¬κ²Œμž„ step3 PR / λ¦¬λ·°λ°›μŒ
    • private μ ‘κ·Όμž μ‚¬μš©
    • μ†μ„±μ΄λ‚˜ ν•¨μˆ˜κ°€ μ“°μ΄λŠ” scopeλ₯Ό 잘 νŒŒμ•…ν•΄μ„œ μ ‘κ·Όμ œμ–΄μžλ₯Ό 잘 μ‚¬μš©ν•΄μ„œ μ΅œλŒ€ν•œ λ°©μ–΄μ μœΌλ‘œ μ½”λ”©ν•˜κΈ°!
    • LadderGameκ°μ²΄μ—μ„œ ResultView객체둜[[String]]νƒ€μž… λŒ€μ‹  Boolκ°’μœΌλ‘œ 사닀리 좜λ ₯ κ°’ λ„˜κΉ€
      • μ΅œλŒ€ν•œ μž‘μ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ¦¬νŒ©ν† λ§ν•˜κ³ μž String을 직접 λ„˜κΈ°μ§€ λ§λΌλŠ” λ¦¬λ·°μ˜€λ‹€. μ•žμœΌλ‘œ μ½”λ”©ν• λ•Œλ„ 더 κ°„λ‹¨ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό 덜 μ°¨μ§€ν•˜λŠ” νƒ€μž…μœΌλ‘œ μ½”λ”©ν•˜λŠ” 것을 μŠ΅κ΄€ν™”ν•˜κΈ°!
  • ν”„λ‘œνΌν‹° 곡뢀 (μ–΄λ ΅λ‹€ γ… γ… )
  • ν•¨μˆ˜μ˜ 쀑첩 / guard let으둜 ν•¨μˆ˜ 쀑간에 λΉ μ Έλ‚˜μ˜€κΈ°

μ•žμœΌλ‘œ ν•  것

  • ν΄λ‘œμ €
  • ν”„λ‘œνΌν‹°
  • guard ꡬ문 μ—λŸ¬λ‚¬λ˜ 것 μ§ˆλ¬Έν•˜κ³  μ •λ¦¬ν•˜κΈ°β€‹