티스토리 뷰

반응형

 

 

 

안녕하세요,
배곧동개발자 입니다.

 

 

"뭐를 하면 재미가 좀 있을까?" 

 

 

 

고민을 하던 중 C#을 이용한 간단한 윈도우앱, jsp를 이용한 간단한 웹사이트, flutter를 이용한 웹앱 등 아주 작지만 소중한 프로젝트들을 해보며 여러 개념들을 정리해보는 이름하여 "작은프로젝트" 를 해보면 좋겠다 생각했어요-

이젠 너무 당연하게 의미도 모르고 쓰던 함수들이나 개념들에 대해 설명도 적어보고 새로운 방향으로 로직도 짜보며 나의 실력을 점검해보는 귀한 시간이 될듯합니다!

 

 

 

 

작은프로젝트의 첫번째 희생양(?)은 바로바로~ "로또번호 생성 프로그램" 입니다.

언어는 C# 윈도우폼을 이용할거고 아주 간단히 짤거니까 함께 해봅시다!

 

 

 

 

이런식으로 내가 원하는 게임의 숫자를 넣으면 해당 수만큼 5개의 랜덤한 숫자를 알려주는 방식으로 짜볼텐데요-

먼저 랜덤으로 5개의 숫자를 가져오는 함수부터 만들어내봅시다.

 

 

 

5개 숫자 랜덤 함수


윈폼에다가 아래와 같이 간단한 폼을 짜봅시다. button 하나랑 richTextBox 하나!

button을 누르면 5개의 숫자가 richTextBox에 나오도록 만들어볼거에요-

 

 



C#에서는 랜덤한 값을 가져올 때에 사용하는 함수로 Random 함수가 있습니다.

Random rand = new Random();
int num = rand.Next(1, 45);


이렇게 rand라는 변수로 선언 한 다음 Next함수를 사용하는데, 파라미터로 최소값, 최대값을 넘길 수 있습니다! 우리는 로또번호를 얻기 위함이므로 1~45까지의 난수를 생성시켜봅니다.

그리고 5개의 숫자를 얻어야되기에 for문을 이용해서 5번 반복시켜서 아까 만들었던 richTextBox에 뿌려줄게요-

물론 button에 이벤트 넣어줘야겠죠?

private void button1_Click(object sender, EventArgs e)
{
    getNumber();
}


private void getNumber()
{
    richTextBox1.Text = "";
    Random rand = new Random();

    for(int i=0; i<5; i++)
    {
        int num = rand.Next(1, 45);
        richTextBox1.Text += num.ToString() + "\n";
    }
}

 

자 한번 돌려보면 아래처럼 나올거에요-

 

 

 

뭔가 조금 이상하죠? 중복된 숫자가 나옵니다!

 

이러면 안되지요! 개인적으로 생각하는 개발의 꽃, 예외처리를 해 가봅시다-

 

// list에 값이 들어있지 않은 경우 list에 넣은 후 값 출력
if(!numList.Exists((_num) => _num == num))
{
    numList.Add(num);
    richTextBox1.Text += num.ToString() + "\n";
}
// list에 값이 있으면 중복이라고 출력
else
{
    richTextBox1.Text += num.ToString() + "는 중복\n";
}

 

numList라는거 하나 만들어서 내가 이전에 뽑은 값인지를 체크 후 값이 있다면 중복이라고 띄우고 없다면 값을 넣어주게 만들어봤어요-

 

여기서 좀 보셔야할게 numList.Exists라는 함수의 파라미터로 이상한게 들어가있죠? 

 

!numList.Exists((_num) => _num == num)

 

List의 Exists 함수는 파라미터로 Predicate<int> 를 받게되어있는데, 이게 무엇일까요?

 

 

 

반응형

 

 

진짜 엄청엄청 쉽게 말해서, 파라미터에 return값이 true, false로 떨어지는 함수가 들어가야한다는 겁니다.

 

Boolean tempFunction(_num){
	return (_num == num);
}

 

(_num) => _num == num 이거를 풀어보자면  위와 같이 되는거고, 설명해보자면

 

 

List에 있는 각각 요소(_num)마다 num과 비교해서 true, false를 리턴해준다

 

 

 

고 보시면 됩니다. 그래서 if(!numList.Exists((_num) => _num == num)) 는 값이 들어있지 않으면~ 이라고 해석이 되는거죠!

 

이해 안되면 댓글 달아주세요! 이해 될때까지 설명해드릴게요! 

 

 

 

 

자, 그래서 이렇게 만든 코드를 돌려봅시다.

 

 

 

뭔가가 조금 이상하죠?   중복이면 중복이라고 뜨는것까지는 좋은데, 내가 원하는건 숫자 5개라구!

 

for문으로 5번을 돌리니까 이런 문제가 생기는거죠! 어떻게 하면 좋을까요? 당장은 두가지 방법이 딱 떠오르네요!

 

 

1. i-- 

 

개발경력 11년차에 이렇게 쓰는 사람 아직 못봤지만, 작은프로젝트는 하나하나 뜯어보고 공부해가는 의미이므로 한번 생각해봤어요.

 

먼저 for문이 동작하는 원리를 보면 i값이 +1 되면서 횟수가 증가하죠? 중복이라면 그 증가된 1을 i-- 로 빼줘버립니다.

 

for(int i=0; i<5; i++)
{
    int num = rand.Next(1, 45);

    // list에 값이 들어있지 않은 경우 list에 넣은 후 값 출력
    if(!numList.Exists((_num) => _num == num))
    {
        numList.Add(num);
        richTextBox1.Text += num.ToString() + "\n";
    }
    // list에 값이 있으면 갯수 빼기
    else
    {
        i--;
    }
}

 

어떻게 보면, for문에 대해 잘 이해하고 있는 사람이 이렇게 생각하겠구나 싶네요!

 

 

2. while으로 변경

 

이게 가장 많이 사용하시는 방법일거에요! while문으로 변경해서 cnt를 이용해 횟수를 정하는 것이지요-

 

int cnt = 0;

while(cnt < 5)
{
    int num = rand.Next(1, 45);

    // list에 값이 들어있지 않은 경우 list에 넣은 후 값 출력
    if (!numList.Exists((_num) => _num == num))
    {
        numList.Add(num);
        richTextBox1.Text += num.ToString() + "\n";
        cnt++;
    }
}

 

이렇게 해서 한번 돌려볼까요?

 

 

 

 

아주 잘 나옵니다!

 

 

 

이제 숫자 5개 랜덤으로 뿌려주는 것은 완성 했습니다!

 

간단하게 random함수 하나 써서 끝낼 줄 알았는데 그게 아니였죠? 재밌고 또 재미있는 개발의 신비!!

 

그러면 이제 다음 포스팅에서는 내가 원하는 게임의 수만큼 랜덤한 값을 뽑아내어 이쁘게 폼까지 입혀보는 시간을 가져볼게요-

 

 

이만,

배곧동개발자 였습니다.

 

 

 

다음글
 

로또번호 생성 프로그램 Step2 #C# #씨샵 #작은프로젝트 #userControl #Rectangle #동그라미 #안에글씨 #초

안녕하세요, 배곧동개발자 입니다. "뭐를 하면 재미가 좀 있을까?" 고민하다 간단한 프로젝트를 통해 여러 언어들의 개념을 다시 정립해보고자 시작한 별거없고 작지만 소중한 "작은 프로젝트"

yongtech.tistory.com

 

 

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday