본문 바로가기

반응형

진리는어디에

(289)
[C#] C# 구조체(struct)로 메모리 절약하기 들어가며 C++에 익숙한 사용자라면 class와 struct의 차이라고 해봐야 멤버에 대한 기본 접근한정이 private이냐 public이냐 정도차이 라고 알고 있을 것이다. 하지만 C#에서는 class와 struct의 차이가 매우 크다. 이 포스트에서는 C#에서 struct와 class에 대한 차이를 설명하고 struct를 이용해 많은 메모리를 절약한 시나리오에 대해 알아 보도록 하겠다. 메모리의 타입(유형) 코드에서 객체를 생성할 때 마다 객체는 어느 정도의 메모리를 필요하게 된다. 객체에 대한 메모리는 사용 중이 아닌 영역에 할 당되어야 하며, 이 할당 되어야 하는 메모리는 크게 '스택'과 '힙'이라는 두 가지 종류가 있다. 본론에 들어가기 앞서 이 두가지 유형의 메모리에 대해 간단히 살펴 보도록 ..
[C#] 두 시간의 차이 구하기 - TimeSpan C#에서는 현재 시간을 나타내기 위해 DateTime이라는 자료구조를 제공한다. 이번 포스트에서는 두 DateTime 간의 시간의 차이를 구하는 TimeSpan의 사용 방법에 대해 알아 보도록 하겠다. using System; using System.Threading; DateTime start = DateTime.Now; // 현재 시각 구하기 Thread.Sleep(5000); // 5초 정도 슬립 TimeSpan span = DateTime.Now - start; Console.WriteLine(span); Console.WriteLine(span.TotalSecone); // 초 단위 시간차 구하기 Console.WriteLine(span.TotalMilliSecone); // 밀리 초 단위 시간..
[Unity] 지금 동작하는 스레드가 메인 스레드인지 확인하는 방법 유니티로 싱글 스레드 기반 서버를 만들고 있는 중이다. 싱글 스레드 기반이라고 하더라도 성능을 위해서는 멀티 스레드를 완전히 배제하고 만들 수는 없다. 네트워크 IO라던지, 비동기 작업을 할 때는 멀티 스레드에서 작업을 하다가 완료가 되면 다시 메인 스레드에서 재개하는 방식으로 만들어야 한다. 하지만 어떨 때는 현재 구동되고 있는 코드가 메인 스레드에서 돌아가고 있는 것인지 다른 백그라운드 스레드에서 돌아가고 있는 것인지 확인해야 할 필요가 있다. 여기서 현재 실행 중인 스레드를 나타내는 Thread.CurrentThread 속성을 이용하여 현재 코드가 구동되고 있는 스레드가 메인 스레드인지 체크하는 예제 코드를 소개 하도록하겠다. 방식은 간단하다. Start 메소드와 같이 메인 스레드에서 구동되는 곳에..
[C#] Generic Constraints 들어가며 클래스에 제네릭을 적용할 때 제네릭 인자를 특정 클래스를 상속 받은 것만 사용 할 수 있도록 하고 싶은데 어떻게 해야 할지 몰라 찾아 보니 [여기]에 설명이 되어 있길래 번역해본다. C#은 제네릭 타입을 사용 할 때 제약 사항을 줄 수 있다. 이 제약 사항들을 이용하여 제네릭 타입의 인스턴스를 생성하는 코드를 컴파일 타임에 에러를 찾아 낼 수 있다. where 키워드를 이용해 제네릭 타입에 대해 하나 또는 이상의 제약사항을 설정 할 수 있다. GenericTypeName where T : constraint1, constraint2 아래 예제는 보여준다. 제약 사항과 함께하는 제네릭 클래스에 제약사항을 class DataStore where T : class { public T Data { ge..
윈도우 배치 스크립트(Batch Script) - 배열(Array) 들어가며 윈도우 배치 스크립트에서 배열의 사용이 가능하다. 단, 배열을 사용 할 때 다음 사항에 유의해야 한다. 배열의 각 요소는 set 명령으로 정의해야 한다. 배열의 값을 순회(iterate)하려면 'for' 루프가 필요하다. 배열 생성 배열은 아래와 같이 set 명령어를 이용해 생성 가능하다. set a[0]=1 여기서 0은 배열의 인덱스이고 1은 배열의 첫번째 요소에 할당 된 값이다. 배열을 만드는 또 다른 방법은 값 목록(value list)를 정의하고 반복하는 것이다. 아래는 이를 구현하는 예를 보여준다. Example @echo off set list=1 2 3 4 (for %%a in (%list%) do ( echo %%a )) Output 1 2 3 4 배열 요소 가져오기 배열의 요소에..
윈도우 배치 스크립트(Batch Script) - %~dp0 @echo off :: 현재 실행 되는 스크립트 파일의 전체 경로. 파일 이름 제외 echo %~dp0 :: 현재 실행 되는 스크립트 파일의 드라이브 이름 echo %~d0 :: 현재 실행 되는 스크립트 파일의 드라이브 이름을 제외한 경로 echo %~p0 :: 현재 실행 되는 스크립트의 파일 이름 echo %~n0 :: 현재 실행 되는 스크립트의 확장자 echo %~x0 매번 까먹어서 적어 본다. 부록 1. 같이 읽으면 좋은 글 윈도우 배치 스크립트(Batch Script) - 변수 윈도우 배치 스크립트(Batch Script) - IF
[C#] CONST와 READONLY의 차이 C#에서 READONLY와 CONST의 차이는 무엇일까? 변수가 단순히 읽을 수만 읽고 변경이 불가능하다는 '상수'를 정의하는 것이라면 둘 다 같은 것인가? 대답은 당연히 '아니오'다. 만일 같다고하면 이 포스트는 시작도 하지 않았을 것이다. 그렇다면 둘의 차이는 무엇인가? 가장 기본적인 부분에서 부터 출발해보자. 일단 겉보기에는 둘다 같은 기능을 가졌지만 이름만 다른것 처럼 보인다. 하지만 우리가 이 둘의 차이를 제대로 이해하지 못하고 남발하게 되면 꽤나 심각하고 많은 문제을 일으키게 될 가능성이 높다. C#에서 상수를 정의하기 위해서는 아래와 같이 사용한다. public const double PI = 3.14; const 한정자는 컴파일러에게 이 변수는 할당 된 값을 절대 변경하지 않을 것임을 알려..
[C#] AppDomain.GetAssemblies 메소드 사용하기 들어가며 서버를 만드는데 메시지를 핸들링하는 클래스를 만들때 마다 디스패칭을 해줄 수 있는 어딘가에 매번 등록하는게 귀찮았다. 'C#에는 리플렉션도 있는데 특정 클래스를 상속 받으면 해당 클래스들을 자동으로 찾아서 디스패처에 등록하는 방법은 없을까?' 있더라... GetAssemblies() 메소드를 이용해 현재 로드된 어셈블리의 목록을 가져 오고, 그 어셈블리에서 내가 필요한 타입만을 쏙쏙 뽑아 올 수 있었다. 아래는 한줄 한줄 설명하며 진행 된다. 만일 설명 필요 없고 그냥 예제 코드가 필요하다 하시는 분이나 나는 전체 예제를 봐야 윤곽이 쉽게 잡힌다 하시는 분들은 [여기]를 클릭하도록 하자. 코드 살펴 보기 먼저 베이스가 될 BaseMsgHandler 클래스가 있다고 가정하자. 우리는 이 클래스를 ..
[Python] C/C++ 연동 'extension' 모듈 들어가며 지난 포스트에서는 C로 만들어진 공용 라이브러리를 파이썬의 ctypes 모듈을 통해 호출하는 방법에 대해 알아 보았다. 이번 포스트에서는 C로 만들어진 공용 라이브러리를 일반 파이썬 모듈 처럼 사용 할 수 있는 방법에 대해 살펴 보겠다. C언어로 파이썬 확장 모듈을 만드는 과정을 요약하면 아래와 같다. 파이썬으로 부터 인자를 넘겨 받아 처리 할 수 있는 C 함수를 작성한다. 모듈의 메소드 정보를 저장하는 PyMethodDef 배열을 생성한다. 모듈 자체의 정보를 저장하는 PyModuleDef 구조체를 생성한다. PyInit_을 가지는 초기화 함수를 정의한다. setup.py 파일을 생성하여 모듈을 빌드한다. 위 과정을 완료하게 되면 C로 작성된 파이썬 모듈이 생성되고, 아래와 같이 일반 파이썬 ..
[Python] C/C++ 연동 'extension' 들어가며 기본적으로 스크립트 프로그래밍 언어인 파이썬은 사용하기 편리한 대신 컴파일 프로그래밍 언어에 비해 성능이 떨어진다. 이 문제에 대한 해결 방법으로 파이썬에서는 C/C++로 작성된 모듈을 파이썬에서 호출 할 수 있도록 하는 'extension'이라는 기능을 제공한다. 이번 시간에는 파이썬에서 C/C++의 함수를 호출하는 방법에 대해 살펴 보겠다. 본 포스트에 대한 다뤄진 프로젝트의 전체 소스 코드는 [여기]에서 확인 할 수 있다. 동적 라이브러리 만들기 파이썬에서 C/C++로 작성된 코드를 모듈로써 사용하기 위해서는 C/C++로 작성된 동적 라이브러리(윈도우의 경우 dll, 리눅스의 경우 so)가 필요하다. 이번 챕터에서는 각 윈도우와 리눅스에서 동적 라이브러를 만드는 방법에 대해 살펴 보도록 하..

반응형