목록분류 전체보기 (420)
외로운 Nova의 작업실
안녕하세요. 오늘은 저번시간에이어 c#의 일반화 프로그래밍과 예외처리를 배워보도록 하겠습니다. 일반화 프로그래밍은 객체들의 공통점을 찾아서 일반화 하는 프로그래밍을 말합니다. 예를들어 int[], string[], double[] 객체들의 공통점은 배열이라는 것입니다. 일반화 프로그래밍은 다음과 같은 상황일때 유용합니다. 1.배열을 copy하는 copyarray 객체를 만들었습니다. class CopyArray { } 2. int[]배열을 copy하는 메소드를 만들었습니다. class CopyArray { public void Copyint(int[] a, int[] b) { for(int i = 0; i < a.Length; i++) { a[i] = b[i]; } } } 3.쓰다보니 string[]배열..
안녕하세요. 오늘은 저번시간에 이어 c#의 배열에 대해서 알아보겠습니다. 배열은 c언어와 개념이 똑같습니다. 고로 생성하는 법을 알아보겠습니다. 코드를 보시죠 using System; namespace StudyCSharp { class MainApp { static void Main(string[] args) { int[] score = new int[4]; //크기가 4인 배열 생성 score[0] = 0; score[1] = 1; score[2] = 2; score[3] = 3; } } } 위 코드처럼 배열을 생성할 수 있습니다. c#은 특별하게 ^연산자가 있습니다. 배열의 마지막이라는 뜻을 가지고있습니다. 예를들어 ^1은 배열의 마지막에서 첫번째를 의미하는 수입니다. 코드를 보시죠. using S..
안녕하세요. 저번시간에 이어 오늘은 c#의 인터페이스에대해 알아보겠습니다. 인터페이스는 프로그래머들간의 약속을 위해 탄생했습니다. "우리 robot 객체는 움직이는 move 메소드와 말하는 speak 메소드는 꼭 만들자" 라고 메소드의 이름과 내용등을 정합니다. 그래서 인터페이스의 정의는 아래와 같습니다. interface IRobot { void Move(); //움직이는 메소드 void Speak(); //말하는 메소드 } 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만을 약속할 수 있습니다. 프로그래머는 이 인터페이스를 '상속'하여 사용하게됩니다. 상속하게되면 '무조건' 인터페이스에서 약속한 메소드는 꼭 구현해야합니다. 구현을 안하고 컴파일하게되면 컴파일러가 오류를 냅니다. 상속하는 것은 클래스랑..
안녕하세요. 오늘은 접근한정자에이어 클래스에 대해 좀 더 알아보도록 하겠습니다. 다시 한번 말씀드리지만 해당 설명은 c언어를 마스터하신분들께 적합한 내용입니다. c언어 책을 한권이라도 읽지않으신 분은 이해하시기 어려울것입니다. 그럼 상속에대해서 먼저 알아 보겠습니다. 강아지와 고양이는 젖을 먹인다는 공통점 때문에 포유류로 분류됩니다. 하지만 강아지와 고양이는 울음소리가 다릅니다. 강아지와 고양이 클래스를 만들때 각각 젖을 먹이는 메소드를 만들 수 있지만, 포유류라는 새로운 클래스를 만들고 그 안의 메소드와 필드등을 그대로 가져갈 수 있습니다. 먼저 코드부터 보시죠. using System; namespace StudyCSharp { class MainApp { static void Main(string[..
안녕하세요. 오늘은 클래스에대해서 알아보겠습니다. 클래스란 자동차에 비유하면 자동차 설계도와 같습니다. 객체는 이 클래스(자동차 설계도)를 가지고 만든 자동차와 같습니다. 또한 객체는 인스턴스라고도 불립니다. 세상의 모든 물체를 객체로 바라보는 것이 객체지향 프로그래밍의 핵심입니다. 모든 객체에는 속성과 기능으로 이루어져있습니다. 예를들어 강아지로봇을 객체로 생각해본다면, 클래스(강아지로봇 설계도)에는 강아지 털의 색, 강아지 크기등이 속성으로 존재해야하고, 밥먹기, 짖기 등이 기능으로 존재해야한다고 생각 할 수 있습니다. 그럼, 강아지 로봇을 코드로 구현시켜보겠습니다. class DogRobot { public string DogColor; // 강아지 색 속성 public int DogSize; //..
안녕하세요. 오늘은 저번시간에 이어 c#에 대해서 좀 더 자세하게 알아보겠습니다. 해당 문서는 c언어를 마스터하신분들에게 적합함으로 만약 c언어를 모르신다면 c언어부터 공부하시면 되겠습니다. 특히 c언어랑 많이 비교하면서 공부해보도록 하겠습니다. 먼저 연산자는 다들 아실테니 정리만 간단한게 해보겠습니다. 산술연산자 +, -, *, /, % 증가/감소 연산자 ++, -- 관계연산자 , ==, !=, = 조건연산자 ? : null 조건부 연산자 ?., ?[] 논리연산자 &&, ||, ! 비트연산자 >>, "b" }; Console.WriteLine($"{grade}"); } } } 일반적인 switch 구문으로도 구현가능하지만 switch식을 이용하면 더욱 간결하게 사용할 수 있습니다. 이제 c#의 반복문에..
안녕하세요. 원래는 하드웨어 공부를 하려했는데, 하드웨어 관련 공구들이나 재료들을 살 돈이 아직 없어서 먼저 c#언어를 공부하려고합니다. c#은 윈도우 form을 만들 수 있어서 ui에 친숙한 언어입니다. 다만 윈도우에서만 실행가능한 어플리케이션을 만들 수 있습니다. 하지만 데스크탑의 os가 거의 윈도우라는 점을 인식하면 굉장히 winform은 유용합니다!(만들면 많은 사람들이 쓸 수 있기때문입니다) c#은 객체지향 프로그래밍입니다. c언어는 절차지향 프로그래밍으로 코드를 짤때 순서대로 짜야한다는 생각을 가지고 하지만, c#은 객체지향 프로그래밍이므로 클래스(자판기에서의 버튼같은 일정 일을 하는 모듈)를 만들고 사용한다는 생각을 가지고 프로그래밍합니다. 먼저, hello world 콘솔 출력 c#언어를 ..
안녕하세요. 저번시간에 이어서 오늘은 이름을 입력받고 그이름과 함께 메시지를 전달하는 기능을 추가해보도록 하겠습니다. 아래는 기능의 원리입니다. 1. 이름을 순차적으로 저장할 2차원 배열을 생성 2. 클라이언트가 첫번째로 메시지를 보내오면 이름이기때문에 클라이언트 번호에 맞게 배열에 저장 3. 클라이언트가 종료하면 소켓 배열에서 없애는것처럼 이름 배열도 시프트연산으로 없애줌 4. 반복 c언어에서 문자열을 다루기는 좀 까다롭습니다. 그래서 문자열에 관한 함수들을 좀 정리해 볼까합니다. #include //문자열 합치는 함수 erron_t strcat_s ( char * s1 ,size_t size, const char *s2 ); //s2를 s1뒤에 size만큼 저장 //문자열을 복사하는 함수 erron_..
안녕하세요. 저번 시간에 멀티 채팅 콘솔앱을 만들어보았습니다. 하지만 서버쪽에서 소켓의 정상적인 종료가 아니였음을 코딩하던중에 알게되었습니다. 이번시간에는 정상적인 종료가 무엇인지 저의 생각을 얘기하고 해결을 해보도록 하겠습니다. 비정상적인 종료는 클라이언트 쪽에서 문제가 있었습니다. 바로 recv()함수가 블로킹 상태였는데 closesocket()이 호출된것입니다. 클라이언트쪽에서 쓰레드가 2개였습니다. 하나는 send쓰레드 하나는 recv쓰레드이였습니다. 종료를 위해 q를 입력하면 send 쓰레드쪽에서 closesocket()을 호출하고 exit(1)을 했습니다. 하지만 위의 과정들이 진행되고있음에도 recv쓰레드에서 recv()함수는 계속 블로킹 상태였습니다. 결국 recv()함수가 블로킹상태임에도..
안녕하세요. 저번시간까지 소켓프로그래밍을 배웠습니다. 배운 소켓프로그래밍으로 이제 멀티 채팅 콘솔앱을 만들어보겠습니다. 보낸 소켓에 이름을 부여하고 그 소켓이 메시지를 보내오면 서버쪽에서 이름과 함께 메시지를 연결된 클라이언트에게 같이 보내는 서버를 구현하도록 하겠습니다. 이후에는 c#의 winform을 활용해서 ui까지 가지고있는 winform앱도 만들어보겠습니다. 먼저 이름을 부여하지않은 멀티 채팅의 원리는 이러합니다. 1. 서버가 클라이언트를 받는다. 2. 부모 서버는 받은 클라이언트를 클라이언트만 모아놓은 소켓 배열에 추가한다. 3. 이후 받은 클라이언트를 처리하는 쓰레드를 만들고 클라이언트를 쓰레드에 맡겨놓는다. 4-1. 쓰레드는 클라이언트로부터 recv하고 만약 0이 전달되면 클라이언트만 모아..