본문 바로가기

C#

[C#] Simple Network Lib 취미 삼아 만들어 본 것.... 사용언어는 c# 이고, 구성은 네트워크 라이브러리, 샘플 서버, 샘플 클라이언트 등이고... 대단한 것은 없으니 본인은 저장용이고, 누군가의 학습용 정도면 되지 않을까? 이제 제대로 만들어 봐야겠다. 더보기
[C#] ThreadPool 기본 사용. c# 에서 제공하는 기본 쓰레드 풀 사용해 보기. 1. 테스트를 위한 컨테이너 선언. - Thread에 안전한 ConcurrentDictionary로 선언.2. 컨테이너에 값 삽입. 3. 루프를 돌면서 컨테이너에서 값 하나 꺼네서 제공하는 쓰레드 풀에 삽입.4. 끝나는 시간에 차이를 두기 위해서 테스트용 함수 안에서 랜덤하게 슬립을 걸도록 한다.5. 마지막으로 main 함수 에서 스레드가 종료되기 전에 메인 쓰레드가 종료되는 것을 막기위해서 ReadLine을 선언. 끝. 더보기
[C#] ConcurrentQueue 기본 사용법 Thread 안전한 Queue가 ConcurrentQueue 의 기본 사용법을 적어본다. 1. Queue 선언. 2. 값 삽입. 3. 내용을 한번 확인 해보고, 4. 값 가져오면서 큐 안의 내용을 삭제 한다. 5. 가져오고 난 후의 큐 안의 갯 수를 확인해 보고, 6. 마지막으로 큐 안의 값을 확인 하는 방법을 적어보고 끝~ 더보기
[C#] ConcurrentDictionary 기본 사용법 Thread에 안전한 ConcurrentDictionary의 기본 사용법을 적어 놓는다.잊어 버리기 전에... 1. ConcurrentDictionary에 값을 삽입. 2. 들어있는 값 확인. 3. 값을 삭제. 4. 다시 컨테이너 확인. Key 값을 확인하는 방법. 으로.. 일반 Dictionary와 같다. 더보기
[C#] ConcurrentBag 사용법 Thread에 안전한 ConcurrentBag 용법에 대해서 간략하게 적어 본다. 1. ConcurrentBag 을 선언.2. 데이터 삽입.3. 데이터 확인 1. - TryPeek은 내용물을 확인을 하지만, 컨테이너 안의 데이터를 삭제하지는 않는다. 4. 데이터 확인 2. - TryTake은 내용을 확인하고, 컨테이너 안에서 삭제 한다. 결과 확인. 다음과 같이 확인 할 수 있다. ※ 흠... 컨테이너 안의 내용을 확인 할때, 임의의 값을 가져올 수는 없는 것으로 안다. 즉, 들어 있는 값 중에 아무거나 가져온다는 것이다. 추가. 컨테이너 안의 내용물 확인 방법은 다음과 같다. 더보기
[C#] 객체 복사 : 얕은 복사와 깊은 복사 4 앞서 3편에서 딕셔너리에 포함된 객체의 복사에 대해서 예제를 만들어 봤는데, 이를 더 쉽게 하는 방법이 있다. 우선 스택오버플로우 사이트에서 본 방법으로 함수를 사용하는 방법. 이 예제는 CloneDictionaryCloningValues 함수를 통하는 방법으로, 사용 예시는 Clone 함수 내부에 있다. 또 다른 방법은, C#에서 자체적으로 지원해 주는 방법이 있다. 이 방법은 확실히 위의 방법이나, 앞서 3편에서 보여드린 for문을 사용하는 방법 보다는 간단해 보인다. 하지만, 이 방법은 딕셔너리에서만 통하고 Concurrent 컨테이너들에서는 사용할 수 없다. 이 때는 또 따로 만들어야 한다. 더보기
[C#] 객체 복사 : 얕은 복사와 깊은 복사 3 객체 복사의 일반적인 사용 예시를 만들어 보려고 한다. 위의 클래스는 기본적인 데이터 클래스를 의도하는 testB 와 testB를 딕셔너리로 관리하는 testA 클래스를 나타낸다. testA 클래스에서는 앞서 보여준 Clone과 조금 다른 것을 알 수 있다. 본문 예시) 위의 예시는1. 본 클래스에 값을 삽입 2. 복사를 실행.3. 본 클래스의 값을 변경.4. 변경 된 값을 확인. 하는 순으로 진행 되었다. 결과는 다음과 같이 깊은 복사가 이루어 진 것을 확인 할 수 있다. 더보기
[C#] 객체 복사 : 얕은 복사와 깊은 복사 2 깊은 복사(Deep Copy)는 참조변수가 가르키는 힙 영역 객체를 복사하는 것으로 별도의 힙 영역객체를 생성한다. C# 에서 복사는 기본적으로 얕은 복사이기 때문에 깊은 복사는 별도로 구현해야 한다. 객체 복사 예시. 위의 예제는 앞서 설명한 복사를 예시로 만든 것이다. 여기서 확인 할 수 있듯이 복사 후에 원본의 값을 바꾸면 복사 대상의 값도 변경 됨을 확인 할 수 있다. 해서 다음과 같은 과정으로 깊은 복사를 해야 독립적으로 사용할 수 있다. 깊은 복사 예시 클래스. ICloneable을 상속 받으면 인터페이스로 Clone을 제공한다. 물론 상속 받지 않고 그냥 별도로 만들어도 상관없다. 해서, Clone 함수에서 내부 값을 새로이 생성한 객체에 적용하고 리턴하도록 Clone 함수를 채워준다. 깊은.. 더보기
[C#] 객체 복사 : 얕은 복사와 깊은 복사 1 얕은 복사(Shallow Copy)는 객체가 복사될 때, 시리제 객체가 아닌 스택에 있는 참조를 복사하는 것. 복사 예시 위의 예시에서 보듯이 test 클래스를 생성하여 값 1,2를 넣고, t2 클래스를 생성 객체를 복사한 결과에 대한 출력이다. 허나, 이에 대하여 주의 할 점은 원본 객체와 사본 객체가 같은 참조를 바라보기 때문에 사본 객체나 원본 객체의값을 변경하게 되면 얕은 복사된 모든 객체도 영향을 받는다. 그 예제는 다음과 같다. t.a 의 값을 변경한 결과가 t2에서도 영향을 주는 것을 위의 예제에서도 확인 할 수 있다. 더보기
[C#] 정렬 3 (Linq) 이번 내용은 기존의 딕셔너리를 사용하여 정렬을 하던 것과는 좀 다른 내용이다. 내용은 다음과 같다. 그림에서 보듯이 Linq를 약간 사용하여 정렬을 하였다. 1. 딕셔너리를 선언 및 값 삽입.2. desc 정렬 및 출력3. asc 정렬 및 출력. linq의 구문은 from test in test_dic -> test_dic의 내용을 test 에 값을 대입. orderby test.Value 정렬방식 -> 딕셔너리의 value를 기준으로 정렬. select test -> 가져오기. 해서, 위의 코드를 실행하면 다음과 같다. 이 처럼 정렬 됨을 확인 할 수 있다. 더보기
[C#] 정렬 2 (OrderByDescending, OrderBy) 금번 정리할 내용은 정렬에 대해서 알아 보던 중 Dictionary에도 정렬이 있다는 것을 알고 테스트를 해 보았다. 위의 코드는 일반 딕셔너리를 선언하고 내부에 있는 기능인 정렬과 역정렬을 사용하여 테스트를 해 보았다. 1. 딕셔너리 선언 및 임의의 값 추가.2. value를 기준으로 내림차순, 오름차순 정렬.3. 출력4. 원소 바로 접근 확인. 해서, 위의 코드를 실행 시키면 다음과 같다. 오름, 내림차순으로 정렬됨을 확인 할 수 있으며, 바로 가져오기 또한 확인 할 수 있다. 더보기
[C#] 정렬 1 (SortedDictionary) 금번 정리 내용은 정렬에 대한 내용이다. 정렬에 대한 내용은 두가지 방법으로 테스트를 해보았다. 해서 그 내용을 정리하여 기억하려 한다. 위의 코드는 간단하게 SortedDictionary 를 테스트 해 보았다. 1. SortedDictionary 를 선언. ( 키는 int64, value는 string )2. 우선 key 값이 큰 for 문으로 먼저 값을 삽입.3. 다음 key 값이 작은 for 문으로 값을 삽입.4. 출력. 출력 하면 다음과 같다. 삽입 한 순서가 아닌 정렬된 값으로 출력이 된다.SortedDictionary는 기본적으로 Key 값을 기준으로 정렬됨을 확인 할 수 있다. 더보기
[C#] 유한 상태 머신 간단한 유한 상태 머신을 정리하려 한다. 목표.1. 몬스터가 유저를 발견하고 접근 후 공격을 한다.2. 몬스터가 유저를 공격 후 상황에 따라 상태가 변한다. 흠... 이걸 어떻게 설명해야 하려나... 어떻게 짤라서 설명해야 할지 고민이 되니. 그냥 궁금하신 분들이 계실까봐 코드를 올립니다. 작성 환경은 비주얼 스튜디오 2010 입니다. 내용은 1. 룸 생성.2. 유저를 룸에 추가.3. 몬스터 생성.4. 몬스터 업데이트 타이머에 몬스터 추가.5. 몬스터 활동. 등등이 되겠습니다. 끝. 첨언... 올리고 나서 가만히 생각해 보니... 그냥 테스트 코드 였는데... 그래서 깔끔하지는 않습니다. 정리하기도 조금 번거로... 그렇습니다. 해서 다음에 기본적인 내용은 다시 포스팅 할 예정이지만, 우선 기본적인 동작.. 더보기
[C#] Timer 사용법 C# 에서 지원해 주는 타이머에 대해서 정리 한다. 우선 타이머를 생성한다. 위에서는 5개의 타이머를 선언했지만, 실제 사용하는 건 두개 뿐인 예제이다.하나의 타이머에서는 전역변수 a를 증가 시키고 다른 하나에서는 a를 감소 시킬 예정이다. 그리고 증가 타이머는 전역변수 a의 값이 500을 넘어가면 중단을 시킬 예정이다. SetTimer 함수에서는 두개의 타이머를 생성하는데. 인자를 설명하면첫번째. 콜백 함수.두번째. 전달 인자.세번째. 함수 호출시 딜레이.네번째. 함수 호출 간격. 이 되는데. 생성은 이 형식 말고도 여러개가 있다. 필요에 따라서 다른 생성자를 사용해도 된다. 메인에서는 위의 타이머 생성 함수를 호출 해 주고,일정 카운트가 지나면 타이머 1번의 호출 시간을 변경해 봤다. 앞서 감소 함수.. 더보기
[C#] Thread 사용법 c# 에서 thread를 사용하는 방법에 대해서 적어 보자. 1. thread를 만들기에 앞서 테스트를 위한 클래스를 하나 만들었다.2. 이 클래스는 값을 받고 받은 값을 출력하는 함수를 가진다. 본문에서는 Thread를 두개를 생성하는데.하나는 입력을 받아 출력하는 thread.하나는 함수를 호출 하는 thread 이다. 결과는 다음과 같고 중간에 보면 입력을 받은 부분도 있음을 확인 할 수 있다. 더보기
[C#] 파일 읽기 2 이 번편도 앞에 이어서 파일 읽기의 연속인데...사실 파일 읽기는 프로그램 설정 파일을 만들거나 할때 많이 사용하니까. 알아두면 나쁘지 않다. 이 예제는 문자열 비교를 통해서 임의로 다음 줄을 읽는 예제이다.간단하니 별다른 설명은 필요없을꺼 같으니... 여기서 끝. 더보기
[C#] 파일 읽기 1 이 번편은 파일 읽기 편이다. 파일을 읽는 방법은 다음과 같다. 1. 파일을 열고2. 전체를 읽는 예제.3. 한줄씩 읽는 예제. 간단함. 더보기
[C#] list 활용. 이 번에 정리할 내용은 list 이다. 사실 Dictionary 때문에 많이 사용은 안하게 되던데... 사용법은 다음과 같다. 마지막에 생성 클래스 확인이라는 부분은 리스트에서 값이 빠져도 생성된 클래스는 (test 클래스)는 없어지지 않음을 확인하기 위해서 추가되었다. 더보기
[C#] Random 함수 사용법. c# 에서 간단하게 랜덤값을 발생 시키는 방법을 정리하려 한다. 방법은 다음과 같다. 1. 랜덤 클래스 선언. 2. 램덤 클래스의 next 함수를 통해서 값 발생. Next 함수는 두 인자를 가지는데 첫번째가 min, 두 번째가 max 범위이다.max 범위는 범위에 포함되지 않는데. 즉, max 이하가 아니라. max 미만의 범위이다. 그리고 너무 빠르게 연속적으로 실행하면 시드가 초기화 되지 않는 듯. 같은 값이 출력 된다.해서 예제에서는 0.5초 딜레이를 주었다. 더보기
[C#] SQL 연결. C# 에서 SQL에 연결하는 방법에 대해서 정리하자. C# 에서는 SQL에 자체적으로 연결하는 방법을 지원하는데. 연결 방법은 다음과 같다. 1. using 에서 필요한 것들을 추가 해주고.2. SqlConnection 선언.3. 연결 문자열을 만들고 4. 연결. 그리고 쿼리를 날리는 예제는. 1. 쿼리 문자열을 만들고2. 쿼리를 실행하고3. 결과를 확인한다.4. 그리고 반드시!!! SqlDataReader를 Close 를 해줘야 한다. 그렇지 않으면 아직 Reader가 끝나지 않은 상태이기 때문에 다음 쿼리가 실행 되지 않는다. 비고.. 만들어진 쿼리가 아니라 sp를 호출 해도 된다. 예를 들면... 위의 string query 에 select 쿼리가 아니라. string query = "EXEC 저장.. 더보기