본문 바로가기

[ Program ]205

47. 유즈케이스 모든 프로그램을 만들때는 과정이 단순하지는 않다. 보통 어떤 동작을 해야하는지 파악하고 해당 동작에 대해 이상없이 작동할수 있게 정리한후 해당 프로그램을 제작한다. 최종적으로 같은동작을 하더라도 사람마다 충분히 다르게 생각할수 있고 다른형태로 구성할수 있다. 그리고 같은사람이 같은 행동을 하는 프로그램을 만들더라도 매번 다른형태로 만들수도 있다. 프로그램이 간단해서 잠깐의 시간동안 제작가능한거라면 위의 생각하는 전체 과정을 머리속에 생각하면서 할수 있을것이다. 그런데 만약 프로그램이 하루만에 불가능하고 오래 걸린다면 내 머리속의 전체 과정을 계속 같은형태로 유지할수 있을까? 물론 다 기억할수도 있겠지만 간단하게 기록해두거나 하면 그 기록을 보면서 제작의 일관성을 높일수도 있고 생각하지못해 빠뜨린부분도 체.. 2021. 10. 9.
46. 엑셀파일읽기 ***숙제 : 위그림처럼 엑셀파일경로를 지정해서 내용을 읽어오는 프로그램을 만들어보자. 2021. 10. 9.
45. 파일읽기/쓰기 파일을 읽고 쓸려면 File 클래스를 사용하면 된다. https://docs.microsoft.com/ko-kr/dotnet/api/system.io.file?view=net-5.0 File 클래스 (System.IO) 단일 파일에 대한 만들기, 복사, 삭제, 이동 및 열기를 위한 정적 메서드를 제공하고 FileStream 개체 만들기를 지원합니다.Provides static methods for the creation, copying, deletion, moving, and opening of a single file docs.microsoft.com 기본적인 내용은 위 경로를 읽어보자. 파일이나 DB 또는 네트워크로 데이터를 전송할때 대부분의 경우 내용을 변환해서 서로 주고 받게 되는데 이과정에서 데.. 2021. 10. 9.
44. 로또생성기만들기 ***숙제 : 위그림처럼 번호받기 누르면 번호와 보너스 번호가 출력되는 로또생성기를 만들어보자. 2021. 10. 9.
43. 제네릭 제네릭은 한마디로 이야기하면 배열을 어떤형식으로 사용할지 미리 정해주는것이다. 프로그램에서 형변환은 자원을 많이 먹는 작업이다. 예를 들면 int > object > int 로 형변환을 차례로 한다고 치면 상당히 쓸모없는작업이 많아진다. 이전에 잠시 설명했지만 arrayList 에 인자를 추가하면 어떤값이든 object 로 변환해서 들어가진다. 그상태에서 사용할때는 해당형식으로 또 변환을 해줘야한다. 특별한 근거없이 생각해봐도 아무 쓸모없는행동이 많아진다. 가장기본적인 형식중 하나인 List 예제를 보자. List 변수 = new List(); 위와같이 지정하고 쓰기만 하면된다. 타입에는 내가 해당 List 에서 사용할 실제 타입을 넣어주면 된다. 예를들면 int , string, 개인이 만든클래스 , .. 2021. 10. 9.
42. 상속 상속은 쉽게 생각하면 진짜 말그대로의 의미이다. 부모클래스를 그대로 받아온다. 간단히 몇가지 형태를 알아보자. 그림0에 몇가지 기본형태에 대한 예제를 올려놨다. 일단 parent_class0 과 chile_class0 은 완전히 서로 다른 클래스이다. 다만 상속을 받아서 편의상 부모클래스와 자식 클래스라고 불렀으니 해당 단어에 너무 집착하지는 말고 예제를 보자. 기본적으로 생각하면 child_class0 은 parent_class0 을 상속 받았으니 자식클래스인 child_class0 에서는 부모클래스인 parent_class0 의 모든메서드(함수)를 사용가능하다. 위 내용을 기본으로 load 에서 객체로 만든 한줄씩 살펴보자. (load 는 프로그램이 시작되자마자 실행됨을뜻한다. 디자이너에 있는 For.. 2021. 10. 9.
41.arraylist / List / StringBuilder / 참조추가법 이제까지 배운내에서 배열은 꼭 필요하지만 상당히 불편한 존재였다. 아니 다른걸 배우지 않으면 불편하다고 느끼지 못했을지도 모르겠다. 기존의 배열은 항상 길이를 정해두거나 초기화 할때 값을 넣어줘야했다. 그런데 만약 값이 몇개가 들어갈지 모르는 상황이 온다면 어떻게 해야할까? 당연히 프로그램을 하다보면 그런상황이 수도없이 발생한다. 예를 들면 소수(1과 자신만을 약수로 가지는수) 의 개수를 1000이내에서 구하는 배열을 만들려면 길이를 몇개로 해야할까? 외우고 있는 사람아니면 보통사람은 알수 없다. 그래서 동적으로 할당할수 있는 배열이 있다. 다음예제를 보자. ArrayList myAL = new ArrayList(); myAL.Add("Hello"); myAL.Add(1); myAL.Add(false);.. 2021. 10. 9.
40.using/garbage collection 우리가 클래스 객체를 생성할때 new 를 사용하여 객체를 생성했다. 그런데 객체를 계속 생성하기만 하면 어떻게 될까 라고 생각해볼수 있다. pc의 메모리는 유한하기때문에 계속객체를 생성하기만 하면 메모리에 수많은 객체가 올라갈것이고 결국 피씨는 다운되거나 제기능을 할수 없을것이다. 그래서 c# 이나 자바에서는 가비지 컬렉션이라는 기능이 있다. 쉽게 생각하면 자동으로 사용하지않는객체를 없애주고 메모리를 청소해주는 기능이라고 생각하면된다. 이 가비지 컬렉션에 대해서는 인터넷에 찾아보면 다양한 의견들이 있고 이야기가 있는데 전체적으로 보면 임의로 호출하는데 상당히 부정적인것을 알수 있다. 결국 알아서 잘하니 임의로 가비지 컬렉션을 하지말고 놔두면 프로그램에 가장좋다고들 이야기한다. 그런데 개인적으로 얼마전 어.. 2021. 10. 9.
39.property(속성) 클래스의 맴버필드값을 직접적으로 접속해서 값을 바꾸고 값을 가져오고 하는 행위를 대신해주는 속성이라는것이 있다. 보통 클래스를 만들면 클래스의 맴버필드값에 따라 어떤 행위를 할지 정해주는 경우가 많은데 그렇게 하다보면 실수가 발생할수 있다. 아래 예제를 보자. 그림1과 같은 코드의 경우에 _dclass 의 _classcreatetime 값을 마음대로 변경해서 출력해버렸다. 최초 클래스 작성자의 의도는 그것이 아니었을텐데 이런경우 잘못된 행동을 한다고 할수 있다. 이런경우 그림2처럼 맴버필드는 private 으로 변경하고 속성은 get 만 놔둔다면 위와같은 문제는 발생하지 않을것이다. 이렇게 맴버필드를 숨기는걸 은닉화한다고 한다. 위와같은경우 속성대신 함수를 사용해도 충분히 같은 역할을 할수 있다. 나는 .. 2021. 10. 9.
38.const/enum/struct 여러값을 하나의 형태로 묶어서 사용하고 싶을때 사용할수 있는 enum 이라는 것이 있다. msdn에 찾아보면 다음과 같이 정의 되어있다. 열거형 형식은 명명 된 상수 집합을 선언 하는 고유한 값 형식 (값 형식)입니다. 상수는 우리가 배우지 않았는데 변수의 반대개념이라고 생각하면 된다. 한번 정의해 놓고 프로그램내에서 계속 사용할때 해당값을 변수에 담지 않고 상수로 선언해주고 사용할수 있다. 그림1에서 보면 상수와 변수의 차이를 알수 있다. c# 에서는 상수를 사용할때 const 나 readonly 를 사용할수 있는데 const는 컴파일 타임상수 이고 readonly 는 런타임 상수이다. 즉 const 는 처음 빌드할때 만들어져서 값이 변하지 않는채로 고정되고 고정할수도 없다. member_name1 을.. 2021. 10. 9.
37.DateTime,static 프로그램을 만들면서 상당히 자주 사용되는 형식과 컨트롤등을 몇가지 알아보고 넘어가자. DateTime 는 날짜 형식인데, 일반적인 변수처럼 사용하면 된다. 단, DateTime 은 클래스이기때문에 new 로 객체를 생성해서 사용해야한다. DateTime 변수를 하나 만들고 우클릭으로 정의로 이동해서 내용을 살펴보자. 내부에 들어가보면 수많은 생성자와 함수들이 있다. 그런데 함수중에 보면 static 이 붙은 함수들이 있다. 이함수들은 객체화 시키지 않아도 사용할수 있다는 의미이다. 그림1처럼 dt 라는 새로운 변수를 지정하고 new 로 새로운 객체를 만들었다. 그리고 dt.AddDays(10); 를 해주면 dt 의 기본값에 10일을 더해주게 된다. 이런형태가 기본적인 클래스를 객체로 만들고 객체에 속해있.. 2021. 10. 9.
36.클래스(전역변수/지역변수), 실제사용법 클래스로 들어오면서 구역개념이 생긴다. 다음예제를 보자. public class testc { private int _num = 10; public int getnum() { return _num; } public void addnum(int num) { int n = _num; n += num; _num = n; } public void multyplenum(int num) { int n = _num; n *= num; _num = n; } } 참고로 일부러 쓸데없는 코드들이 추가 되있다. 위 클래스에서 addnum 메서드(=함수)를 보자. num 을 파라미터(=매개변수=인자) 로 받고 함수내부에 n 을 정의하고 더해줬다. 그리고 _num 인 필드에는 파라미터로 받은 num 을 더해줬다. 그리고 밑에 .. 2021. 10. 9.
35.클래스(생성자오버로딩) 생성자는 오버로딩도 가능하다. 글자만 보면 무슨말이지 할수도 있다. 둘다 앞에서 각각 배운개념이다. 다시 우리가 계속 사용하던 MessageBox 를 살펴보자. 그림1을 보면 이제 이해가 좀 될것이다. MessageBox 라는 클래스 였던것이다. 이클래스는 닷넷프레임워크 내에 미리 만들어져있다. 그리고 Show 함수는 앞에도 이야기 했지만 여러형태로 사용할 수 있게 오버로딩이 되어있다. MessageBox 에서 마우스 우클릭하면 위와 같이 나오는데 정의로 이동을 눌러보자. 모든클래스에서(내가 직접만든 클래스도) 우클릭으로 정의로 이동하여 찾아갈수 있다. 정의로 이동해서 옴겨가면 그림3과 같은 화면이 나온다. 왼쪽에 + 누르면 펼쳐지는데 한번씩 열어서 읽어보자. 제일위에 어셈블리는 실제 물리적인 파일을 의.. 2021. 10. 9.
34.클래스(생성자,소멸자) 앞에서 은근히 계속 이야기하던 클래스라는것에 대해서 배워보자. 클래스는 쉽게 말하면 함수들을 모아놓은것이다. 앞에 그림에서도 이야기했지만 네임스페이스 ᑐ 클래스 ᑐ 함수 로 생각하면 된다. 함수에 비해서 클래스는 범위도 넓고 더 많은 내용을 가질수 있다. 뿐만아니라 아예 파일을 분리하는것도 가능하다. 그리고 클래스는 앞에서 말하던 하나의 객체로 만들수 있다. 기본적인 클래스의 형태는 대체로 다음과 같다. 참고로 메서드 = 함수 이다. class 클래스명 { 필드 메서드() { } } 위에서 필드라고 했는데 필드 = 변수 라고 생각하면된다. 필드가 없을수도 있고 메서드가 없을수도 있다. 심지어 둘다 아무것도 없이 만들수도 있다.(당연히 아무의미 없겠지만) 클래스는 객체로 만들수 있는데 객체로 만들때는 ne.. 2021. 10. 9.
33.갑자기실습 우리 프로그램에 프레임이 9개가 있다. 그런데 각 사용자가 제외할 프레임만 입력하면 그프레임이 작동하지 않게 하고 싶다. 당연히 사용자는 어떤 프레임을 제외하고 싶은지 알수없다. 텍스트박스에 사용자가 제외할 프레임을 이어서 작성하면 제외될 프레임이 순서대로 출력되게 만들자. 프레임은 9개다. ex) 사용자가 텍스트박스에 4825 입력하면 2,4,5,8 이 팝업창에 떠야함. ex) 사용자가 텍스트박스에 9,4 입력하면 4,9 이 팝업창에 떠야함. ex) 사용자가 텍스트박스에 a428 입력하면 2,4,8 이 팝업창에 떠야함. hint) 0 ~ 9 까지만 정렬하면 된다. ***숙제 : 위에 설명한 프로그램 만들기가 숙제. 2021. 10. 9.
32.인텔리센스/오버로딩 인텔리센스는 프로그램을 편하게 할수있게 해주는 가이드이다. 비주얼스튜디오 에서 제공하는 내용으로 이클립스에서도 비슷한 기능이 있다. 우리는 메세지 출력할때 MessageBox 를 입력하고 . 을 누르면 Show 라는 함수를 쉽게 쓸수있고 파라미터로 어떤값을 넣어줘야하는지도 나온다. 만약 우리가 비주얼스튜디오가 아닌 메모장에서 해당코드들을 직접입력하면 저런도움을 받을수 없다. 내가 아는 한도내에서는 비쥬얼스튜디오처럼 인텔리센스 기능이 잘되있는 툴은 없다. 우리가 계속 사용하고 있는 MessageBox 기준으로 알아보자. MessageBox 를 코딩하고 . 을 찍으면 MessageBox 에 있는 사용가능한 것들이 나온다. MessageBox 라는 클래스에 속하는 함수들인데 그중 우리는 Show 를 선택해서 .. 2021. 10. 9.
31.업데이트내역 프로그램만들기 / splite string 에는 여러가지 사용가능한 함수들이 있다.(string 은 클래스다.) 그중 splite 함수는 상당히 자주쓰이는데 문자를 특정기준으로 잘라서 배열로 만들때 사용한다. 아래 예제를 보자. 그림1은 str string 을 , 기준으로 나눠서 변수에 담는다는 의미이다. 그러면 strarray 에는 [0] 번에는 "가" , [1] 번에는 "나" 이런식으로 "사" 까지 글자가 자동으로 잘라져서 들어간다. 위 예제에서는 , 기준으로 잘라서 그렇게 들어가는것이고 만약 str.Split('다') 라고 했다면 어떻게 잘라질지 확인해보자.(숙제) 숙제 ***숙제 : 위 그림처럼 "업데이트함" 버튼을 누르면 업데이트할 호기중 해당 호기가 빠진 나머지 업데이트할 호기가 남은 업데이트 호기에 보이게 프로그램을 만들.. 2021. 10. 9.
30.함수2 함수에 대한 기본적인 내용은 앞장들에서 다 설명한거같다. 참고로 함수 = 메서드 라고도 부른다. 다시 내용을 상기시켜보면 함수의 기본형식은 다음과 같다. 함수명() { 작업할내용 } ( ) 괄호가 특정이름뒤에 붙어있으면 함수이고 최소 단위라고 생각하면 된다. 당연한 말이지만 한 클래스 내에는 여러개의 함수가 존재할 수 있다. 물론 한 네임스페이스 내에 여러개의 클래스도 존재할 수 있다. 함수에서 받는 파라미터는 몇가지 형태가 있다. 가장기본적인 형태는 다음과같다. 함수명(형식 변수명) { 작업할 내용 } 예제는 다음과 같다. public string testf(string str) { return $"{str} 을 리턴함"; } 위 예제는 이제 다 이해할수 있을거라 생각한다. 그림1 과 같은 예제가 있다.. 2021. 10. 9.
29.접근제한자, 네임스페이스 , 클래스 프로그램을 하면 혼자 다하는게 아니라 여러사람이 함께 하게 된다. 그런데 한명이 작업중에 다른사람이 같이 작업하는건 상당히 난감한일이 된다. 같은 부분을 어떤사람은 이렇게 만들고 다른사람은 다르게 만들수도있다. 그래서 함수만으로는 분업이 힘들거라 생각한 똑똑한 사람들이 그 윗단계로 나눌수 있는 덩어리들도 만들어뒀다. 그게 클래스이다. 자세한 내용은 나중에 다시 하고 함수처럼 특정행동을 할수 있는 더 큰 단위로 클래스가 있다 라고만 알고 넘어가자. 네임스페이스 역시 같은 의미이다. 네임스페이스는 자바에서는 패키지라고부르고 사용한다. 별로 어렵게 생각할거없이 그림1과 같은 구조이다. 주의 할점은 상위그룹내에 하위 그룹의 명칭은 유일해야한다는 것이다. aa 라는 클래스가 있다면 그내부에 bb() 라는 함수가 .. 2021. 10. 9.
28.함수1 프로그램에서 거의 모든 기본 개념은 함수에서 출발한다. 함수는 특정행동을 하는 내용을 모아놓은 덩어리라고 생각하면 된다. 우리가 이때까지 만들던 프로그램은 버튼클릭했을때 작동하게 만들었다. 만약 버튼이 여러개 있는데 다 똑같은 동작을해야할때 어떻게 해야할까? 물론 버튼마다 다 실행되야하는 내용을 적어주면 된다. 그런데 너무 소스가 길어지고 만들어야할게 많다. 비슷한동작이나 같은동작을 할경우는 해당 내용을 한군데 적어놓고 그거 실행하라고 하면 더 편할것이다. 함수의 기본형식은 다음과 같다. 함수명() { 실행할내용 } 언어에 따라 아래와같이 함수명 앞에 function 을 붙여 주는 언어도 있다. function 함수명() { 실행할내용 } c#이나 자바같은경우는 위 기본형식외에 추가적으로 몇가지 내용을 .. 2021. 10. 9.
27.Object 나도 잘하지않지만 모르는게 나오면 msdn 을 찾아보면 좋다. 전체적인 내용이 잘나와있는데 사실 풀어쓴 사람들의 블로그같은 글이 보기 더좋지 사전같은 msdn 은 찾아보기 힘들긴하다. docs.microsoft.com/ko-kr/dotnet/api/system.object.-ctor?view=net-5.0#System_Object__ctor Object 생성자 (System) Object 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the Object class. docs.microsoft.com docs.microsoft.com/ko-kr/dotnet/api/system.string?view=net-5.0 String 클래스 (System) 텍스트를 UTF-.. 2021. 10. 9.
26.구구단출력기 만들기 ***숙제 : 그림1과 같은 프로그램을 만들어보자. 버튼을 누르면 결과값이 나와야한다. 2021. 10. 9.
25.사칙연산기 만들기 배운것들을 활용해서 간단한 프로그램을 만들어보자. ***숙제 : 그림1과 같은 프로그램을 만들어보자. 버튼을 누르면 결과값이 나와야한다. 2021. 10. 9.
24.반복문2 - while , foreach 배열과 반복문은 상당히 밀접한 관계가 있어 둘을 병행하면서 진행중이다. 이전에 for 문을 배웠는데 내용은 알고 있을거라고 생각한다. for 문 외에도 while 과 foreach 는 상당히 자주 사용된다. while 문 같은 경우는 기본이 무한반복이다. 기본 형식은 다음과 같다. while(조건) { 실행내용 } 10보다 작은 양의 정수를 출력하는 예제를 보자. int i = 1; while(i 2021. 10. 9.
23.배열2 앞에서 배운 배열은 1차원 배열이다. 그림1에서 보면 빨간색 네모 각각이 데이터라고 생각하면 된다. 1차원은 데이터를 한줄로 나열한것이고 2차원은 엑셀처럼 가로세로 , 3차원은 2차원의 각각의 셀에 다시 1차원처럼 데이터를 나열한것이다. 실제로 프로그램 하다보면 게임 프로그램이 아닌경우는 2차원배열이나 3차원배열을 사용할경우는 잘없다. 나중에 오픈cv 를 공부하다보면 그나마 영상을 저장하거나 할때 2차원배열이 필요할걸로 생각된다. 다차원 배열선언은 다음과 같다. // 1차원 배열 string[] players = new string[10]; string[] Regions = { "서울", "경기", "부산" }; // 2차원 배열 string[,] Depts = {{"김과장", "경리부"},{"이과장",.. 2021. 10. 9.
22.배열1 반복문은 배열과 대부분 같이 쓰인다. 배열이란 동일한 형태의 값을 일렬로 늘어놓은것이다. 우리는 마트에서 사과 , 바나나 , 멜론 , 포도 등이 같이 있으면 과일코너 라고 인지할 수 있다. 만약 다른사람과 전화해서 내위치를 이야기할때 과일코너에 있다고 말하지 사과 , 바나나 , 멜론 , 포도 등등 여러가지가 있는 곳에 있다 라고 이야기하지는 않을것이다. 배열은 이처럼 내가 사용할 여러 데이터들을 하나의 명칭으로 표현하고 말할수 있게 하기위한 도구이다. 가장 기본형식은 아래와 같다. 형식[] 배열명 = { "값1","값2"... }; [] 는 [ ] 두개 붙여쓴문자다. 예제로 확인해보면 아래형태이다. string[] myperson = { "나" , "상상의동물여친" , "효도하자부모님" }; mypers.. 2021. 9. 26.
21.반복문1 - for 반복문은 반복된 작업을 단축해서 표시하는 내용이다. 같은내용을 여러번 반복해서 해야 하는경우 여러번 같은 내용을 써주는 것보다 이내용을 몇번실행해라 라고 명령하는것이 당연히 효율적일것이다. 예를 들면 "출력,출력,출력.... , 출력" 하고 백번 써주는것보다 "출력백번해라" 라고 써주는게 효율이 좋다는 의미이다. 프로그램에서도 반복문은 아주중요하다. 계속 이야기하듯이 분기문과 반복문만 할줄알면 모든 프로그램을 다만들수 있다. 반복문은 for , foreach , while 등이 있는데 가장기본적인 for 문부터 알아보자. 기본 형식은 다음과 같다. for(시작값;반복이종료될조건;증감값) { 실행할 내용 } 시작값은 변수를 입력하면 되고 반복이 종료될조건은 반복문이 종료될 조건을 지정해주면 된다. 증감값은.. 2021. 9. 26.
20.조건문(분기문) 실습1 분기문은 계속 이야기하지만 가장중요한 내용이다. 앞에서 나온내용들로 프로그램을 만들어보자. 종합적인 내용으로 난이도가 있을걸로 생각되어 2개수업에 걸쳐 진행한다. 숙제 ***숙제 : 위 숙제 같은 형태의 폼을 만들고 필요한 작업화 버튼을 눌렀을때 아래 형태로 출력할것 힌트 : string 타입변수에 Environment.NewLine 을 더해주면 줄바꿈이 된다. 힌트 : string totalresult = ""; int size270 = 0; string size270person = ""; int size275 = 0; string size275person = ""; int size280 = 0; string size280person = ""; 최초변수를 위와같이 정의해보자. 이름1,이름2,이름3 의 .. 2021. 9. 20.
19.조건문(분기문) , bool형식 , 논리연산자3 - switch 조건문에는 if 문 외에 switch 문도 있다. 전체 형식은 다음과 같다. 변수 switch(변수) { case 비교대상값(상수): 실행할내용 break; case 비교대상값(상수): 실행할내용 break; default: 실행할내용 break; } 위 형식만으로는 이해가 잘가지 않을테니 예제를 한번 보자. int a = 10; switch( a ) { case 10: MessageBox.Show("a의 값은 10입니다."); break; case 20: MessageBox.Show("a의 값은 20입니다."); break; default: MessageBox.Show("a의 값은 10입니다."); break; } 일단 위예제를 실행하면 10이 나오는데 하나씩 뜯어보자. 최초 a 라는 변수를 선언후 s.. 2021. 9. 20.
18.조건문(분기문) , bool형식 , 논리연산자2 - if 앞장에서 조건문중 if 문 형식을 확인했다. if(조건) { 조건이 참일때 실행할내용 } else { 조건인 거짓일때 실행할내용 } 기본형태는 위와 같은데 여러가지 다른형태로 사용할 수도 있다. 아래 형식들을 보자. if ( 조건 ) { 조건이 참일때 실행할 내용 } if ( 조건 ) { 조건이 참일때 실행할 내용 } else if ( 조건 ) { 첫번째 if 에 걸리지않은 값들중 조건이 참일때 실행할 내용 } if ( 조건 ) { 조건이 참일때 실행할 내용 } else if ( 조건 ) { 첫번째 if 에 걸리지않은 값들중 조건이 참일때 실행할 내용 } else { 위 if 나 else if 에 걸리지않은 값들을 실행할 내용 } 위 형식들을 보면 else if 가 있고 else 가 있다. else if.. 2021. 9. 20.