이게 코딩의 재미였던가?
아마도 초보이고 하나씩 배워가는 과정이 있어서 재미있는게 아닌가 싶다. 직업이 되면 싫어지려나?
오래전에 초급 단계를 거쳤었는데 오랜 시간이 흘러 다시 초보가 되었다. 이해하고 문제를 하나 하나 해결해 나가다보니 5시간을 앉아 있었다. 나이가 먹어서 그런지 허리가 무진장 아프다.

앞서 간단한 문제를 풀어보고나니 욕심이 생겨서 좀 더 들어가보기로 했다.
허접한 퀴즈게임으로 다음 주제를 복습하고자 한다.
목차: 간단한 퀴즈 앱
1. readLine() / uppercased() / if.. else.. / let
2. func
3. OX 퀴즈 게임 (정답/오답 개수 계산) / var
4. 정답률 퍼센트 출력 추가하기 / Double / String(format:)
5. 퀴즈 배열(튜플 배열) + 반복문
6. 함수 shuffled() 를 활용하여 랜덤 퀴즈 출제
시작해보자!
1. readLine() / uppercased() / if.. else.. / let
입력값을 받아 정답인지 오답인지 출력한다.
print("문제: 대한민국의 수도는 서울이다. (O/X)")
if let answer = readLine() {
if answer.uppercased() == "O" {
print("답변: \(answer)")
print(">>>> 정답입니다!")
} else {
print(">>>> 오답입니다!")
}
}
print("문제: 이스탄불은 대한민국의 도시 중 하나이다. (O/X)")
if let answer = readLine() {
if answer.uppercased() == "X" {
print("답변: \(answer)")
print(">>>> 정답입니다!")
} else {
print(">>>> 오답입니다!")
}
}
매우 쉽게 시작을 했다. O/X로 답을하고 그외 값을 입력하면 오답처리.
2. func
다음 어떤 기능을 추가해 볼까 생각하다가 질문의 print가 불필요하게 중복된 것을 보고 함수로 묶어보고 싶었다.
좀 더 깔끔하게(?)
func runQuiz(question: String, correctAnswer: String) {
print("문제: \(question) (O/X)")
if let answer = readLine() {
if answer.uppercased() == correctAnswer.uppercased() {
print("답변: \(answer)")
print(">>>> 정답입니다!")
} else {
print(">>>> 오답입니다!")
}
}
}
runQuiz(question: "대한민국의 수도는 서울이다.", correctAnswer: "O")
runQuiz(question: "이스탄불은 대한민국의 도시 중 하나이다.", correctAnswer: "X")
확실히 뭔가 정리된 느낌이다.
그 다음으로 질문을 계속 추가하는것은 무의미할 것 같고... 뭘 하면 좋을까?
3. OX 퀴즈 게임 (정답/오답 개수 계산) / var
총 5개의 퀴즈를 내고 정답과 오답의 개수를 알려주는 것을 추가해보자.
✅ 미션 조건
- 총 5개의 퀴즈를 낸다.
- 각각의 정답은 "O" 또는 "X"로 지정한다.
- 사용자 입력을 받아서 정답인지 확인.
- 정답일 경우 goodAnswer += 1, 오답일 경우 wrongAnswer +=1
- 마지막에 총 정답과 총 오답을 출력.
goodAnswer와 wrongAnswer 개수를 저장할 변수를 만들어놓고, 퀴즈를 추가하고 마지막에 print로 goodAnswer와 wrongAnswer를 출력하도록 했다. 중간에 중복된 코드가 보이는데 이는 나중에 발견했음으로 다음에 삭제하기로 하자.
var goodAnswer = 0
var wrongAnswer = 0
func runQuiz(question: String, correctAnswer: String) {
print("\(question) (O/X)")
if let answer = readLine() {
if answer.uppercased() == correctAnswer.uppercased() {
print("답변: \(answer)")
print(">>>> 정답입니다!")
goodAnswer += 1
} else {
print(">>>> 오답입니다!")
wrongAnswer += 1
}
}
print("정답: \(goodAnswer)개 / 오답: \(wrongAnswer)개\n")
}
// 퀴즈 실행
runQuiz(question: "대한민국의 수도는 서울이다.", correctAnswer: "O")
runQuiz(question: "대전은 대한민국의 도시 중 하나이다.", correctAnswer: "O")
runQuiz(question: "2024년도 12월 3일 발동한 비상계엄은 불법이다.", correctAnswer: "O")
runQuiz(question: "이스탄불은 대한민국 도시 중 하나이다.", correctAnswer: "X")
runQuiz(question: "챗GPT는 바보다.", correctAnswer: "X")
// 마지막 결과 출력
print("=== 퀴즈 종료! ===")
print("총 정답: \(goodAnswer)개")
print("총 오답: \(wrongAnswer)개")
또 어떤걸 추가해볼까?
4. 정답률 퍼센트 출력 추가하기 / Double / String(format:)
정답/오답은 그대로 유지하면 될 것 같고 마지막에 "정답률: 80%" 이런식으로 퍼센트 출력을 추가해보자.
퍼센트 계산은 Double로 변환이 필요한 것은 기억하고 있으니 추가로 소수점 반올림도 추가해보자.
var goodAnswer = Int()
var wrongAnswer = Int()
var answerPercentage = Double()
func runQuiz(question: String, correctAnswer: String) {
print("\(question) (O/X)")
if let answer = readLine() {
if answer.uppercased() == correctAnswer.uppercased() {
print("답변: \(answer)")
print(">>>> 정답입니다!")
goodAnswer += 1
} else {
print(">>>> 오답입니다!")
wrongAnswer += 1
}
}
print("정답: \(goodAnswer)개 / 오답: \(wrongAnswer)개")
answerPercentage = Double(goodAnswer/(goodAnswer+wrongAnswer)*100)
}
runQuiz(question: "대한민국의 수도는 서울이다.", correctAnswer: "O")
runQuiz(question: "대전은 대한민국의 도시 중 하나이다.", correctAnswer: "O")
runQuiz(question: "2024년도 12월 3일 발동한 비상계엄은 불법이다.", correctAnswer: "O")
runQuiz(question: "이스탄불은 대한민국 도시 중 하나이다.", correctAnswer: "X")
runQuiz(question: "챗GPT는 바보다.", correctAnswer: "X")
print("===. 퀴즈가 종료되었습니다! ===")
print("총 정답: \(goodAnswer)개")
print("총 오답: \(wrongAnswer)개")
print("정답율: \(answerPercentage)%")
위와 같이 코딩을 하고 실행했을 때 이상한 점을 발견했는데...
정답을 모두 맞췄을 경우 정상적으로 100.0%가 출력이 되었는데 한개라도 틀리게 되면 결과값이 무조건 0.0%로 표시가 되더라...
코드를 한참을 보고 있는데... 음? 뭔가 이상한데...
다음을 수정해보자
var goodAnswer = Int()
var wrongAnswer = Int()
var answerPercentage = Double()
answerPercentage = Double(goodAnswer/(goodAnswer+wrongAnswer)*100)
뭔가 잘못된 것을 감지했다.. 당연하지.. 결과가 이상하게 나오는걸...
var goodAnswer = 0
var wrongAnswer = 0
var answerPercentage = 0.0
func runQuiz(question: String, correctAnswer: String) {
print("\(question) (O/X)")
if let answer = readLine() {
if answer.uppercased() == correctAnswer.uppercased() {
print("답변: \(answer)")
print(">>>> 정답입니다!")
goodAnswer += 1
} else {
print(">>>> 오답입니다!")
wrongAnswer += 1
}
}
print("정답: \(goodAnswer)개 / 오답: \(wrongAnswer)개")
}
runQuiz(question: "대한민국의 수도는 서울이다.", correctAnswer: "O")
runQuiz(question: "대전은 대한민국의 도시 중 하나이다.", correctAnswer: "O")
runQuiz(question: "2024년도 12월 3일 발동한 비상계엄은 불법이다.", correctAnswer: "O")
runQuiz(question: "이스탄불은 대한민국 도시 중 하나이다.", correctAnswer: "X")
runQuiz(question: "챗GPT는 바보다.", correctAnswer: "X")
answerPercentage = Double(goodAnswer) / Double(goodAnswer+wrongAnswer)*100
print("===. 퀴즈가 종료되었습니다! ===")
print("총 정답: \(goodAnswer)개")
print("총 오답: \(wrongAnswer)개")
print(String(format: "정답률: %.1f%%", answerPercentage))
위와 같이 코드를 수정했다. 문제의 원인은 찾아본 결과 정수 나눗셈 (정수 / 정수)의 함정. 정상적으로 Double로 변환이 안되어서 결국 Int / Int 연상이 되고 정수 나눗셈 결과가 나온 것으로 이해했다.
예를 들어 3/5 = 0 <--- 정수 나눗셈이라 소수점 버리게 된다. 그래서 결국 Double(0 * 100)이 되어서 항상 0.0이 출력되는 것이란다.
난 Double()를 사용하여 모두 변환되는 줄 알았는데 나중에 배워야 할 부분이다. 아래와 같이 수정했다.
answerPercentage = Double(goodAnswer) / Double(goodAnswer + wrongAnswer) * 100
그리고 찾다가 마지막 정답률을 print하는 부분을 아래와 같이도 쓸 수 있다고 하여 적용해보았다.
print(String(format: "정답률: %.1f%%", answerPercentage))
🙌 요약
| 문제 원인 | 해결 방법 |
| Int / Int = 정수 나눗셈이기 때문에 소수점 사라짐 | Double로 형변환 후 나누기 |
다음으로 넘어가보자.
5. 퀴즈 배열(튜플 배열) + 반복문
다음으로 퀴즈 배열을 만들어 보려고 한다. 각 아이템은 (문제, 정답) 형식의 튜플이다.
let quizList = [
("대한민국의 수도는 서울이다.", "O"),
("대전은 대한민국의 도시 중 하나이다.", "O"),
("2024년도 12월 3일 발동한 비상계엄은 불법이다.", "O"),
("이스탄불은 대한민국 도시 중 하나이다.", "X"),
("챗GPT는 바보다.", "X")
]
그리고 다음은 반복문으로 문제를 출제하도록 만들어 보려고 한다.
for (question, correctAnswer) in quizList {
runQuiz(question: question, correctAnswer: correctAnswer)
}
이렇게 하면 등록한 5개의 문제가 자동으로 출제되게 된다.
적용하면 아래와 같다.
var goodAnswer = 0
var wrongAnswer = 0
var answerPercentage = 0.0
func runQuiz(question: String, correctAnswer: String) {
print("\(question) (O/X)")
if let answer = readLine() {
if answer.uppercased() == correctAnswer.uppercased() {
print("답변: \(answer)")
print(">>>> 정답입니다!")
goodAnswer += 1
} else {
print(">>>> 오답입니다!")
wrongAnswer += 1
}
}
print("정답: \(goodAnswer)개 / 오답: \(wrongAnswer)개")
}
let quizList = [
("대한민국의 수도는 서울이다.", "O"),
("대전은 대한민국의 도시 중 하나이다.", "O"),
("2024년도 12월 3일 발동한 비상계엄은 불법이다.", "O"),
("이스탄불은 대한민국 도시 중 하나이다.", "X"),
("챗GPT는 바보다.", "X")
]
for (question, correctAsnwer) in quizList {
runQuiz(question: question, correctAnswer: correctAsnwer)
}
/*
runQuiz(question: "대한민국의 수도는 서울이다.", correctAnswer: "O")
runQuiz(question: "대전은 대한민국의 도시 중 하나이다.", correctAnswer: "O")
runQuiz(question: "2024년도 12월 3일 발동한 비상계엄은 불법이다.", correctAnswer: "O")
runQuiz(question: "이스탄불은 대한민국 도시 중 하나이다.", correctAnswer: "X")
runQuiz(question: "챗GPT는 바보다.", correctAnswer: "X")
*/
answerPercentage = Double(goodAnswer) / Double(goodAnswer + wrongAnswer) * 100
print("===. 퀴즈가 종료되었습니다! ===")
print("총 정답: \(goodAnswer)개")
print("총 오답: \(wrongAnswer)개")
//print("정답율: \(answerPercentage)%")
print(String(format: "정답율: %.1f%%", answerPercentage))
나중에 발견한 문제... 오타가 있었다.
for (question, correctAsnwer) in quizList {
runQuiz(question: question, correctAnswer: correctAsnwer)
}
correctAsnwer (X) / correctAnswer (O)
그런데도 정상적으로 프로그램이 돌아가서 의아해하고 있었다. 돌아가는데 문제가 없었나? 하고 한참을 들여다보았다.
왜 실행이 되었지?
✅ 이유 1: 변수 이름은 "지금 이 줄에서만" 새로 만드는 거니까
Swift에서 for (question, correctAsnwer) in quizList는 이렇게 해석된다고 한다.
“quizList 배열을 돌면서, 각 요소의 첫 번째 값은 question, 두 번째 값은 correctAsnwer라는 새로운 변수로 받겠다.”
즉, correctAsnwer라는 이름은 내가 여기서 직접 만든 변수 이름이여서 아무리 오타라도, 처음 등장하는 이름이라 문제가 안 생긴다고 한다.
✅ 이유 2: 같은 이름이 함수 매개변수로도 쓰이기 때문
func runQuiz(question: String, correctAnswer: String) { ... }
여기서 correctAnswer는 함수 안에서 쓰는 매개변수 이름이다.
그리고 이 줄에서:
runQuiz(question: question, correctAnswer: correctAsnwer)
- 왼쪽의 correctAnswer:는 함수 파라미터
- 오른쪽의 correctAsnwer는 네가 for문 안에서 만든 변수
💡 즉, Swift는 correctAsnwer가 어떤 변수인지 알고 있으니까 오타든 뭐든 해당 이름의 변수만 있으면 작동은 된다고 한다....;;;;;;;
🎯 결론
| 질문 | 설명 |
| 왜 에러가 안 났어? | correctAsnwer는 너가 직접 만든 변수 이름이라, 오타든 뭐든 문제가 안 됨 |
| 그럼 고쳐야 해? | ✅ 당연히! 오타는 나중에 헷갈리고, 유지보수 어려워짐 |
오타가 있어도 "처음 등장하는 변수"라면 에러는 안 나지만, 코드 가독성, 유지보수, 협업을 생각하면 항상 정확한 이름이 중요하다고 한다.
6. 함수 shuffled() 를 활용하여 랜덤 퀴즈 출제
새로운 기능을 추가해 볼까 한다. 현재 코드 quizList 배열의 문제 순서를 무작위로 섞고 섞인 배열을 사용하여 퀴즈를 출제하도록 한다.
나머지 로직은 그대로 유지!
let shuffledQuizList = quizList.shuffled()
의외로 간단했다. 위와 같이 적용해보자.
let quizList = [
("대한민국의 수도는 서울이다.", "O"),
("대전은 대한민국의 도시 중 하나이다.", "O"),
("2024년도 12월 3일 발동한 비상계엄은 불법이다.", "O"),
("이스탄불은 대한민국 도시 중 하나이다.", "X"),
("챗GPT는 바보다.", "X")
]
// 퀴즈 순서를 랜덤하게 섞기
let shuffledQuizList = quizList.shuffled()
// 퀴즈 실행
for (question, correctAnswer) in shuffledQuizList {
runQuiz(question: question, correctAnswer: correctAnswer)
}
의외로 쉽게 해결되었고 큰 어려움은 없었다.
휴 여기까지는 큰 문제없이 무난했다. 앞으론 배운만큼 복잡해지고 어리가 터지겠지...
하지만 오랜만에 코딩 공부는 재미있었다. 오늘 이보다 더 진도가 나가서 Array(), Prefix() 등 많은 함수들을 추가했었다.
하지만 시간이 늦은 관계로 이만하고 내일 다시 이어가도록 해야겠다.
모두 굿밤.
'개인공부' 카테고리의 다른 글
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 5편 (1) | 2025.03.25 |
|---|---|
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 4편 (2) | 2025.03.25 |
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 1편 (0) | 2025.03.24 |
| [iOS/Xcode] 코딩 공부를 계속해보자 7편 (0) | 2025.03.24 |
| [코딩공부] 프림 알고리즘(Prim's Algorithm) 완벽 가이드: 개념, 구현, 예제 코드 (0) | 2025.03.16 |