๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_20180129 ~ 20180205

|

2018.01.29

  • ์žํŒ๊ธฐ step2 PR๋ณด๋‚ด๊ธฐ
    • step1์ฒ˜๋ฆฌ์ค‘์œผ๋กœ, ๋จธ์ง€๋˜๋ฉด ์ฃผ๋ง์— ์„ค๊ณ„ํ•ด๋†จ๋˜ ๊ฒƒ step2 PR ๋ณด๋‚ผ ์˜ˆ์ •
    • step2 PR :
    • MyDate๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ ๋Œ€์‹ , Date๋ฅผ extensionํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜์ •ํ•จ
      • ํ•˜๋‚˜์˜ ํƒ€์ž…์— ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ํŠน์ • ๋™์ž‘์„ ๋งŒ๋“ค๋•Œ, ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žˆ๋‹ค. (์ƒ์†, extension, ๊ฐ์ฒด ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ) ์ด ์„ธ๊ฐ€์ง€ ์ค‘์— ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์ œ์ผ ์ ์ ˆํ•œ์ง€์—๋Œ€ํ•œ ๋‚˜๋งŒ์˜ ๊ธฐ์ค€์ด ์žˆ์–ด์•ผ ํ•จ!(ํŒ๋‹จ ๊ธฐ์ค€์— ์ฝ”๋“œ๊ฐ€ ๋” ๊ธธ์–ด์ง€๋Š๋ƒ ์งง์•„์ง€๋Š๋ƒ๋Š” ์ค‘์š”ํ•œ ๊ธฐ์ค€์ด ์•„๋‹ˆ๊ณ , ๋งŒ๋“  ์†์„ฑ์ด๋‚˜ ๊ฐ์ฒด๊ฐ€ ๋” ํšจ์œจ์ ์œผ๋กœ ์“ฐ์ด๊ณ ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ์œ„์ฃผ๋กœ ํŒ๋‹จํ•ด์•ผํ•œ๋‹ค.) ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ์—๋Š” MyDate์—์„œ ํฌ๊ฒŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์†์„ฑ๋“ค์„ ๊ฐ–๊ณ ์žˆ๋‹ค. ์ด๋Ÿฐ ํŒ๋‹จ๊ธฐ์ค€์—๋”ฐ๋ผ์„œ extension์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๋” ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ด์—ˆ๋‹ค.

2018.01.30

  • ์žํŒ๊ธฐ step3
    • ์žํŒ๊ธฐ ์„ค๊ณ„ & ๊ธฐ๋Šฅ๊ตฌํ˜„
    • product enum
    • ์žํŒ๊ธฐ์˜ stock ์„ค๊ณ„
    • balance ์„ค๊ณ„

์žํŒ๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ

์žํŒ๊ธฐ์— ์Œ๋ฃŒ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์œผ๋กœ ๋„ฃ์„๋•Œ reduce์‚ฌ์šฉํ•˜๊ธฐ

  1. userInput ๋ฐ›์Œ - ๊ธˆ์•กํˆฌ์ž…
  2. input๊ฐ’์ด ์œ ํšจํ•œ ๊ฐ’์ธ์ง€ ์ฒดํฌํ•˜๊ณ  ํ๋ฆ„์ œ์–ด
  3. ๊ธˆ์•ก ํˆฌ์ž…์€ MoneyUnit์— ํ•ด๋‹นํ•˜๋Š”๊ฐ’๋งŒ ๊ฐ€๋Šฅํ•จ
  4. ์ปจํŠธ๋กค๋Ÿฌ๋Š” MoneyUnit์˜ int๊ฐ’ ๋ฆฌํ„ด
  5. MoneyUnit์˜ Int๊ฐ’์„ ์žํŒ๊ธฐ์˜ ๋ฐธ๋Ÿฐ์Šค์— ์ถ”๊ฐ€
  6. ์žํŒ๊ธฐ ๋ฐธ๋Ÿฐ์Šค์— ์ €์žฅ๋˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธˆ์•ก๋งŒ filteringํ•ด์„œ ์˜ฌ๋ฆฌ๊ธฐ
  • ๋Ÿฐํƒ€์ž…ํƒ€์ž…์ธํฌ๋ฉ”์ด์…˜ - meta type์ด ์ด ํ•œ์ข…๋ฅ˜
  • object identifier ์‚ฌ์šฉ์œผ๋กœ ์Œ๋ฃŒ์ˆ˜ ์žฌ๊ณ  ๋”•์…”๋„ˆ๋ฆฌ ๊ตฌํ˜„

2018.02.01

  • ์žํŒ๊ธฐ step3 ์ง„ํ–‰ (์žํŒ๊ธฐ๋Š” 2/5๊นŒ์ง€ ์ผ๋‹จ ์™„์„ฑํ•˜๊ธฐ)
  • ํ•ด์ปค๋žญํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์–ด๋ณด๊ธฐ(๊ฐ€์žฅ์‰ฌ์šด๋‹จ๊ณ„)
  • ๋ธ”๋กœ๊ทธ ๊ธ€ ๊นจ์ง„ ๊ฒƒ ์ •๋ฆฌ

2018.02.02

  • ์žํŒ๊ธฐ step3 ๊ตฌํ˜„ stockController
    • stock๊ฐ์ฒด์˜ ์—ญํ•  : ๊ตณ์ดํ•„์š”ํ•œ๊ฐ€? ๊ทธ๋ ‡๋‹ค๋ฉด vendingMachine๊ณผ์˜ ๊ด€๊ณ„๋Š”?
    • vendingMachine์— showCase๊ฐ™์€ ์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ?
      • ๋œจ๊ฑฐ์šด ์Œ๋ฃŒ๋ฅผ ๊ณจ๋ž์„๋•Œ / ์ง€๊ธˆ ๋ˆ์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ๋Š” ์Œ๋ฃŒ๋งŒ ํ•„ํ„ฐ๋งํ–ˆ์„๋•Œ showCase์˜ ์ƒํƒœ๊ฐ€ ๊ณ„์† ๋ฐ”๊ปด์•ผํ•˜๋Š” ๊ฒƒ ์•„๋‹๊นŒ
      • ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ showCase์˜ ํ˜•ํƒœ๋Š”?

์งˆ๋ฌธ๊ฑฐ๋ฆฌ Beverage์˜ validate() (Attributes ํ”„๋กœํ† ์ฝœ์˜ ๋ฉ”์†Œ๋“œ)

  // ์Šˆํผํด๋ž˜์Šค
    func validate() -> Bool {
        print("์œ ํšจ๊ธฐ๊ฐ„: \(self.validDuration)")
        return self.manufactured.isOutOfDate(validDuration: self.validDuration)
    }

์„œ๋ธŒํด๋ž˜์Šค์˜ isValid()

  func isValid() -> Bool {
      return super.validate()
  }

์„œ๋ธŒํด๋ž˜์Šค์˜ super.validate()๋•Œ๋ฌธ์— ์Šˆํผํด๋ž˜์Šค์˜ validate() ๋‚ด๋ถ€์˜ self.validDuration๋งŒ ์ž๊พธ ํ˜ธ์ถœ๋จใ… ใ… 

