오늘은 제출한 숫자야구게임 과제 피드백을 보고 코드 개선을 하였다.
또한 새로운 챕터를 시작하며, 강의를 듣고 정리한 내용을 공유한다.
- mainMenu 메소드에서 isQuit가 있는데 isQuit를 사용하지 않고 return으로 함수를 종료해도 괜찮을 것 같아요.
while문 안에 Switch 문에서 break 문을 사용해도 while문 탈출이 안됨
Bool 타입의 isQuit 변수를 사용해 아래와 같이 구현
func mainMenu() { var isQuit: Bool = true // 기존 - 게임 반복 여부 저장 변수 var gameCount: Int = 0 var logArray: [String] = [] while isQuit { message.menu() switch readLine() ?? "" { case "1": var tryCount = startGame() gameCount += 1 logArray.append(log.gameLog(gameCount, tryCount)) tryCount = 0 // 시도 횟수 초기화 case "2": print("< 게임 기록 보기 >") message.gameLog(logArray) case "3": print("Bye!") isQuit = false // 기존 - 반복문 종료 default: print("올바른 번호를 입력해주세요.") } } }
기존 isQuit 변수를 삭제하고, return 문을 사용하여, 반복문을 탈출하도록 개선 완료!
func mainMenu() { var gameCount: Int = 0 var logArray: [String] = [] while true { // 개선 후 - isQuit 변수 삭제 및 기본 true 조건 message.menu() switch readLine() ?? "" { case "1": var tryCount = startGame() gameCount += 1 logArray.append(log.gameLog(gameCount, tryCount)) tryCount = 0 case "2": print("< 게임 기록 보기 >") message.gameLog(logArray) case "3": print("Bye!") return // 개선후 - 반복문 종료, 기존 isQuit 변수 삭제 및 return 문으로 반복문 탈출 default: print("올바른 번호를 입력해주세요.") } } }
BaseballGame 클래스의 84번째 줄에 print("")가 있는데 해당 부분도 message 클래스에서 newLine 메소드로 구현해도 좋았을 것 같아요.
줄바꿈을 위해 print 문으로 빈 문자열 출력
코드
while true {
message.input()
tryCount += 1
let userAnswer = userInput.getUserInput()
let gameResult = checkAnswer.check(gameAnswer, userAnswer)
if gameResult.strike == 3 {
message.success()
break
} else if gameResult.strike == 0 && gameResult.ball == 0 {
message.lose()
} else {
message.resultMessage(strike: gameResult.strike, ball: gameResult.ball)
}
print("") // 기존 - 줄바꿈
}
print 기능을 담당하는 Struct에 줄바꿈 기능 메소드를 추가하고, 해당 매소드를 사용하는 방식으로 개선 완료!
코드
while true {
message.input()
tryCount += 1
let userAnswer = userInput.getUserInput()
let gameResult = checkAnswer.check(gameAnswer, userAnswer)
if gameResult.strike == 3 {
message.success()
break
} else if gameResult.strike == 0 && gameResult.ball == 0 {
message.lose()
} else {
message.resultMessage(strike: gameResult.strike, ball: gameResult.ball)
}
message.newLine() // 개선 후 - 줄바꿈, Print문 구현이 아닌, PrintMessage의 메소드로 기능 구현
}
print 기능 구조체에 줄바꿈 메소드 추가
protocol PrintMessageProtocol {
func menu()
func newLine()
func start()
func input()
func success()
func lose()
func resultMessage(strike: Int, ball: Int)
func gameLog(_ gameLog: [String])
}
/**
출력 기능 담당하는 구조체
*/
struct PrintMessage: PrintMessageProtocol {
// 줄바꿈 기능
func newLine() {
print("")
}
Swift는 객체지향 프로그래밍(Object-Oriented Programming, OOP)을 지원하는 언어이다.
객체지향의 핵심 개념 4가지를 이해하면 더 효율적이고 확장성 있는 코드를 작성할 수 있다.
부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있음
코드 재사용성을 높이고, 유지보수를 쉽게 할 수 있음
Swift에서 class
를 사용하여 상속을 구현
class Animal {
func sound() {
print("소리를 냅니다.")
}
}
class Dog: Animal {
override func sound() {
print("멍멍!")
}
}
let myDog = Dog()
myDog.sound() // 출력: 멍멍!
객체의 속성과 메서드를 외부에서 접근하지 못하도록 보호하는 개념
private
, public
, internal
등의 접근 제어자를 활용하여 구현
class Person {
private var name: String = "John"
func getName() -> String {
return name
}
}
let person = Person()
print(person.getName()) // 정상 출력: John
// print(person.name) // 오류 발생 (private 접근 불가)
같은 메서드를 호출하더라도 객체에 따라 다른 동작을 하도록 하는 개념
메서드 오버라이딩(Method Overriding)을 통해 구현
class Shape {
func draw() {
print("도형을 그립니다.")
}
}
class Circle: Shape {
override func draw() {
print("원을 그립니다.")
}
}
let shape1: Shape = Shape()
let shape2: Shape = Circle()
shape1.draw() // 출력: 도형을 그립니다.
shape2.draw() // 출력: 원을 그립니다.
불필요한 부분은 숨기고, 중요한 부분만 노출하는 개념
프로토콜(protocol)을 활용하여 구현 가능
protocol Vehicle {
func move()
}
class Car: Vehicle {
func move() {
print("자동차가 달립니다.")
}
}
let myCar: Vehicle = Car()
myCar.move() // 출력: 자동차가 달립니다.
✅ 객체지향 프로그래밍을 활용하면
객체지향의 4가지 특징에 대해서도 공부해보시면 좋을것 같습니다. (상속, 캡슐화, 다형성, 추상화)
앱이 실행되고 종료될 때까지의 과정을 앱 생명주기(App Life Cycle)라고 한다.
이 과정을 이해하면 앱의 상태 변화에 따라 적절한 처리를 할 수 있다.
앱의 생명주기를 관리하는 두 가지 중요한 클래스가 있다.
application(_:didFinishLaunchingWithOptions:)
에서 앱 실행 시 초기 설정 진행 sceneDidBecomeActive(_:)
, sceneWillResignActive(_:)
등을 활용하여 앱 상태 관리 AppDelegate
에서 관리 SceneDelegate
에서 관리 코드를 작성하는 것만큼 중요한 것이 디버깅이다.
버그를 효과적으로 찾아내고 해결하기 위해 다양한 디버깅 방법을 배웠다.
print("디버깅할 값: \(value)")
형태로 콘솔에 출력 import os
let log = OSLog(subsystem: "com.myApp", category: "debug")
os_log("디버깅 메시지: %@", log: log, type: .debug, "값 출력")
po 변수명 // 변수 값 출력
p 변수명 // 변수 값 출력 (Swift 기본 형식)
break set -n 함수명 // 특정 함수에서 중단점 설정
오늘도 모든 경험이 의미 있는 시간이었다!