아마 대부분을 친구들이 로또로 대박! 나는 상상을 한번씩 해보셨을 거에요.
그 염원을 담아 이번에는 로또번호를 생성하는 프로그램을 만들어 볼거에요!
1부터 45까지 랜덤한 수를 뽑아오는 방식! 아 물론 보너스 번호도 잊으면 안되겠죠?
먼저 이 로또번호생성을 하기 위해 어떤것들을 알아야 할까요?
1.클래스
네 프로그래밍에서 정말 유명한 클래스가 나왔네요 클래스가 무엇일까요?
레고를 예를 들면 레고를 만들어 내기 위한 틀을 클래스 라고 합니다.
레고를 만드는 회사에 가면 액체로 된 플라스틱을 틀에 넣어 굳혀서 레고를 만든다고 한다면
그 레고를 만들 틀이 클래스가 되겠습니다.
크게 보아 사람을 만들기 위한 틀 비행기를 만들기 위한 틀 성를 만들기 위한 틀 등등이 많지요?
이렇게 내가 만들 틀을 총제적으로 담고 있는것이 클래스라고 합니다.
이 클래스로 만들어진 레고 하나하나를 인스턴스라고 합니다.
C#에서 클래스 선언은 어떻게 할까요?
class Program
{
}
프로그램이라는 클래스는 이렇게 표현 합니다.
그런데 저거 어디서 많이 본것 같지 않나요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DeepCopy { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } } | cs |
네 우리 헬로우 월드 프로그램을 만들때 만들었네요 가장 기본프로그램도 클래스를 이용한다는 점~
2. 클래스와 메서드
각각 클래스에서 동작을 하거나 부품을 이루는 것들을 모아두는 것을 메서드라고 합니다.
C언어 부터 배우신 분들은 함수라고도 하구요 이 메서드 는 크게 4가지를 통해서 구성됩니다.
메서드는 수학책에서 말하는 함수와 같습니다. 입력-> 메서드-> 출력 을 통해서 값을 바꾸거나 행위를 하는것을 말합니다
예를들어 피자를 반으로 자르는 메서드가 있다고 하면 피자한판 -> 피자자르는 메서드 -> 피자 반판 두개 이런식 으로요.
그렇다면 이 함수는 어떻게 만들까요?
일단 기본형을 봅시다
public void test (int a)
{
메서드 내용
}
2-1. public 은 이 메서드의 범위를 나타내 줍니다 public 공공재 느낌으로 아무나 같은 프로그램의 어떤 곳에서는 이함수는 사용해도 되 이런 느낌이라서 어디에서든 접근 할수 있습니다.
그외에 private protected internal 등이 있지만 이것 추후에 사용할때 봅시다!
2-2 void 는 메서드의 돌려주는 값을 나타냅니다 void는 말그대로 없어 안돌려줘! 이런 뜻이구요 int ,float, 로 하면 이 값을 돌려줍니다.
피자로 예시를 들자면 위에는 피자를 자르는 메서드이기에 피자를 자르고 2개로 내보낸다 기에 무엇인가를 반환해주는 메서드인데요
void가 있는 것은 안돌려 주어도 되! 그냥 실행만 해주어! 이런 뜻입니다. 돌려주는 것에 대해서는 사용할때 한번 봅시다!
2-3 . test 저는 테스트라고 썼지만 이 메서드의 이름이구요 자기 자신이 원하는 값 아무거나 써도 무방 합니다. 하지만 프로그래밍을 유지하고 부족한 부분에 대해서
보수하고 고쳐나가기 위해서는 알기쉽게 이름을 지어야 합니다!
2-4 . 마지막은 파라미터 라고 합니다. 이 매서드를 사용하기 위한 재료라고 생각 하시면 됩니다.
위에 예시로는 피자한판을 넣어야 함수가 실행이 되죠? 이 피자한판을 넣는 부분이 이 부분 입니다.
제가 예시로 만든 메서드는 꼭 숫자 하나(피자를)를 넣어야
작동한다는 뜻이겠네요. 저는 int를 썻지만 어떤 것을 써도 무방합니다!
3.클래스 사용하기
이렇게 레고틀을 만드는 방법을 알았으니 써보아야 겠지요?
Program이라는 메서드에는 '프로그램'을 출력하게
number라는 메서드에는 8을 출력하게 만들어 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace lottoNumber { class Program { public Program() { Console.WriteLine("프로그램"); } public void Number() { int a = 8; Console.WriteLine(a); } static void Main(string[] args) { Program p; //p라는 이름으로 Program 클래스를 예약하고 p = new Program(); //실제로 만듭니다 Program()메서드가 무조건 1회 실행됩니다 프로그램이 출력됨 p.Number(); //. 으로 그 메서드를 쓸수 있습니다 number메서드를 사용해서 8이 출력! } } } | cs |
Main()주석부분을 보시면 이해가 되실겁니다.
클래스의 이름인 Program과 똑같은 메서드가 있죠? 이 메서드를 생성자(Constructor)라고 합니다. 모든 변수를 초기화 해주듯이 클래스도 초기화를 한번 해주는 과정을
해주는 데요 이것을 생성자가 합니다. 클래스의 인스턴스가 생성돨때 꼭 한번 실행해야 합니다. 보통 이 생성자에 변수를 초기화하는 용도로 사용합니다.
4.새로운 레고 가져오기(Using)의 사용
프로그래밍을 레고에 비유해 본다면 우리가 원하는 프로그램을 만드는 것은 우리가 원하는 레고를 만드는 것으로 볼 수 있습니다.
하지만 우리가 레고를 아무것도 안샀는데 만들수 없죠? 해리포터 시리즈라던가 스타워즈 시리즈라던가 를 구입한후 그 레고들을 조립해서
우리가 원하는 새로운 세계관을 만들수 있죠? 그 새로운 레고를 가져 오는 것을 Using 이라고 생각하시면 됩니다.
지금 우리가 만들려는 프로그램은 Using System;에 전부 있으므로 지금은 사용하지 않아도 되구요 나중에 사용할때 자세히 보겠습니다.
6.단순형 자료와 클래스형 자료
단순한 자료는 선언하면서 할당이 됩니다 예를 들어서
int a; int형 변수 a가 메모리에 할당이 됩니다.
하지만 클래스형 자료는 명시적으로 선언을 하고 할등을 합니다 그예로 배열과 클래스등등 이 있습니다
Program p; 선언만 됨
p = new program(); 할당도 됨
int[] c; 선언만 됨
c = new int[10]; 할당도 됨
6.랜덤값(난수)생성과 어디까지?
로또 번호 생성을 하기 위해서는 System에 있는 레고에서 Random부분을 사용하면 됩니다!
어떻게 Random을 정말 균일하게 Random하게 나오게 할까? 하는 알고리즘은 수많은 대학의 전산학자들이 고민하는 문제구요
저희는 그걸 사용하면 됩니다!
명시적 선언 배웠죠? 해볼까요?
Random my_rand; 선언
int r_number; 랜덤하게 나온 수를 넣을 변수 할당
my_rand = new Random(); 랜덤한 수를 할당
r_number = myrand.Next(); 랜덤한 수를 r_number에 저장해 줍니다
하지만 저렇게 해주면 범위가 없죠? 우리 범위를 만들어 줍시다. Next() 메서드는 인자가 2개 입니다!
r_number = myrand.Next(1,11); 바로 어디부터 어디까지 랜덤하게 나와라! 하는 메서드 입니다. 그래서 이 소스는 1~10까지 랜덤하게 나오는 소스 입니다.
최대값인 11은 제외하고 그 아래수중 그러니까 1~10까지만 들어가게 되는것이죠! 그럼 로또번호로 하려면?
r_number = myrand.Next(1,46); 이렇게 하면 되겠죠?!?!
7.전체 마법(변수)과 지역 마법(변수)
변수를 선언하는 자리에 따라서 이 변수가 전체 마법을 쓴느 변수인지 그 지역에서만 마법을 쓰는 변수인지 나눌수 있습니다.
이 것은 간단한 코드를 보면서 알아 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace lottoNumber { class Program { int Computer; //전역변수입니다 클래스가 시작될때 생겨나 없어질때 소멸됩니다 public Program() { Console.WriteLine("프로그램"); } public void Number() { int a = 8; //이 메서드에서 나가면 없어집니다. Console.WriteLine(a); } static void Main(string[] args) { Program p; //p라는 이름으로 Program 클래스를 예약하고 p = new Program(); //실제로 만듭니다 Program()함수가 무조건 1회 실행됩니다 프로그램이 출력됨 p.Number(); //. 으로 그 함수를 쓸수 있습니다 number함수를 사용해서 8이 출력! } } } | cs |
아까의 코드에서 전역변수만 추가해 보았습니다 클래스 선언후에 바로 사용하는 전역변수!
메소드 내에서만 사용하는 지역변수 이제 이해가 가시겠죠?
8.이거 아니면 이거! Boolean형 변수
숫자를 막막 선언하는 변수와 글자를 선언하는 변수만 했는데 모든변수를 흑과 백으로만 보는 변수가 있습니다
바로
Boolean 입니다 이 변수는 True와 False만 가지는 변수로
Boolean isCheck = false;
if(true == isCheck)
{
}
if문의 조건문이나 값을 돌려줄때 많이 쓰입니다.
Tip! Tip
첫번째 팁 동일한 숫자 체크
에를 들어 a에 1~5까지 수가있고 b값을 하나 선언한후 동일한 값이 있으면 True 없으면 False값을 저장하려고 한다. 어떻게 하면 될까?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DeepCopy { class Program { static void Main(string[] args) { int[] a = new int[] { 1, 2, 3, 4, 5 }; int b = 3; Boolean isFind; isFind = false; for(int i=0;i<a.Length;i++) { if(a[i]==b) { isFind = true; } } } } } | cs |
두번째 팁 for에서 카운트 무시
for문에서 지정된 횟수까지 시행알 합니다. 하지만 중복이 있다면? 카운트 하기 싫다면?
for(int i=0;i<6;i++)
{
if(횟수를 가운팅 하지 말아야 할 조건)
{
}
}
세번째 팁! 클래스를 사용하는 기본틀
첫번째 메인에 주로 코딩하는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DeepCopy { class Program { public Program() { } static void Main(string[] args) { //여기에 주로 코딩 } } } | cs |
두번째는 Program 클래스를 프로그램의 주체를 하는 경우입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DeepCopy { class Program { public Program() { } public void run() { //여기에 주로 작성 } static void Main(string[] args) { //객체생성 시작점만 지정 Program p; p = new Program(); p.run(); } } } | cs |
첫번째 방법은 함수지향적 두번째 방법은 객체 지향적이라고 합니다 과거에는 객체지향적으로 해서 두번째가 많이 쓰이지만
요즘 새롭게 함수형 언어가 뜨면서 함수지향적도 괜찮은 방법입니다. 하지만 C#은 객체지향 언어이기 때문에 저는 객체지향중심으로
두번쨰 방법을 위주로 사용하겠습니다!
'Visual C# > Universal App' 카테고리의 다른 글
8. C# 강좌 가위 바위 보 (1) 알아야 할 것들 (0) | 2015.10.20 |
---|---|
7. C# 강좌 로또번호 만들기!(2) (0) | 2015.10.20 |
5. C# 강좌 성적 처리 프로그램 (2) (2) | 2015.10.19 |
4. C# 강좌 성적 처리 프로그램 (1) 알아야 할 것들 (2) | 2015.10.19 |
3. C# 강좌 Hello World 프로그램 (1) | 2015.10.18 |