ํ•ด๊ฒฐ ํ›„ ์ƒˆ๋กœ์šด ์ƒ๊ฐ๊ฑฐ๋ฆฌโ€ฆ

  • JKโ€™s Comment: Beverage.validate()์—์„œ ํ•  ์ผ๊ณผ SoftDrink.validate()์—์„œ (๊ฐ์ž ์ž์‹ ์˜ ์†์„ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ) ํ•  ์ผ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด์„ธ์š”
  • ์ƒ์†์€ ๋Œ€์ฒด ์™œ์“ฐ๋Š”๊ฑธ๊นŒ? ์Šˆํผํด๋ž˜์Šค๋Š” ํ• ์ผ์ด ์—†๋‹คใ…ใ….. ์ด๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ ํ”„๋กœํ† ์ฝœ์„ ์“ฐ๋Š”๊ฒŒ ๋‚ซ์ง€ ์ƒ์†์„ ์“ธ ํ•„์š”๊ฐ€ ์—†์—ˆ๋˜๊ฑธ๊นŒ? ์ง€๊ธˆ ๋‚˜์˜ ์„ค๊ณ„๋กœ๋Š” ์ด ์‚ฌ์šฉ๋ฒ•์€ ํ”„๋กœํ† ์ฝœ์— ๊ฐ€๊น์ง€ ์ƒ์†์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜โ€ฆ
  • ์Šˆํผํด๋ž˜์Šค์˜ ์—ญํ•  - ์ง€๊ธˆ ๊ฑฐ์˜ Beverage๋Š” ์—ญํ• ์ด ์—†์Œ!

2018.02.04

TIL

  • ์œ ๋‹›ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด์ƒํ•ด์„œ ๋ฒค๋”ฉ๋จธ์‹ ๊ณผ stockController์˜ ๊ด€๊ณ„๋ฅผ ์กฐ๊ธˆ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    • stockController์™€ ๋ฒค๋”ฉ๋จธ์‹ ์ด ๋ชจ๋‘ [Beverage]๋ฅผ ๋ฐ›์•„์„œ initํ•˜๊ณ , stockController๊ฐ€ ๋”ฐ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พธ๋Š” ๋™์ž‘์„ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ  ๋‚ด๋ถ€์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„์ด๋ฏ€๋กœ, vendingMachine์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Œ > [Beverage]๋กœ ์žํŒ๊ธฐ๋ฅผ initํ•˜๊ณ  ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊ฟ”์„œ stockController๋ฅผ ์ดˆ๊ธฐํ™”
    • vendingMachine์—์„œ, ๊ฒฐ๊ณผ์ ์œผ๋กœ stock์„ ๋ฆฌํ„ดํ•ด์•ผํ•˜๋Š”๋ฉ”์†Œ๋“œ (์œ ํ†ต๊ธฐํ•œ ์ง€๋‚œ ์ œํ’ˆ ์ฒดํฌ, ํ˜„์žฌ๊ธˆ์•ก์œผ๋กœ ๊ตฌ๋งค ๊ฐ€๋Šฅํ•œ ์Œ๋ฃŒ์ˆ˜ ์ฒดํฌ ๋“ฑ๋“ฑ..) ์ด๋Ÿฐ๊ฒŒ stockController๊ฐ€ stock์„ ๊ฐ€์ง€๊ณ ์žˆ๊ณ  stock์„ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋™์ž‘์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค๋ณด๋‹ˆ ์ด์ƒํ•˜๊ฒŒ ์ €๋Ÿฐ ๋ฉ”์†Œ๋“œ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ๋งŒ๋“ค์–ด์กŒ๋‹คโ€ฆ ์ด๋ฅผ stock์„ ๋ฆฌํ„ดํ•˜๋„๋ก ๋งŒ๋“ค๊ฒƒ.

TIL_20180122 ~ 20180128

|

2018.01.22

2018.01.23

  • ์นด๋“œ๊ฒŒ์ž„ step5 PR๋ณด๋‚ด๊ธฐ
    • comparable, equatable enum์— ๊ตฌํ˜„ > rawValue์™€ hashValue๋กœ ๊ตฌํ˜„ํ•จ
    • hands ํด๋ž˜์Šค๋ฅผ PokerHands ์ด๋ฆ„๋ฐ”๊พธ๊ธฐ
    • ํ๋ฆ„์— ๋Œ€ํ•œ ์ƒ์„ธ๊ตฌํ˜„ํ•˜๊ธฐ - ok
  • PR์„ฑ๊ณต!

2018.01.24

  • ์นด๋“œ๊ฒŒ์ž„ step5 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
    • private var denomination ์—๋Ÿฌ - ํด๋กœ์ €์—์„œ denomination์„ ์จ์„œ ์ƒ๊ธด๊ฒƒ์ด์—ˆ์Œ! (ํด๋กœ์ €์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋”˜์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ •ํ™•ํžˆ ๋ชจ๋ฅด๋‹ˆ๊นŒ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธด ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•„์„œ, ์ฐพ๋Š”๋ฐ ์ข€ ์• ๋ฅผ ๋จน์—ˆ๋‹คใ… ใ… )
    • comparable ์‚ฌ์šฉํ•ด์„œ ์นด๋“œ ๋น„๊ต
    • getter๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ํ• ๋•Œ ๋„ค์ด๋ฐ
      • get์„ ์“ฐ์ง€๋ง๋ผ๋Š”๋œป์€ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์— get์„ ์“ฐ์ง€ ๋ง๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ getter๋ฅผ ๋งŒ๋“ ๋‹ค๋Š”๊ฒƒ ์ž์ฒด๊ฐ€ ์†์„ฑ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ด๋– ํ•œ ๋™์ž‘์„ ํ•˜๊ณ  ๋น„๊ต๋ฅผ ํ•œ๋‹ค๋Š” ๋œป์„ ๋‚ดํฌํ•˜๊ณ ์žˆ๊ธฐ๋•Œ๋ฌธ์—, card.isSameSuit()์ฒ˜๋Ÿผ ๋‚ด๋ถ€์—์„œ ๋น„๊ตํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š”๊ฒƒ. ๋‹ค๋งŒ Cardํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•œ comparable ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ hashValue๋‚˜ rawValue์— ์ ‘๊ทผํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ๋˜ํ•œ ์ƒ์œ„๊ฐœ๋…์ธ Cardํด๋ž˜์Šค์—์„œ suit๋‚˜ denomination์˜ ์†์„ฑ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์“ฐ๋Š”๊ฑฐ๋‹ˆ๊นŒ, suit๋‚˜ denomination์†์„ฑ์—์„œ comparable์„ ๊ตฌํ˜„ํ•˜๊ณ  Cardํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์—์„œ .hashValue / .rawValue๋กœ ์ ‘๊ทผํ–ˆ๋˜๊ฒƒ์„ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค. ```Swift // Before // Card.swift func isSameSuit(previous: Card) -> Bool { return self.suit.hashValue == previous.suit.hashValue }

      // After add Comparable to enum suit

      // suit์—์„œ๋Š” hashValue์— ์ ‘๊ทผํ•˜์—ฌ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ํ•ด๋„ ๋จ. enum Suit: String, EnumCollection, Comparable { case heart = โ€œโ™ฅ๏ธโ€ case diamond = โ€œโ™ฆ๏ธโ€ case clover = โ€œโ™ฃ๏ธโ€ case spade = โ€œโ™ ๏ธโ€

      static func <(lhs: CardDeck.Suit, rhs: CardDeck.Suit) -> Bool {
          return lhs.hashValue < rhs.hashValue
      }
      
      static func ==(lhs: CardDeck.Suit, rhs: CardDeck.Suit) -> Bool {
          return lhs.hashValue == rhs.hashValue
      }
      

      // Card.swift func isSameSuit(previous: Card) -> Bool { return self.suit == previous.suit }

      
      ```swift
      // Before
      // Card.swift
      func isContinuous(previous: Card) -> Bool {
        return (self.denomination.rawValue -1) == previous.denomination.rawValue
      }
      // ScoreChecker.swift
      private func isStraight(_ cards: [Card]) -> Bool {
          var count = 0
          for i in 1..<cards.count {
              if cards[i].isContinuous(previous: cards[i-1]){
                  count += 1
              }
          }
          return count >= 4
      }
      
      // After
      // CardDeck.swift
      enum Denomination: Int, CustomStringConvertible, EnumCollection {
          case one = 1, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen
      
          var description: String {
              switch self {
              case .one: return "A"
              case .eleven: return "J"
              case .twelve: return "Q"
              case .thirteen: return "K"
              default: return String(self.rawValue)
              }
          }
      
          // Denomination์—๋„ ์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€์— `rawValue๊ฐ’ - 1`๋กœ ๋น„๊ตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ 
          func isContinuous(previous: CardDeck.Denomination) -> Bool {
              return (self.rawValue - 1) == previous.rawValue
          }
      }
      //Card.swift
      // Card์—์„œ๋Š” denomination์˜ rawValue๊นŒ์ง€ ์ ‘๊ทผํ•˜์ง€์•Š๊ณ ,
      // ScoreChecker์—์„œ ๋„˜๊ฒจ๋ฐ›์€ card๋ฅผ denomination๊นŒ์ง€๋งŒ ์ ‘๊ทผํ•ด์„œ Enum
      // `denomination.isContinuous`์— ์ธ์ž๋ฅผ ๋„˜๊ธด๋‹ค.  
      func isContinuous(previous: Card) -> Bool {
        return self.denomination.isContinuous(previous: previous.denomination)
      }
      
      

