[사전캠프 13일차] 복습노트
1. 오늘의 할 일
행맨을 만들면서, 그리고 다른 코딩을 하면서 초반에 쓴 내용 외의 이런저런 기호들이 추가되었음을 느낀다.
나야 검색하고 손에 익혀서 쓰고 있지만...작성하는 중간에 끼운 나머지 제대로 찾아볼 수 없기도 할 것이고, 설명이 빈약할 수도 있으므로 오늘은 간단하게 복습정리를 할 것이다.
여담: 참고로 오늘은 오목기획을 마무리했다.
2. 그동안 새로 알게 된 것들
우선 설명하기 전에, 갑자기 새로 튀어나온 것들을 정리해보자.
1일부터 12일까지 있으니 찾는데 시간이 걸리겠지만, 새로 튀어나왔어도 이후에 중점적으로 다른 항목은 제외한다.
리스트
1. $
2. break;
3. .Length
4. Random
5. Array.Exists
3. 알아보자!
전부 코드를 쓰면 서 한 번즈음은 이용한 것이므로, 가볍게 서술하고 정리하는 것을 의의로 삼을 것이다.
1. $ (달러표시)
보통 사용한 곳은 Console.WriteLine($"적당한 문자열{데이터 이름}"); 이다.
$의 기능은 간단하다. 문자열 안에서 변수나 데이터를 그대로 가져와서 출력시켜주는 역할을 한다.
또한, +와 " "가 반복적으로 사용되지 않아 가독성도 챙길 수 있다.
예시
$ 미사용: ("가방"+n+"개를 가져다 두고 싶은데"+place+"로 가져다 드릴까요?")
$ 사용: ($"가방 {n}개를 가져다 두고 싶은데 {place}로 가져다 드릴까요?")
위의 모습을 보았을 때, $를 쓰는 것이 가독성이 좋은 것을 알 수 있다.
$나 { }를 빼먹으면 n=5;로 설정 되어있어도 5개가 아니라 그냥 {n}개/n개로 표시가 되므로, $표시와 { }를 잘 넣었는지 확인해주도록 하자.
2. break;
가장 처음 마주한 건 switch case 문이다.
그때는 그냥 무난하게 switch case문에서는 각 항목마다 필수로 넣어주셔야 합니다. 정도로 끝냈지만, 숫자야구에서도 한 번 썼으니 가져와봤다.
break, 브레이크. 가장 빠르게 연상되는 것은 1. 부순다 2. 자동차의 브레이크이다. 둘 중 어느 쪽을 연상해도 좋다.
break를 언제 사용하는가?
switch case 문에서는 필수로 쓰이는 요소였으니 제외하고 이야기한다.
break;는 다른 곳에서 사용될 때는 보통 for이나 while같은 반복문에서 사용된다. (사실, 반복문과 if문이 섞여 있을 때 특히 잘 사용된다.)
그리고 방금, break라고 했을 때 빠르게 연상되는 것이 '부순다'와 '자동차의 브레이크' 라고 말했다.
솔직하게 말하면, 그 말 그대로의 역할을 수행한다고 생각한다.
break;는 반복문에서, 해당 반복문을 그만두고 빠져나오도록 한다.
물론 정지하는 것은 break가 들어있는 반복문 뿐, 그 밖에 있는 반복문까지 다 함께 멈추지는 않는다.
즉 반복문을 깨부수고 나온다, 혹은 반복문을 달리는 것을 멈춘다. 고 볼 수 있다.
예) 아래의 경우, while문은 깨지지 않고 for 문만 break;에서 정지한다. 즉, 아래의 경우 B는 나타나지 않고 A만 나타난다.
또한, while문은 멈추지 않았으므로 Y까지 출력 후, 1회 반복을 완료한다.
while문의 조건에서 빠져나올 때까지 X→A → Y는 계속 반복.
그러나 for문에서 break로 반복문이 취소되는 B는 반복되는 중에도 실행되지 않는다.
while(대충 필요한 조건)
{
while 속에 있는 내용 X
for (대충 필요한 요소)
{
적당한 함수 A
break;
다른 내용 B
}
while문 속에 있는 내용 Y
}
이 break는 조건문과 반복문이 같이 있을 때 조건문 안에서도 잘 볼 수 있다. 가장 빠른 예시가, 어제 작성한 숫자야구의 판정부분 이었다.
해당 코드
while (!guessedCorrectly && x > 0 )
{
int strikes = 0;
int balls = 0;
int outs;
for (int i = 0; i < guess.Length; i++)
{
int input;
Console.WriteLine($"{i + 1}번째 숫자를 넣어주세요.");
check = int.TryParse(Console.ReadLine(), out input);
guess[i] = input;
if (guess[i] == target[i])
{
strikes++;
}
else if (Array.Exists<int>(target, element => element == input))
{
balls++;
}
else if (input > 9 || input < 0)
{
Console.WriteLine("0부터 9까지의 숫자 하나만 입력해주세요.");
guess[i] = 0;
break;
}
else if (!check)
{
Console.WriteLine("숫자를 입력해주세요.");
guess[i] = 0;
break;
}
} //여기까지 for 반복문
outs = 3 - (strikes + balls);
Console.WriteLine($"입력값: {guess[0]}{guess[1]}{guess[2]}");
Console.WriteLine($"S:{strikes}/B:{balls}/O:{outs}");
if(strikes != 3)
{
x--;
Console.WriteLine($"기회가 {x}회 남았습니다.");
}
else
{
guessedCorrectly = true;
}
}
코드를 보면 숫자야구에서 '정상적으로 입력되면 안되는 값'인 조건( (input > 9 || input < 0) 와 (!check) )에서 break;가 적혀있다.
이때 break;는 해당 조건문과 그 조건문이 있는 for문을 멈추고 바로 다음 코드를 실행하게 된다. (때문에, strike 3개는 만들 수 없으므로 기회가 차감된다.)
그리고 조건을 만족하지 못했으니 다시 반복되어 while문의 첫문장으로 돌아가고, 새 for문을 시작한다.
'이 길은 잘못된 길이니까 브레이크 밟고 다시 돌아간다'고 생각하면 될 것이다.
3. .Length
처음 나왔을 때에는 string 값에 붙은 .Length이다.
이 .Length의 역할이 '길이'를 의미한다는, 아주 간단한 내용이다.
string num="abcd" 가 되면 int x=num.Length 는 4가 되는 것이다.
그리고 이게 진행하면서 '배열'에도 붙었다.
int [] Array = new int [5] 라면, Array.Length의 값은 얼마일까?
아니 애초에 배열의 길이는 어떻게 계산해야 하는 걸까?
간단하다. [ ] <이거 한 칸이 1로 생각하면 된다. 즉, 배열이 만들어내는 방의 개수가 곧 배열의 길이가 되는 것이다.
break;문에서 가져온 해당 코드를 보면 guess.Length가 있는데, 이 guess도 int [ ]의 배열이었다.
숫자야구에서, int[ ] guess = new int[3]; 이었으므로, guess.Length는 3이 되는 것이다.
행맨 게임에서는 이 .Length를 이용해 글자 수 길이만큼 맞춰야 할 정답 칸(빈 칸)을 만들어서, 글자 길이가 바뀌면 빈칸이 줄거나 늘어나도록 했었다.
4. Random
랜덤! 난수를 생성해주는 녀석이다. 정수만 뽑힌다.
보통 다음과 같은 형식으로 사용한다.
Random rand = new Random();
int x = rand.Next( );
그리고 저 Next뒤에 최소값과 최대값+1값을 넣어 범위를 지정할 수도 있다.
만약 임의의 int 변수를 K라고 했을 때, 0부터 9까지의 랜덤한 수를 나타낸다고 한다면,
int K= rand.Next(0, 10);
이렇게 작성하면 되는 것이다.
난수와 배열을 합하면, 문자열 배열에서 랜덤한 문자열을 뽑아내는 것도 가능하다. (참조: 자습-행맨 번외)
코드
string[] options= { "salmon", "hangman", "secret", "cyanosis", "approach", "question", "paralysis", "rhythm", "spring", "myths", "monitoring","software", "orchestra" };
Random rand = new Random();
int index = rand.Next(options.Length); //어차피 배열은 0부터 배열길이-1까지의 숫자를 방으로 삼는다.
char[] secretword = options[index].ToCharArray();
5. Array.Exists
이 함수는 행맨과 숫자야구에서 해당 배열에 내가 원하는 값이 있는지 확인하기 위해 사용했다!
'일치'를 보는 게 아니라 '포함'인지 확인 하는 것임을 확실히 하자.
그러니까, char 배열 A에 값 a, b, c, d가 있고, 내가 확인하려는 값은 d와 f이다.
내가 넣으려는 데이터가 배열 안에 있으면 Array.Exists는 True를 반환하고, 없다면 False를 반환한다.
Array.Exists(secretword, answer => answer == input)
(비교배열, 매개변수=>매개변수 ==비교대상)
위의 구조에 대입한다면, 다음과 같다.
Array.Exists( A, answer => answer == d) //이건 A배열에 d가 존재하니까 true 가 된다.
Array.Exists( A, answer => answer == f) //이건 A 배열에 f가 없으니까 false 가 된다.
확인 코드
char[] A = {'a', 'b', 'c', 'd'};
Console.WriteLine(Array.Exists(A,answer => answer == 'd'));
Console.WriteLine(Array.Exists(A, answer => answer == 'f'));

배열 속에 값이 포함되어 있기만 하다면 True를 반환하기 때문에, 조건문에서 사용하기 좋다.
*answer는 어떤 이름이어도 괜찮다. 매개변수 이름 짓기니까. 요소인 element를 써도 된다. 위의 예시가 answer였던 이유는, 해당 코드가 쓰인 곳이 행맨이었고, 답변이 포함되어있는지 확인하는 절차였기 때문에 answer로 명명했다.
4. 다음에 할 일은?
게임 속 상호작용을 분석해볼 것이다.