Unity_사전캠프

[사전캠프 13일차] 복습노트

티백고래 2025. 4. 2. 22:36

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;는 반복문에서, 해당 반복문을 그만두고 빠져나오도록 한다.

물론 정지하는 것은 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);

이렇게 작성하면 되는 것이다.

범위를 지정하지 않은 x값은 긴 수라도 나타나지만, K값은 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. 다음에 할 일은?

게임 속 상호작용을 분석해볼 것이다.