2018.01.25

์นด๋“œ๊ฒŒ์ž„ step5 Hands ๊ฐ์ฒด

  • ์†์„ฑ: PokerHands enum, Card(TopCard)
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง„ hands๋ณ„๋กœ TopCard๊ฐ€ ์žˆ์–ด์•ผํ•˜๊ณ , ๊ทธ hands์ค‘์—์„œ๋„ ์ œ์ผ ํฐ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ hands์˜ ํƒ‘์นด๋“œ๋งŒ ์œ ํšจํ•œ์˜๋ฏธ์ž„.
  • ๋”ฐ๋ผ์„œ [PokerHands]๋กœ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ํŠœํ”Œํ˜•ํƒœ๋กœ ํƒ‘์นด๋“œ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋˜๊ฑธ ๋น„๊ตํ•˜๋‹ˆ๊นŒ ๋น„๊ตํ•˜๊ณ  ๋งž๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ํž˜๋“ค์—ˆ๋‹ค.
    • onepair 1๊ฐœ(2ํ•˜ํŠธ), nopair 3๊ฐœ(10ํ•˜ํŠธ,5ํด๋กœ๋ฒ„,6๋‹ค์ด์•„)์ธ 5์Šคํ„ฐ๋“œ์—์„œ onepair์˜ ํƒ‘์นด๋“œ์ธ 2ํ•˜ํŠธ์˜ ๊ฐ€์ค‘์น˜์ ์ˆ˜๊ฐ€ ๊ฐ€์ ธ์™€์ ธ์•ผํ•˜๋Š”๋ฐ nopair์ค‘์˜ ํƒ‘์นด๋“œ์ธ 10์˜ ๊ฐ€์ค‘์น˜์ ์ˆ˜๊ฐ€ ๊ฐ€์ ธ์™€์ ธ์„œ ๊ณ„์‚ฐ๋จ.
  • ์˜๋ฏธ์žˆ๋Š” hands์˜ ํƒ‘์นด๋“œ๋กœ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ• ๋•Œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•œ๋‹ค.
  • ์ ์ˆ˜๊ณ„์‚ฐํ•˜๋Š” ๊ฐ์ฒด์—์„œ๋Š” ๊ธฐ์กด์—[PokerHands]๋กœ ํ•˜๋˜๊ฑธ [Hands]๊ฐ์ฒด๋กœ ๋น„๊ต. comparable๊ตฌํ˜„ํ•ด์„œ [Hands]๋ฅผ sortํ•˜๊ณ  ๊ฐ€์žฅ ํฐ ํŽ˜์–ด(or ํ”Œ๋Ÿฌ์‹œ,์ŠคํŠธ๋ ˆ์ดํŠธ)์˜ ํƒ‘์นด๋“œ๋กœ ์ตœ์ข… ์Šค์ฝ”์–ด์— ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•ด์ค€๋‹ค.
  • ์†์„ฑ์„ ๊ด„ํ˜ธ์— ๋‘๊ฐœ ๋„ฃ์–ด์„œ ๋ฐฐ์—ด๋กœ ๋„ฃ์€๊ฑธ ํ˜•์ƒํ™”ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Œ.
    • hands๋ฐฐ์—ด: [(PokerHands:TopCard),(PokerHands:TopCard),(PokerHands:TopCard)]: ํ•œ์‚ฌ๋žŒ์ด ์ด๋ ‡๊ฒŒ hands๋ฐฐ์—ด์„๊ฐ€์ง€๊ณ ์žˆ๊ณ , ScoreChecker์—์„œ final์ ์ˆ˜๊ณ„์‚ฐํ• ๋•Œ ์ด [hands]๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์‚ฐํ•˜๋ฉด๋ ๋“ฏ. (๋งŒ์•ฝ์— ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋“  ์œ ์ €๊ฐ€ ๋‹ค ๋…ธํŽ˜์–ด์ผ๋•Œ ํƒ‘์นด๋“œ๋กœ ๋น„๊ตํ• ์ˆ˜์žˆ๊ฒŒ๋จ.)
  • ์ „๋ถ€ ๋‹ค ๋…ธํŽ˜์–ด์ธ๊ฒฝ์šฐ๋Š” ์ œ์ผ ํฐ ํƒ‘์นด๋“œ๋ฅผ ๊ฐ€์ง„ ๋…ธํŽ˜์–ด๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. ***
  • ์ŠคํŠธ๋ ˆ์ดํŠธ๋‚˜ ํ”Œ๋Ÿฌ์‹œ์ธ๊ฒฝ์šฐ๋Š”, ํƒ‘์นด๋“œ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋”ฐ๋กœ ๋งŒ๋“ ๋‹ค.
    • hands๊ฐ์ฒด์˜ PokerHands์†์„ฑ์ด ์ŠคํŠธ๋ ˆ์ดํŠธ๋ฉด ์ŠคํŠธ๋ ˆ์ดํŠธ ํŒจ์˜ ํƒ‘์นด๋“œ๋ฅผ ๊ตฌํ•˜๊ณ (์ด๊ฑด ScoreChecker์—์„œ ์ŠคํŠธ๋ ˆ์ดํŠธํ”Œ๋Ÿฌ์‹œ์ฒดํฌํ•˜๋Š”๋ฐ์„œํ•ด์•ผํ•จ)
    • PokerHands์˜ ์†์„ฑ์ด ํ”Œ๋Ÿฌ์‹œ์ด๋ฉด suit์„ ๋น„๊ตํ•ด์„œ ํƒ‘์นด๋“œ๋ฅผ ๊ตฌํ•œ๋‹ค.
      // hands.swift
      if self.PokerHands == .straight {
      card.sorted() // hands๋Š” cards๋ฅผ ๋ชจ๋ฅด๋‹ˆ๊นŒ sort๋Š” ScoreChecker์—์„œ ํ•ด์•ผํ• ์ง€๋„๋ชจ๋ฅด๊ฒ ๋‹ค......................
      }
      
  • ํ…Œ์ŠคํŠธ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ์„ ์•Œ์•˜๋‹ค : TDD์˜ ์ค‘์š”์„ฑ~~~

2018.01.26

  • ์žํŒ๊ธฐstep1
    • ์Œ๋ฃŒ์ˆ˜๋ผ๋ฆฌ ์ƒ์†์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  CustomStringConvertible๊ตฌํ˜„ํ•ด์„œ ์ถœ๋ ฅ
    • Dataํด๋ž˜์Šค ์‚ฌ์šฉ
  • ํ•™์—…๊ณ„ํš์„ ํšจ๊ณผ์ ์œผ๋กœ ์งœ๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค.
    • what: ๊ณต๋ถ€ํ•  ๊ฑฐ๋ฆฌ๋“ค
    • how long: ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด์ง€์˜ˆ์ƒ, ์–ธ์ œ๊นŒ์ง€ ํ• ๊ฑด์ง€
    • how to: ์–ด๋–ป๊ฒŒํ• ๊ฑด์ง€ - ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ• ๊ฑด์ง€์— ๋Œ€ํ•œ ํ™œ๋™๋“ค

2018.01.27

  • ์žํŒ๊ธฐ step1 ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜
    • MyDate๊ฐ์ฒด ์ƒ์„ฑ

2018.01.28

  • ์ผ์š”์ผ - ๋จธ์ง€ ๋˜์ง€ ์•Š์•˜์–ด๋„ ๋ฐฉํ•™์ด ์–ผ๋งˆ ์•ˆ๋‚จ์•˜๊ธฐ์— ๋ฏธ๋ฆฌ ์žํŒ๊ธฐ step2์ง„ํ–‰ํ•จ.

TIL_20180115 ~ 20180121

|

2018.01.15

  • ์นด๋“œ๊ฒŒ์ž„ step3
    • ์ฝ”๋”ฉ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ ์กฐ์‚ฌ : swift.org_API_Guidelines ์ฐธ๊ณ , ์Šคํƒ€์ผ์‰์–ด ์ฝ”๋”ฉ๊ฐ€์ด๋“œ ์ฐธ๊ณ 
    • CardDeck : ์นด๋“œ๋ฑ์— ์นด๋“œ ์—ฌ๋Ÿฌ ์žฅ์„ ํ•œ๊บผ๋ฒˆ์— ๋ฐฐ์—ด๋กœ ๋ฝ‘์•„๋‚ด๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • CardDeck : ์นด๋“œ์Šคํƒ ๊ตฌ์„ฑ - ์‚ฌ์ด์ฆˆ๊ฐ€ 1~7์ธ ์นด๋“œ๋ฐฐ์—ด์„ ๊ฐ€์ง€๋Š” CardStack ๊ตฌ์กฐ์ฒด ๊ตฌํ˜„
  • ๋ฐ˜๋ณต๋ฌธ์„ ์“ธ๋•Œ ์ฃผ์˜ํ•  ์  ! : while 0<index ํ–ˆ๋”๋‹ˆ 0์ด ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  ++๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ, range๋๊นŒ์ง€ ๋‚ด๊ฐ€ ์‹คํ–‰ํ•œ function์ด ๊ณ„์† ์‹คํ–‰๋จ..(์นด๋“œ ์žˆ๋Š”๋Œ€๋กœ 52์žฅ๊นŒ์ง€ ๋‹ค ๋ฝ‘์•„๋†“๊ณ  ๊ทธ ๋‹ค์Œ์— ๋ฝ‘์„๊ฒŒ ์—†์œผ๋‹ˆ๊นŒ ๋””๋ฒ„๊น…๋ชจ๋“œ๋กœ ๋„˜์–ด๊ฐ) ๋ฐ˜๋ณต๋ฌธ์„ ์“ธ๋•Œ ์ฃผ์˜ํ•˜์ž
  • struct์ธ์Šคํ„ด์Šค๋Š” print()๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๊ทธ๋ƒฅ ์ธ์Šคํ„ด์Šค์ด๋ฆ„์ด๋ž‘ ์†์„ฑ์ด ์ถœ๋ ฅ๋œ๋‹ค!(ํด๋ž˜์Šค์™€์˜ ์ฐจ์ด์ ์œผ๋กœ ์ธํ•œ ํŠน์„ฑ์ธ๋ฐ, ์นด๋“œ๊ฒŒ์ž„ ๋ฏธ์…˜ ํ”ผ๋“œ๋ฐฑ wiki์— ์ •๋ฆฌํ•จ)

2018.01.16

  • ์นด๋“œ๊ฒŒ์ž„ step4
    • GameInputView์— ์นด๋“œ์Šคํ„ฐ๋“œ ๋ฉ”๋‰ด ์„ ํƒ ok
    • ํ”Œ๋ ˆ์ด์–ด, ๋”œ๋Ÿฌ ๊ฐ์ฒด ์ƒ์„ฑ ok
    • ์นด๋“œ๊ฐ€ ๋‚จ์€ ๊ฒฝ์šฐ๋Š” ๊ณ„์†ํ•ด์„œ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•˜๊ณ , ์นด๋“œ๊ฐ€ ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ์ข…๋ฃŒํ•œ๋‹ค.
      • ์นด๋“œ์Šคํƒ์€ ์นด๋“œ๋ฑ์„ ๊ฑฐ์ณ์„œ ๋งŒ๋“ค์–ด์ง
      • ํ”Œ๋ ˆ์ด์–ด์™€ ๋”œ๋Ÿฌ๋Š” ์นด๋“œ์Šคํƒ์„ ๊ฐ€์ง - ์นด๋“œ๋ฑ์— ์ ‘๊ทผํ•ด์„œ ์ƒˆ๋กœ์šด ์นด๋“œ์Šคํƒ์„ ๋งŒ๋“ค๊ณ  mutating ok
      • ํ”Œ๋ ˆ์ด์–ด์™€ ๋”œ๋Ÿฌ๋ฅผ ์ƒ์†๊ด€๊ณ„๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ
        • super.init()์‚ฌ์šฉ
      • ์นด๋“œ๋ฑ์—์„œ ์Šคํƒ ๋งŒ๋“ค๋ฉด ๋‚จ์€ ์นด๋“œ ์ˆ˜ ๋ช‡์žฅ์ธ์ง€ ํ™•์ธ - ok
  • step4 pr๋ณด๋ƒ„!
  • step3 ํ”ผ๋“œ๋ฐฑ ์ •๋ฆฌ
  • ํ˜„๊ณผ ์ง์ฝ”๋”ฉ
  • ๋ฉ”ํƒ€ํƒ€์ž… : ํƒ€์ž… ์ž์ฒด๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋น„๊ตํ•  ๊ฒฝ์šฐ ๋ฉ”ํƒ€ํƒ€์ž…์„ ์“ด๋‹ค - ํƒ€์ž… ์ž์ฒด๋„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐœ๋…์—์„œ ์ƒ๊ฐ์„ ์ถœ๋ฐœํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€/ํƒ€์ž…์ž์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ ์”€ (Any.Type๊ฐ™์€ Any์˜ ๋ฉ”ํƒ€ํƒ€์ž…์€ ์˜๋ฏธ๊ฐ€ ์—†์Œ)

2018.01.17

  • ์นด๋“œ๊ฒŒ์ž„ 3ํ”ผ๋“œ๋ฐฑ ์ •๋ฆฌ
  • ์นด๋“œ๊ฒŒ์ž„ 4 ๋ฐ์ผ๋ฆฌ README์ •๋ฆฌ ok
  • ์นด๋“œ๊ฒŒ์ž„ main๊ฐœ์„ 
  • ์นด๋“œ๊ฒŒ์ž„ ํ”ผ๋“œ๋ฐฑ(์˜ค๋ฉด)์ฒ˜๋ฆฌ ok
  • ์นด๋“œ๊ฒŒ์ž„ 2ํ”ผ๋“œ๋ฐฑ (enum collection๋ถ€๋ถ„)์ •๋ฆฌ

