이번 주 과제를 받았는데,
Command Line Tool
프로젝트로 과제를 진행하라고 한다.
왜 그걸로 하는건지 궁금했다.
MacOS
의 Command Line Tool
는 주로 콘솔에서 간단하게 사용자와 상호작용할 수 있기 때문이라고 하는데,
Command Line Tool
프로젝트는 콘솔에서 입력과 출력을 다루는 데 최적화되어 있고,
사용자 입력을 받기 위해 readLine()
같은 기본 함수를 쉽게 사용할 수 있다고 한다.
그리고 UI 요소가 필요 없기 때문에 프로그래밍의 핵심 로직과 특히 자료구조, 알고리즘에 집중하기 좋은 환경이라고 하니,,
간단히 기능을 테스트하고 디버깅 할 수 있어서 편리하고 좋다는 걸 알았다.
그럼 이제 의문을 거두고 시작해보자.
어떻게 시작할지 막막해서 뼈대 바로 열어버린 나.
우선 class
혹은 struct
이라고 되어있는데 처음에 struct로 해도 되지 않나? 했지만
Lv.5
쯤에 시도 횟수 같은것도 저장해야하는 부분이 있어 class
로 하는게 낫겠다고 생각했다.
뭔가 데이터가 일관되게 유지되면서 변경이 불가능한 부분을 유지할 수 있다면
struct
값 타입을 사용하는게 더 적합할텐데, 추후과제를 생각해 class
로 해보자.
여기까지 하고 뼈대를 보니 func makeAnswer()
을 만들면 되겠다.
얼른 만들라고 지금 makeAnswer
쪽에 피가 난다.
1부터 9까지 랜덤으로 뽑는거니까. 로또번호
생성시 쓰는 코드로 했다.
makeAnswer() -> [Int]
이제 Int
타입의 배열을 생성한다는 거다.
생성하는 방법은 우선 번호를 뽑아야하기 때문에,
let numbers: [Int] = []
이렇게 빈 배열을 numbers
라는 이름으로 하나 만들어주고,
while
문으로 번호 3개를 뽑을 때가지 계속 돌려야한다.
while
문은 조건문
인데, 조건이 참
이 되면 계속 무한대로 돌고 거짓
이면 멈춘다.
while numbers.count < 3
의 경우 초기에 numbers
배열 길이가 0
이니 해당 조건문에선 참
이다. 그렇게 루프가 시작되고,
랜덤 숫자를 생성하면 지정해둔 numbers
배열에 추가가 될 것이다.
그럼 배열의 길이가 1
이 되니, 이 시점에서 다시 number.count < 3
로 본다면
1 < 3
이기 때문에, 참이니까 또 루프가 실행될 것이다.
이렇게 세번을 하게 되면 결국 3 < 3
이 되는데,
그 때는 이제 false
값이 나오게 되어 while
루프가 종료 될 것이다.
< 번역 >
random 메서드는 무작위 값을 생성하는 메서드인데 무작위 값을 생성할 범위만 정해주면 그 안에서 무작위 뽑기가 실행되는 것이다.
random(in:<숫자범위>)
를 쓰면 된다는 걸 알고 (in: 1...9)
를 적용했다.
그렇게 numbers.append(number)
까지 하고 return
값을 줬는데 자꾸 피가 났다.
눌러서 Fix
를 눌러봤더니 let numbers: [Int] = []
이 부분이,
let
에서 var
로 바뀌었다.
처음엔 뭐가 바뀐지도 몰랐다.
다시 보니까, let
일 경우에는 변수가 변경이 되지 않으니,
numbers
에 값을 추가하려고 하면 오류가 발생하는 것이었다.
사소한 것 같으면서도 헷갈렸다.
numbers
를 var
로 선언해주면, 이제 numbers
배열에 값이 추가되니 해결이 된 것이다.
실행을 돌려도 저 노랭이 때문에 되지 않는 것 같다. 뭐가 문제일까.....
< 번역 >
보면 answer
이 사용하는 곳이 없어서 발생하는 것 같다.
그러니까 불필요하면 제거해라? 그런 것 같다.
그럼 필요하게 만들면 될 것 같은데 잘 모르겠어서 검색해봤다.
보통 이런건 해외사이트? 같은 곳에서 답이 잘 나온다.
번역해서 보니 이 사람은 인쇄만 하면 오류가 사라진다고 한다.
그럼 그냥 print
구문만 추가하면 된다는건가.... 바로 시도해봤다.
( 클래스 대문자로 시작해야하는데 지금 봐서 급시 수정했다.)
유레카......
근데 오히려 xcode
에서 제안한 Fix
로 했을 땐 프린트 되지 않았다.
얘가 추천한 건 '_'
이렇게 아래바로 바꿔보라해서 바꿨는데,
위 처럼 결과 값이 나오지 않았다.....
그래서 검색을 해본 거고, 그냥 print
구문만 추가하라는 답변을 보고 했던 것이다.
역시 갓 구글 검색 !!!!!
그저 만드느라 중복값을 생각하지 못한 내가 별로ㄷr......
하지만 힌트를 주신 타팀원분의 조언으로 간단한 방법을 통해 해결이 가능하단 걸 알게되었다.
먼저, Set
을 사용할 때는 타입을 명시해야 한다는 걸 알고 있어야한다.
정수형 값을 담는 Set
을 만들려면 Set<Int>
와 같이 작성해야 하고,
문자열을 담으려면 Set<String>
과 같이 사용할 수 있다.
그리고 세트로 따라오는 insert
는 Set
에 새로운 요소를 추가하는 메서드이다.
이 메서드를 사용하면 지정한 값을 Set
에 삽입할 수 있다.
만약 이미 같은 값이 존재한다면, Set
의 특성상 중복이 허용되지 않기 때문에 삽입되지 않는다.
.
.
.
수정 후)
마지막에 return Array(numbers)
은 Set
의 값을 배열로 변환해서 반환하기 위해 사용되었는데,
특성상 Set
은 순서가 없고, 배열과는 달리 인덱스를 사용하여 요소에 접근할 수 없다.
return
값에 넣은 Array(numbers)
는 Set
을 배열로 변환해 주며, makeAnswer
함수는 이제 올바른 타입인 [Int]
를 반환할 수 있다!
이렇게 중복으로 숫자가 나오지 않게 가능해졌다.
오늘 Lv.1
까지만 진행해봤는데,
BaseballGame
의 기능을 구현하기 위한 기본 구조를 세워봤다.
뼈대 힌트를 통해 클래스 내부에 start()
와 makeAnswer()
라는 두 개의 메서드를 정의할 수 있었다.
다음엔 바로 뼈대 안 보고 생각을 해본 뒤 시도해야겠다,,,
랜덤뽑기의 로직을 몰라서 로또 랜덤번호 생성하는 방법을 구글링을 찾아
while
루프를 사용해서 숫자가 3개가 될 때까지 반복하고,
생성된 숫자를 배열에 추가해줬다.
처음엔 for
문을 하려고 했는데, 중복되는 번호가 없게 하기 위한 부분을 구현하게 된다면,
while
문으로 했을 때가 코드가 간결하고 더 편하다고 한다.
오늘 뭔가 기본적인 함수들을 요롷게 조롷게 섞어 이용해서 만들어 본 기분이다.
튜터님이 간단하지만(?) 게임의 기본적인 로직을 구현하는 데 중요한 부분이라고 한다.
내일 다음레벨 도전도 화이팅..
아..! 중복 제거를 안했다....