CS193P

[iOS] ์Šคํƒ ํฌ๋“œ CS193P 1๊ฐ•

Beck 2021. 8. 10. 23:58

 

๐Ÿ“ฑ iOS์— ๋Œ€ํ•œ ์†Œ๊ฐœ

์ˆ˜์—…์€ Why are they cool? ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

์ƒํˆฌ์ ์œผ๋กœ "iOS์˜ ํŠน์ง•์ด ๋ฌด์—‡์ธ๊ฐ€"๊ฐ€ ์•„๋‹ˆ๋ผ iOS๊ฐ€ ์–ผ๋งˆ๋‚˜ cool ๐Ÿ˜Ž ํ•œ์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ์ ์ด ํŠน์ดํ•˜๋‹ค.

 

Real-life Object-Oriented Programming

๋‹ค๋ฅธ OOP, ์ž๋ฃŒ๊ตฌ์กฐ ๋“ฑ์˜ ์ „๊ณต๊ณผ๋ชฉ๊ณผ ๋‹ฌ๋ฆฌ Real-life์—์„œ ์“ฐ์ด๋Š” ๊ฐœ๋ฐœ์„ ๊ฐ•์˜ํ•ด์ค€๋‹ค๊ณ  ์†Œ๊ฐœํ•œ๋‹ค. ์ œ ํ•™๊ต์—๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐ•์˜๋Š” ์žˆ์ง€๋งŒ iOS ๊ฐ•์˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•„์‰ฌ์› ๋Š”๋ฐ ์—ญ์‹œ ์Šคํƒ ํผ๋“œ์ธ๊ฐ€ ์‹ถ์—ˆ๋‹ค. ๐Ÿ‘๐Ÿ‘

 

iOS๊ฐ€ ํฌํ•จํ•˜๋Š” ๊ฒƒ๋“ค

 

์ˆ˜์—…์—์„œ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ๋“ค

  • Tools: Xcode9, Instruments
  • Language: swift
  • Frameworks: Foundation, UIKit, Core Data, Core Motion, Map Kit
  • Design Strategy: MVC

 

๐Ÿƒ Demo (Concentration game)

Concentration game์— ๋Œ€ํ•ด ์นœ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์‹ ๋‹ค
Xcode9์„ ๋„์šฐ๋ฉฐ Demo๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค

Concentration game์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋๋‚˜๊ณ  Xcode์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ์‹ ๋‹ค.

  1. Create a new Xcode project
  2. Single view app ๐Ÿ‘‰ ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•˜์ง€ ๋ง ๊ฒƒ!
  3. Organization identifier ๐Ÿ‘‰ ์šด์˜๊ธฐ๊ด€์˜ ์‹๋ณ„ ์š”์†Œ๋กœ ๋‚˜๋ฅผ ๊ตฌ๋ถ„ํ•ด์ฃผ๋Š” ์š”์†Œ

๊ณ ์ŠคํŠธ ์•„์ด์ฝ˜์ด ๋“ค์–ด์žˆ๋Š” ๋ฒ„ํŠผ ์˜ˆ์ œ

UIButton์˜ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๋ ค์ค€๋‹ค. Storyboard์— UIButton๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๋ฒ„ํŠผ์— "๐Ÿ‘ป" ๊ณ ์ŠคํŠธ ์•„์ด์ฝ˜์„ ๋„ฃ์€ ํ›„ ์‚ฌ์ด์ฆˆ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค. Ctrl ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ์—์„œ UIButton์„ ํด๋ฆญํ•˜์—ฌ ์ฝ”๋“œ ์˜์—ญ์œผ๋กœ ๋Œ๊ณ  ๊ฐ€์„œ touchCard๋ผ๋Š” ์•ก์…˜ ๋ฉ”์†Œ๋“œ์„ ์ƒ์„ฑํ•ด์คฌ๋‹ค.

์ƒ์„ฑํ•œ ์•ก์…˜ ๋ฉ”์†Œ๋“œ์˜ ์™ธ๋ถ€ ์ด๋ฆ„๊ณผ ๋‚ด๋ถ€ ์ด๋ฆ„์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋ฅผ ํ•œ๋‹ค. ์œ„์˜ ์Šคํฌ๋ฆฐ์ƒท์—์„  "_"๊ฐ€ ์™ธ๋ถ€ ์ด๋ฆ„์ด๊ณ , "sender"๊ฐ€ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์ด๋‹ค. ์ด๋ฆ„์„ ์ •ํ•  ๋•Œ "Read like english"ํ•˜๊ฒŒ ์ •ํ•˜๋ผ๊ณ  ํ•œ๋‹ค. ๋ณ€์ˆ˜๋ช…์„ ์ฝ๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค๋ผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์•„๋ž˜์˜ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ์ฝ์œผ๋ฉด "flip card with emoji ๐Ÿ‘ป on sender"๋ผ๊ณ  ํ•œ๋‹ค. ์ตœ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๋ผ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค.