2018.01.18

  • ์นด๋“œ๊ฒŒ์ž„ step3 ํ”ผ๋“œ๋ฐฑ wiki ok
  • ์นด๋“œ๊ฒŒ์ž„ step4 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ ok
    • play() ํ๋ฆ„์ œ์–ด ์งˆ๋ฌธ ํ›„ ์ˆ˜์ • - controller๋กœ ๋กœ์ง ์ˆจ๊ธฐ๊ธฐ.ok
    • init? / init throws ์ˆ˜์ • - init throws๋กœ ์ˆ˜์ •ok
    • ์ƒ์†์ผ๋•Œ private property - private(set)์œผ๋กœ ๋ณ€๊ฒฝok
  • ์นด๋“œ๊ฒŒ์ž„ 2 ํ”ผ๋“œ๋ฐฑ EnumCollection ๋ถ€๋ถ„ wiki์— ์ •๋ฆฌ
  • ์นด๋“œ๊ฒŒ์ž„ step4 ๋จธ์ง€!
    • ์ข…๋ฃŒ์กฐ๊ฑด์€ input์ดํ›„ ์ƒ์œ„๋ชจ๋“ˆ์—์„œ ํŒ๋‹จ
    • ์ƒ์œ„๋ชจ๋“ˆ์—์„œ ๊ฐ’๋งŒ ๊ฐ€์ง€๊ณ  ์™€์„œ ์ผ์„ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด์—๊ฒŒ ์ผ์„ ์‹œํ‚จ๋‹ค : A๊ฐ์ฒด์˜ a์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ํ•ด์•ผ๋˜๋Š” ์ผ์„ ์ง€๊ธˆ์€ ์ƒ์œ„๋ชจ๋“ˆ์— a์†์„ฑ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์ผ์„ํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋Š”๋ฐ, ์ƒ์œ„๋ชจ๋“ˆ์ด A๊ฐ์ฒด์—๊ฒŒ โ€˜๋„ˆ๊ฐ€ ์ด๋Ÿฌ์ด๋Ÿฌํ•œ ์ผ ํ•ด์„œ ์•Œ๋ ค์ค˜โ€™๋ผ๋Š” ์‹์œผ๋กœ callํ•ด์•ผํ•จ. ์ด์ „ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์†ํ•˜๋ฉด ์ƒ์œ„๋ชจ๋“ˆ์˜ ๋กœ์ง์ด ์ ์ ๊ธธ์–ด์ง€๊ธฐ๋งŒํ•จ!
  • ๋จธ์ง€ ์„ฑ๊ณต!
  • Controller๊ฐ€ ํ•˜๋Š” ์ผ์„ Dealer๊ฐ€ํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ , Dealer๊ฐ€ Deck์„ ๊ฐ€์ง€๋Š”๊ฒŒ ์ผ๋ฐ˜์ (ํ˜„์‹ค์„ ์ž˜ ๋ฐ˜์˜ํ•œ)๊ตฌ์กฐ!

2018.01.19

TODO

  • ์นด๋“œ๊ฒŒ์ž„ step5 PR๋ณด๋‚ด๊ธฐ
    • ํฌ์ปค ์ ์ˆ˜๊ณ„์‚ฐ
      • enum value๋“ค sorted
      • card์˜ ์†์„ฑ์— ๋”ฐ๋ผ์„œ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•จ
    • sleep๊ธฐ๋Šฅ ๊ณต๋ถ€ํ•˜๊ณ  ์ถ”๊ฐ€
  • PR๋ณด๋‚ด๊ณ  ์‹œ๊ฐ„ ๋‚จ์œผ๋ฉด ์นด๋“œ๊ฒŒ์ž„ step4

  • sleep() : ์ฝ˜์†” ์ถœ๋ ฅ์— sleep ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ ResultData๋ฅผ ์“ธ ์ผ์ด ์—†๊ณ  ๋ฐ”๋กœ for๋ฌธ ์•ˆ์—์„œ ์ถœ๋ ฅํ•˜๊ฒŒ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋˜๋Š”(๊ฒŒ ์•„๋‹ˆ์—ˆ์Œ)
  • ์ง‘์ค‘์‹คํŒจ๋กœ PR์‹คํŒจโ€ฆํ•˜๋ฃจ์— PR ๋‘๊ฐœ๋ณด๋‚ด๋Š” ๋ฉค๋ฒ„๋“ค ๋ฆฌ์ŠคํŽ™โ€ฆ ์ง‘์ค‘ํ•˜์ž ใ… ใ… ใ… 
  • ์นด๋“œ๊ฒŒ์ž„ step4 ํ”ผ๋“œ๋ฐฑ ์ •๋ฆฌ
  • ํฌ์ปค ์ ์ˆ˜๊ณ„์‚ฐ ์‚ดํŽด๋ด„

2018.01.21

  • ์นด๋“œ๊ฒŒ์ž„ step5
    • enum value sorted
    • hands: ์ ์ˆ˜๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์„ ์–ธํ•ด๋†“๊ธฐ์œ„ํ•œ enum๋งŒ๋“ค๊ธฐ
    • sleep๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ฐœ์„  - ํ•œ ์žฅ์”ฉ ๋Œ๋ ค๊ฐ€๋ฉด์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋งŒ๋“ค๊ธฐ
      • ํ”Œ๋ ˆ์ด์–ด์™€ ๋”œ๋Ÿฌ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ๋ฐ”๋กœ DTO๋งŒ๋“ค์–ด์„œ ํ•œ๋ฒˆ์— ์ถœ๋ ฅํ•˜๋ฉด ์•ˆ๋จ
      • ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ถœ๋ ฅํ•ด์•ผํ•จ
  • controller์˜ play()
    • ๊ฒŒ์ž„ ๊ฐ€๋Šฅ
      • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ž…๋ ฅํ•œ ์Šคํ„ฐ๋“œ์™€ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜ ๋งŒํผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™” ok
      • ํ…Œ์ด๋ธ”์€ ์Šคํƒ๋“ค์„ ๊ฐ€์ง€๊ณ ์žˆ๊ณ  ๊ทธ ์Šคํƒ์œผ๋กœ ๊ฒฐ๊ณผ๊ณ„์‚ฐ
      • ํ…Œ์ด๋ธ”์ด ์Šคํƒ.๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ ์ž‡์Œ
      • ์•„์›ƒํ’‹๋ทฐ๋Š” ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์ถœ๋ ฅํ•จ ok
    • ๊ฒŒ์ž„ ๋ถˆ๊ฐ€๋Šฅ(์นด๋“œ๋ชจ์ž๋žŒ)
      • ๋ชจ์ž๋ผ์„œ ์ข…๋ฃŒํ•˜๋Š” ๋ฉ”์‹œ์ง€์ถœ๋ ฅ ok
  • ์นด๋“œ๊ฒŒ์ž„ ๋ฏธ์…˜ ์ง„ํ–‰(๊ฐœ์„ )
    • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ž…๋ ฅํ•œ ์Šคํ„ฐ๋“œ์™€ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜ ๋งŒํผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™” ok
    • sleep๊ธฐ๋Šฅ์€ ํ•œ ๋ช…์˜ ์Šคํƒ์ด ํ•œ ์žฅ์”ฉ ์‹œ๊ฐ„์ฐจ๋ฅผ ๋‘๊ณ  ์ถœ๋ ฅ๋˜๋“ฏ์ด ๋‚˜์˜ด
    • ์นด๋“œ๊ฒŒ์ž„ ํ…Œ์ด๋ธ” ๊ฐ์ฒด ์ƒ์„ฑ
    • ์นด๋“œ๊ฐ€ ๋ชจ์ž๋ผ์„œ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋Š”

TIL_20180108 ~ 20180113

|

