티스토리 뷰
로또번호 생성 프로그램 Step1 #C# #씨샵 #작은프로젝트 #random함수 #predicate #초보자
배곧동개발자 2023. 6. 23. 13:35
안녕하세요,
배곧동개발자 입니다.
"뭐를 하면 재미가 좀 있을까?"
고민을 하던 중 C#을 이용한 간단한 윈도우앱, jsp를 이용한 간단한 웹사이트, flutter를 이용한 웹앱 등 아주 작지만 소중한 프로젝트들을 해보며 여러 개념들을 정리해보는 이름하여 "작은프로젝트" 를 해보면 좋겠다 생각했어요-
이젠 너무 당연하게 의미도 모르고 쓰던 함수들이나 개념들에 대해 설명도 적어보고 새로운 방향으로 로직도 짜보며 나의 실력을 점검해보는 귀한 시간이 될듯합니다!
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif)
작은프로젝트의 첫번째 희생양(?)은 바로바로~ "로또번호 생성 프로그램" 입니다.
언어는 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)) 는 값이 들어있지 않으면~ 이라고 해석이 되는거죠!
※※ 이해 안되면 댓글 달아주세요! 이해 될때까지 설명해드릴게요! ※※
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/032.gif)
자, 그래서 이렇게 만든 코드를 돌려봅시다.
뭔가가 조금 이상하죠? 중복이면 중복이라고 뜨는것까지는 좋은데, 내가 원하는건 숫자 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++;
}
}
이렇게 해서 한번 돌려볼까요?
아주 잘 나옵니다!
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif)
이제 숫자 5개 랜덤으로 뿌려주는 것은 완성 했습니다!
간단하게 random함수 하나 써서 끝낼 줄 알았는데 그게 아니였죠? 재밌고 또 재미있는 개발의 신비!!
그러면 이제 다음 포스팅에서는 내가 원하는 게임의 수만큼 랜덤한 값을 뽑아내어 이쁘게 폼까지 입혀보는 시간을 가져볼게요-
이만,
배곧동개발자 였습니다.
다음글
로또번호 생성 프로그램 Step2 #C# #씨샵 #작은프로젝트 #userControl #Rectangle #동그라미 #안에글씨 #초
안녕하세요, 배곧동개발자 입니다. "뭐를 하면 재미가 좀 있을까?" 고민하다 간단한 프로젝트를 통해 여러 언어들의 개념을 다시 정립해보고자 시작한 별거없고 작지만 소중한 "작은 프로젝트"
yongtech.tistory.com
'프로그래밍 > 작은 프로젝트' 카테고리의 다른 글
로또번호 생성 프로그램 Step2 #C# #씨샵 #작은프로젝트 #userControl #Rectangle #동그라미 #안에글씨 #초보자 (0) | 2023.06.26 |
---|
- Total
- Today
- Yesterday