@IBAction func touchCard(_ sender: UIButton) {
	flipCard(withEmoji: "๐Ÿ‘ป", on: sender)
}

func flipCard(withEmoji emoji: String, on button: UIButton) { }

UI์— ๋Œ€ํ•œ ๋งค๋‰ด์–ผ์„ ์ฝ๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ํŠนํžˆ ์ž์ฃผ ์“ฐ๋Š” UI์— ๋Œ€ํ•ด์„œ๋Š” ๊ผญ ๋‹ค ์ฝ์–ด๋ณด๋ผ๊ณ  ํ•œ๋‹ค.

์–ด๋Š ํ”„๋ ˆ์ž„์›Œํฌ, ์–ธ์–ด๋“  ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ํ•„์ˆ˜ ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๊ณ , ์ˆ˜์—…์—์„œ ์ด๋Ÿฐ ๋‚ด์šฉ์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๊ฐ•์˜์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋„๊ฐ€ ์ƒ์Šนํ–ˆ๋‹ค๐Ÿ”บ

๋งค๋‰ด์–ผ ์†Œ๊ฐœ

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด์„œ ์•„๋ž˜์˜ ๋‘๊ฐ€์ง€๋ฅผ ์–ธ๊ธ‰ํ•œ๋‹ค.

  • Swift is extremely typed language
  • Swift has strong type inference

 

UILabel์„ Outlet์œผ๋กœ ์„ ์–ธํ•œ๋‹ค

UILabel์„ ์ฝ”๋“œ ์˜์—ญ์œผ๋กœ ๋Œ๊ณ ์™€์„œ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ UI ๋ณ€์ˆ˜๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. weak์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์ฃผ์— ํ•œ๋‹ค. "!"๋„ ๋งค์šฐ ์ค‘์š”ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ์žˆ๋‹ค๊ฐ€ ๋‹ค๋ฃฌ๋‹ค๊ณ  ํ•œ๋‹ค.

@IBOutlet weak var flipCountLabel: UILabel!

 

Property observers(didSet) ์†์„ฑ๊ฐ์‹œ์ž๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • willSet - ๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
  • didSet - ๊ฐ’์ด ์ €์žฅ๋˜๊ณ  ํ˜ธ์ถœ๋œ๋‹ค.
var flipCount = 0 {
	didSet {
		flipCountLabel.text = "Flips: \(flipCount)"
	}
}

Outlet Collection์˜ ๋ณ€์ˆ˜๋ช…์„ "cardButons"์—์„œ "cardButtons"๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  Xcode์˜ Rename ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค. Storyboard ๋ณ€์ˆ˜๋„ ๊ฐ™์ด ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ ์‹ ๊ธฐํ–ˆ๋‹ค.

"CMD + ๋ณ€์ˆ˜ํด๋ฆญ" ์„ ํ†ตํ•ด ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์–ด๋””์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๊ณ  ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ , ํ•œ๊บผ๋ฒˆ์— ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

Rename ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.

Optional ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•œ๋‹ค. Optional์€ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ๋ณ€์ˆ˜์ด๋‹ค. ๊ฐ’์ด ์—†๋‹ค๋ฉด ๊ทธ ๋ณ€์ˆ˜๋Š” nil์ด ๋œ๋‹ค. Optional ๋ณ€์ˆ˜๋Š” "!"๋ฅผ ๋ถ™์—ฌ์„œ unwraping ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

@IBAction func touchCard(_ sender: UIButton) {
	flipCount += 1
    let cardNumber = cardButtons.index(of: sender)!
    print("cardNumber = \(cardNumber)")
}

 

๊ณผ์ œ: Swift ๋งค๋‰ด์–ผ ์ฝ์–ด์˜ค๊ธฐ

 

๊ด€๋ จ๋งํฌ

์Šค์œ„ํ”„ํŠธ ๋ฌธ์„œ: https://developer.apple.com/documentation/swift

๊ฐ•์˜ ์œ ํŠœ๋ธŒ ๋งํฌ: https://youtu.be/TZL5AmwuwlA