2018.01.08 todo

  • JSON step6 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ / ๋งˆ๋ฌด๋ฆฌ
    • main ํ๋ฆ„์ œ์–ด
      • while๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  catch๋ธ”๋Ÿญ์—์„œ break๋ฅผ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ์ƒํ™ฉ์—์„œ์˜ ํ๋ฆ„์ œ์–ด๋Š” ํ–ˆ์ง€๋งŒ, ๋งˆ์ง€๋ง‰์— ์ •์ƒ์ ์ธ ์ผ€์ด์Šค์ผ๋•Œ break๋ฅผ ์•ˆ๋„ฃ์–ด์„œ ์™„์ „ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ์•„์„œโ€ฆ๊นœ์ง๋†€๋ž๋‹ค. : while์„ ์“ฐ๋ฉด ๊ผญ ๋งˆ์ง€๋ง‰๋กœ์ง๊นŒ์ง€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋์„๋•Œ๋„ break๋ฅผ ๋„ฃ์–ด์„œ ํ๋ฆ„ ์ œ์–ด๋ฅผ ํ•˜์ž!
    • inputView์˜ readFile(): ์žฌ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋Š”๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ - ok
    • OutputView์˜ showResult()ํ•จ์ˆ˜์—์„œ ํ•„์š”์—†๋Š” ์ธ์ž
      • main์ด ๋ณต์žกํ•ด์ง€๋”๋ผ๋„, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ switch๋ฌธ์„ ์จ์„œ ๋ฌด์–ธ๊ฐˆ ํŒ๋‹จํ•˜๊ณ  ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์•ผํ•˜๋Š” ๋กœ์ง์ด ์žˆ์œผ๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ๋งŒ๋“œ๋Š”๊ฒŒ ๋” ์ค‘์š”ํ•จ. ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” main์—์„œ outputType(console or make file)์„ ์•Œ๊ณ ์žˆ์œผ๋‹ˆ, OutputView์—์„œ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋งŒ ๋ถ€๋ฅด๋Š”๊ฑธ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์„œ main์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ฒŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ main์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ”๋กœ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๊ฒŒ ๋” ์‹ฌํ”Œํ•˜๊ณ  ์•Œ์•„๋ณด๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ์ž„.
      • showResult() ์ง€์šฐ๊ณ  resultMessage์ƒ์„ฑ, console์— ๊ฒฐ๊ณผ ์ถœ๋ ฅ, ํŒŒ์ผ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ file๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋กœ ์ž˜๊ฒŒ ๋‚˜๋ˆ„๊ณ  outputType์— ๋”ฐ๋ผ
  • JSON ํ”ผ๋“œ๋ฐฑ ์ •๋ฆฌ
  • ํด๋ฆฐ์ฝ”๋“œ ์ฑ…์ฝ๊ธฐ
  • HIG ๋ฐœํ‘œ๋“ค์Œ! : ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€์œผ๋กœ
    • HCI๋ถ„์•ผ : ๋งฅํ‚จํ† ์‹œ ํ™”๋ฉด์ด ์ฝ˜์†”์—์„œ ํ™”๋ฉด(UI)์œผ๋กœ ๋„˜์–ด๊ฐˆ๋•Œ ์‹ฌ๋ฆฌํ•™์ž์™€ ํ•จ๊ป˜, ์ผ์ƒ ์ƒํ™œ์— ์žˆ๋Š” ๋™์ž‘๋“ค์„ ์ ์šฉํ•ด์„œ ์ปดํ“จํ„ฐ์— ์‹คํ˜„ํ–ˆ๋‹ค. ์ด๋Ÿฐ ์—ฐ๊ตฌ๋ฅผ ํ•˜๋ฉด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ถ„์•ผ๊ฐ€ HCI๋ถ„์•ผ
    • ๋””์ž์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋ฐ”๊พธ๋ฉด ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์•ฑ ์•„์ด์ฝ˜์ด ๋‚˜์˜ด
    • ํ˜ผ์ž ๊ณต๋ถ€ํ• ๊ฑฐ๋ฉด ์• ํ”Œ ์•ฑ์„ ๋˜‘๊ฐ™์ด ๋งŒ๋“ค๋„๋ก ๋…ธ๋ ฅ. ๊ทธ๊ฒƒ๋งŒ ์ž˜ ๋งŒ๋“ค๋ฉด ๋ ˆ๋ฒจ3๋Š” ๋„˜๋Š” ์‹ค๋ ฅ์ด ๋ ๋“ฏ

TIL

  • JSON step6 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
    • ์—๋Ÿฌํ•ธ๋“ค๋ง / ํ๋ฆ„์ œ์–ด : ๋‚˜์˜ ๊ฒฝ์šฐ๋Š” main์— while๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์„œ catch๋ฌธ ์•ˆ์— break์„ ์จ์„œ ํ๋ฆ„ ์ œ์–ด๋ฅผ ํ–ˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰์— ์ •์ƒ์ ์ธ ์ผ€์ด์Šค์ผ๋•Œ break๋ฅผ ์•ˆ๋„ฃ์–ด์„œ ์™„์ „ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ์•„์„œโ€ฆ๊นœ์ง๋†€๋ž๋‹ค. : while์„ ์“ฐ๋ฉด ๊ผญ ๋งˆ์ง€๋ง‰๋กœ์ง๊นŒ์ง€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋์„๋•Œ๋„ break๋ฅผ ๋„ฃ์–ด์„œ ํ๋ฆ„ ์ œ์–ด๋ฅผ ํ•˜์ž!
    • ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ: ํ•จ์ˆ˜๋Š” ์–ด๋–ค ์œ„์น˜์—์„œ๋“  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๋„๋ก ๋…ธ๋ ฅํ•˜๊ธฐ.
      • ๋งŒ์•ฝ ํ•จ์ˆ˜ ๋‚ด์—์„œ switch-case๋ฅผ ์จ์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋น„๊ตํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ์‹ฌ์ง€์–ด ๋ชจ๋“  ์ผ€์ด์Šค์—์„œ ํ•„์š”์—†๋Š” ์ธ์ž๊นŒ์ง€ ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ ์žˆ๋‹ค๋ฉด ๋ญ”๊ฐ€ ์ž˜๋ชป๋œ ํ•จ์ˆ˜ ์ž„์„ ์ธ์ง€ํ•ด์•ผํ•œ๋‹ค!
      • ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์‹ฌํ”Œํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด, ์˜คํžˆ๋ ค main์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ง€๋ผ๋„ ํ˜ธ์ถœ-๋ฆฌํ„ดํ•˜๋Š” ๊ด€๊ณ„๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ์ง€๊ธˆ์€ ๊ฐ์ฒด ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•ด์ง€๋Š”๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค!
  • ๋‹ค๋ฅธ ๋ฉค๋ฒ„๋“ค์˜ HIG๋ฌธ์„œ์—๋Œ€ํ•œ ๋ฐœํ‘œ๋ฅผ ๋“ค์—ˆ๋‹ค. (HIG: Human Interface Guidelines, ๋””์ž์ธ ๊ทœ์น™์„ ์„ค๋ช…ํ•˜๊ณ , ์ž‘์—… ๋™์ž‘์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๊ธฐ๋Šฅ์ ์ธ ์„ค๋ช…์„ ํ†ตํ•ด ์•ฑ ๊ฐœ๋ฐœ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ) ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ ์ค‘์— ์˜์™ธ๋กœ ๋งŽ์€ ์•ฑ๋“ค์ด ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ž˜ ์ง€ํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์‚ฌ์‹ค ํ•„์ˆ˜์ ์ธ ์š”์†Œ๋งŒ ์ง€ํ‚ค๋ฉด ์• ํ”Œ์Šคํ† ์–ด์— ์˜ฌ๋ผ๊ฐ„๋‹ค๋Š”๋ฐ, ๋‚˜๋Š” ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ  ์ง€์ผœ์„œ ์ •๋ง iOS๋‹ค์šด ์•ฑ์„ ๋งŒ๋“ค๊ณ ์‹ถ๋‹ค. ๋นจ๋ฆฌ ์•ฑ ๋งŒ๋“ค๊ณ ์‹ถ๋‹ค!

2018.01.09 TODO

  • JSON step6 ํ”ผ๋“œ๋ฐฑ ๋งˆ๋ฌด๋ฆฌ
  • ๋จธ์ง€๋˜๋ฉด ์นด๋“œ๊ฒŒ์ž„
  • ์—๋Ÿฌํ•ธ๋“ค๋ง/ํ๋ฆ„์ œ์–ด ์˜ˆ์‹œ ์ฐพ์•„๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๊ธฐ
  • ํด๋ฆฐ์ฝ”๋“œ์ฝ๊ธฐ
  • JSON๋ฏธ์…˜๊ณผ์ • wiki์— ์ •๋ฆฌ TIL
  • ํด๋ฆฐ์ฝ”๋“œ ์กฐ๊ธˆ ์ฝ์Œ
  • JSON ์™„๋ฃŒ!
  • ์นด๋“œ๊ฒŒ์ž„ ์ง„์ž…
    • ์†์„ฑ์— ๋Œ€ํ•ด description - getํ”„๋กœํผํ‹ฐ / NSObject : ๊ตฌ์กฐ์ฒด๋ฅผ CustomStringConvertible ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด description์†์„ฑ์„ ์ถœ๋ ฅํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด CardDeck.Suit.heart ๋Œ€์‹  .heart ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ : ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ enumํƒ€์ž…์œผ๋กœ ๋ช…์‹œํ–ˆ๋‹ค๋ฉด, .heart์ฒ˜๋Ÿผ enum์ผ€์ด์Šค๋งŒ ์ž‘์„ฑํ•ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ์œ ์ถ”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค!

2018.01.10 TIL

  • ์นด๋“œ๊ฒŒ์ž„ ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
  • JSON๋ฏธ์…˜ step2 ํ”ผ๋“œ๋ฐฑ
  • ํด๋ฆฐ์ฝ”๋“œ์ฝ๊ธฐ

2018.01.11 TODO

  • ์นด๋“œ๊ฒŒ์ž„ step1 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
  • ์นด๋“œ๊ฒŒ์ž„ step2 ์‹œ์ž‘
  • JSON step2 ํ”ผ๋“œ๋ฐฑ
    • ์ฝ”๋“œ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ ํ”ผ๋“œ๋ฐฑ : Before Code review > After Code review
    • ์ƒˆ๋กญ๊ฒŒ ์ ์šฉํ–ˆ๋˜ ๊ฐœ๋… ์ •๋ฆฌ

2018.01.12 TODO

  • ์นด๋“œ๊ฒŒ์ž„ step2 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ -> ๋‹ค์Œ๋‹จ๊ณ„๋กœ!
    • ์นด๋“œ๊ฒŒ์ž„ README์—…๋ฐ์ดํŠธ
  • JSON step2 ํ”ผ๋“œ๋ฐฑ
  • ํด๋ฆฐ์ฝ”๋“œ์ฝ๊ธฐ

TIL

  • ์นด๋“œ๊ฒŒ์ž„ PR๋ณด๋ƒ„

CardGame README

  • userInput์„ enum์œผ๋กœ ๊ด€๋ฆฌ. let v = menuInput(rawValue: "1") : enum์˜ rawValue๋ฅผ ๋„ฃ์œผ๋ฉด ๊ทธ ์ผ€์ด์Šค์— ํ•ด๋‹นํ•˜๋Š” menuInput.one์ด ๋งŒ๋“ค์–ด์ง€๋Š”๊ฒƒ! ๋Œ€์‹  ์ด ๋ฐฉ๋ฒ•์€ v๊ฐ€ menuInput?์œผ๋กœ ์˜ต์…”๋„๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ๋•Œ๋ฌธ์— ์˜ต์…”๋„์„ ํ’€์–ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ๋„ ํ•จ. ์•„๋ž˜์˜ ๋ฐฉ๋ฒ• ์ฐธ๊ณ 
    enum gameMenu: String {
          case one = "1"
          case two = "2"
          case three = "3"
          case quitGame = "q"
          case wrongInput
      }
      // ์ด๋ ‡๊ฒŒ wrongInput์ฒ˜๋Ÿผ rawValue๋ฅผ ๋„ฃ์ง€์•Š์€ ์ผ€์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค!
    
      func select(rawValue: String) -> gameMenu {
          if let inputMenu = gameMenu(rawValue: rawValue) {
              return inputMenu
          }
          else {
              return .wrongInput
          }
      }
    

enum์˜ rawValue๋ฅผ ์ด์šฉํ•ด์„œ ๊ทธ enum์˜ ํŠน์ •ํ•œ ์ผ€์ด์Šค(rawValue์™€ ์ผ์น˜ํ•˜๋Š”)๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Œ. ํŠนํžˆ switch-case๋กœ ๋น„๊ตํ• ๋•Œ enum์„ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ input์„ ์ œํ•œํ•œ๋‹ค๋Š” ์˜๋ฏธ๋„ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋น ์ง„ ์ผ€์ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์–ดํ•˜๋Š”๋ฐ์—๋„ ์šฉ์ดํ•œ ๋ฉด์ด ์žˆ์Œ.

  • EnumCollection ์ถ”๊ฐ€ - static let allValue๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  enum case๋ฅผ collection์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์ ์šฉ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

  • showCard()์™€ resultMessage() ํ•ฉ์นจ


JSON์—์„œ ๋ฐฐ์šด ๊ฒƒ

  • ํ”„๋กœํ† ์ฝœ์„ ์ธ์ž๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ / ํ”„๋กœํ† ์ฝœ๋กœ ์ถ”์ƒํ™”ํ•˜๋Š”๊ฒƒ
  • enum์˜ ์—ฐ๊ด€๊ฐ’์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ํƒ€์ž…๋“ค์„ ๋ฌถ์–ด๋†”์„œ
  • Array / object ์ค‘์ฒฉ๋„ (์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ?)๊ฐ™์ด ํ•ด๊ฒฐํ• ์ˆ˜์žˆ์—ˆ๋‹ค.
  • ๋กœ์ง - DTO - ๋กœ์ง DTO
  • Input - Grammar - Parser - (ConvertTarget[String] - DataTypeConverter) - ValueCounter - 1. CountInfo 2. ResultData - OutputView
    1. ResultData๋Š” JSONData์˜ ์ฝœ๋ ‰์…˜ ์•ˆ์˜ ๊ฐ’๋“ค์„ ํ•˜๋‚˜์”ฉ ๋‹ค ๊ฐ€์ ธ์˜ค๋ฉด์„œ String์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•จ. ๊ทผ๋ฐ ์ด๊ฒƒ๋„ ํ”„๋กœํ† ์ฝœ๋กœ ๋นผ์„œํ• ์ˆ˜์ž‡์„๊ฑฐ๊ฐ™์Œ
  • ํ๋ฆ„์ œ์–ด๊ฐ€ ๋ฌธ์ œ

enum JSONData { case IntegerValue(Int) case StringValue(String) case BoolValue(Bool) case ObjectValue(Dictionary<String, JSONData>) case ArrayValue([JSONData]) }

2018.01.13

  • JSONParser๋ฏธ์…˜ ํšŒ๊ณ !!
  • ์นด๋“œ๊ฒŒ์ž„ step3 ํ”„๋ฆฌ๋ทฐ

TIL_20180102 ~ 20180105

|

2018.01.02

TIL
  • JSON step4 merge
  • JSON step5 ์ง„ํ–‰
    • JSON ํ”„๋ฆฐํŠธ ํ˜•ํƒœ ํ™•์ธ - JSONLint
    • JSON ์ค‘์ฒฉ๋ฐฐ์—ด๊ณผ ์–ด๋ ˆ์ด ํ˜•ํƒœ๋ฅผ ์–ด๋””์„œ๋ถ€ํ„ฐ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š”์ง€ ์„ค๊ณ„

2018.01.03 ~ 04

TIL
  • JSON step5 PR
    • ์ถœ๋ ฅํ• ๋•Œ ๋‚˜์˜ค๋Š” optional ์ฒ˜๋ฆฌ : enum์˜ ์—ฐ๊ด€๊ฐ’
    • ์—ฐ๊ด€๊ฐ’์ด ๋‚˜์˜ค๋Š”๊ฑธ CustomStringConvertibleํ•ด์„œ ์—ฐ๊ด€๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด String(describing:) ํ•ด์„œ ์ŠคํŠธ๋ง์œผ๋กœ ๊ทธ ๊ฐ’์ด ๋„˜์–ด์˜ด!
  • JSON๋ฏธ์…˜ ํ•˜๋ฉด์„œ ์ƒˆ๋กœ ์•Œ์•˜๋˜ ๊ฐœ๋…๋“ค, ์‚ฌ์šฉ๋งŒ ํ•˜๊ณ ๋„˜์–ด๊ฐ”๋˜ ๋‚ด์šฉ๋“ค ์ •๋ฆฌ
  • ๋”•์…”๋„ˆ๋ฆฌ์˜ ๋ฐธ๋ฅ˜ ๊ฐ’์€ ํ•ญ์ƒ ์˜ต์…”๋„!
  • github wiki ์‚ฌ์šฉ - ๋ฏธ์…˜, ํ”ผ๋“œ๋ฐฑ ๋‚ด์šฉ ์ •๋ฆฌ์šฉ

2018.01.05

TIL
  • JSON step6 ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
    • try! ํ•˜๋Š” ๋ถ€๋ถ„ ์—๋Ÿฌ/ํ๋ฆ„์ œ์–ด ์ฒ˜๋ฆฌ : ํŒŒ์ผ ์•ˆ์˜ ๋‚ด์šฉ์ด ๋ฌธ๋ฒ•์— ๋งž์ง€ ์•Š๊ฑฐ๋‚˜ ๋นˆ ํŒŒ์ผ(๊ธ€์”จ๊ฐ€ ์—†๋Š” ํŒŒ์ผ)์ด๋ฉด GrammarChecker์—์„œ ๊ฑธ๋Ÿฌ์ ธ์„œ ํ๋ฆ„ ์ œ์–ด๊ฐ€ ๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ํŒŒ์ผ์ด ์—†์„๋•Œ์˜ ํ๋ฆ„์ œ์–ด๊ฐ€ ๋ฌธ์ œ์˜€๋‹ค.
    • filepath๋ฅผ Bundle๊ณผ FileManager์—์„œ ์ฝ์–ด์˜ค๋Š”๊ฒƒ ์ฐจ์ด - ๋ฒˆ๋“ค๊ณผ ํŒŒ์ผ๋งค๋‹ˆ์ €์˜ ์ฐจ์ด
    • ๊ฐ์ฒด์˜ ์˜์กด์„ฑ (commandLine / askUserInput) : askUserInput() ํ•จ์ˆ˜์—์„œ CommandLine๊ฐ์ฒด ๋‚ด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋Š” askUserInput์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๊ณ , ํ…Œ์ŠคํŠธ๋„ ํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ์ž„.
      • CommandLine ๋‚ด์˜ ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์„ askUserInput์˜ ์ธ์ž๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋” ์ข‹์€๊ตฌ์กฐ!
      • ํ•ญ์ƒ ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์˜์กดํ•˜๋Š” ํ๋ฆ„์„ ๊ฒฝ๊ณ„ํ•ด์•ผํ•œ๋‹ค!
  • JSON step6
  • ํ๋ฆ„์ œ์–ดํ•˜๋‹ค๊ฐ€ ์ˆ˜์ •ํ•˜๋‹ค๊ฐ€ debug๋ถ€๋ถ„์—์„œ ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์ง€๊ฐ€ ์•Š์•˜๋‹ค. ์–ด๋””์„œ ์—๋Ÿฌ๊ฐ€๋‚œ๊ฑด์ง€๋„ ๋ชจ๋ฅธ์ฑ„ ํ”„๋ฆฐํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐ์œผ๋ฉด์„œ ๋”ฐ๋ผ๊ฐ€๋‹ค๊ฐ€โ€ฆใ… ใ… ๊ฒฐ๊ตญ grammar, input, resultData๊นŒ์ง€ ๊ฐ€์„œ ํ”„๋ฆฐํŠธ๋ฅผ ์ฐ์–ด๋ดค๋‹ค!!!!!!!!!!!!!!!!1 ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ input.jsonํŒŒ์ผ์„ ์—ด์—ˆ๋Š”๋ฐ ์—”ํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ์—ˆ๋‹ค. ์ด์ƒํ–ˆ๋‹ค!!!!!!!!!! ๋„ˆ๋ฌด์ด์ƒํ•ด์„œ ํ…์ŠคํŠธํŽธ์ง‘๊ธฐ์—์„œ jsonํŒจํ„ด์„ ์จ๋ณด๊ณ  ์ €์žฅํ–ˆ๋Š”๋ฐ!!!!!!!!!!!! ๊ฒฐ๊ตญ ์•„ํ†ฐ์ด ๊ธ€์„ ์ €์žฅํ•˜๋ฉด์„œ ์—”ํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ ์ €์žฅ์„ํ–ˆ๋˜๊ฒƒ์ด์•ผ!!!!!!!!!!!!!!!!๊ทธ๋ž˜์„œ ์•ˆ๋๋˜๊ฒƒ์ด๋‹ค!!!!!!!!!!! ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… ๋ฉ˜๋ถ•
  • ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ (ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ์•ˆ๋ผ์„œ ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ์ค„์•Œ๊ณ  step6 PR๋ณด๋‚ธ ์ฝ”๋“œ ๋ณต๋ถ™ํ•จ) ์ˆ˜์ •ํ•˜๋‹ค ๋งŒ ์ƒˆ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋Œ์•„๊ฐ€๊ธฐ๋Š” ํ–ˆ์—ˆ๋˜ ํ”ผ๋“œ๋ฐฑ ๋‹น์‹œ์˜ ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐˆ๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ทธ๋ƒฅ ์ˆ˜์ •ํ•˜๋‹ค ๋งŒ ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ”๋‹ค. (git reset โ€“hard ์˜ต์…˜์”€โ€ฆ)
    • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž˜์“ฐ์ž ์ปค๋ฐ‹๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ์“ฐ์ž!!

์งˆ๋ฌธ๊ฑฐ๋ฆฌ

  • guard ์˜ต์…”๋„์ฒด์ด๋‹. case1๊ณผ case2์˜ ์ฐจ์ด! ```swift // case 1

let userInput = inputView.askUserInput(message: โ€œ๋ถ„์„ํ•  JSON ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜์„ธ์š”.โ€) guard userInput != nil else { throw GrammarChecker.FormatError.invalidInput } commandLineInput = (input: userInput, output: โ€œโ€) // userInput์ด ๊ณ„์† String?์œผ๋กœ ์ธ์‹

// case 2 let userInput = inputView.askUserInput(message: โ€œ๋ถ„์„ํ•  JSON ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜์„ธ์š”.โ€) guard let inputString = userInput else { throw GrammarChecker.FormatError.invalidInput } commandLineInput = (input: inputString, output: โ€œโ€) //inputString์ด String์œผ๋กœ ์ธ์‹!

```