C/C++ 에서 작성한 코드를 C#에서 사용하기 위한 작업을 하던 중, 가변길이 포인터 배열에 대해 변환하는 방법에 대해 공유합니다. 샘플로 만든 C 코드는 아래와 같습니다. typedef struct { char *name; int age; } my_data; typedef struct { int len; my_data **data_list; } my_data_list; __declspec(dllexport) void print_my_data_list(my_data_list *list) { int i; if (!list) { printf("[ERROR] no list\n"); return; } printf("[INFO] list length : %d\n", list->len); for (i = 0; i..
FileInfo 클래스와 DirectoryInfo 클래스 1. FileInfo클래스 파일 정보를 담을 수 있는 멤버들을 제공한다. 예를들어 Name이란 변수엔 파일이름이 FullName이라는 변수엔 디렉토리 Path를 포함한 파일 이름이, Extension에는 확장자가, CreationTime에는 파일이 생성된 날짜 등 각종 파일에 관련된 정보들이 들어간다. 생성자에는 파일의 FullPath가 들어간다 (당연히 디렉토리까지 포함) FileInfo fInfo = new FileInfo("c:\\test.txt"); 간단하다. fInfo.Name에는 “test.txt”가, fInfo.FullName에는 “c:\\test.txt” 가 들어가있겠지… FileInfo의 모든 멤버는 다음과 같다. Name Desc..
파일 입출력 파일은 FileStream이란 매개체 클래스를 통해 접근하여 읽고, 쓸 수 있다. 일반적으로 byte[]배열을 이용해 읽기/쓰기를 수행하며 사용법은 다음과 같다 FileStream fs = new FileStream("파일이름", FileMode.OpenOrCreate); 물론 생성자에 들어갈 수 있는 건 저것뿐만은 아니다. FileStream생성자는 15가지로 오버로딩 되어있다. 저렇게 사용할 경우 ‘파일을 열되 없으면 생성하라’라는 뜻이 되겠다. 오버로딩된 생성자는 다음과 같다. 위에서 사용한건 3번째거군… Name Description FileStream(IntPtr, FileAccess) Obsolete. Initializes a new instance of the FileStream..
구조체와 클래스의 차이점 흔히들 구조체와 클래스의 차이점을 말해보라 하면 “구조체에선 함수를 정의할 수 없고, 클래스에선 정의할 수 있습니다.” 라고 한다. 이건 C#에선 틀린 답이다. C#에서는 엄연히 구조체 안에도 함수를 정의할 수 있다. 그럼 어떤 차이가 있는가? 구조체는 Value타입이고 Class는 Reference타입니다. 으잉? 항상 듣는 소리다. ‘Value와 Reference’ 차이점은 이거면 충분히 알 수 있다. int a = 10; int b = a; a = 20; 현재 b의 값은? 당연히 10이다. Value타입이니까 class ClassA { public int valTest = 0; } ClassA a = new ClassA(); ClassA b = a; a.valTest = 5..
What is Namespace Namespace는 그대로 해석해버리면 이름공간?정도가 되겠다. 우잉? 뭔소리야 Namespace에 { }로 묶인 것들은 ‘하나의 작업 단위’라고 보면 되겠다. 예를 들어 System Namespace에는 우리가 자주 사용하는 Console이나 Object, String과 같은 클래스들이 정의되어 있다. 다른 Namespace 공간에 있는 클래스나 구조체, 상수들을 접근하기 위해서는 ‘네임스페이스.클래스’와 같은 ‘.’(dot)을 이용해 접근한다. 하지만 매번 이렇게 Namespace이름.클래스 와 같이 접근하자면, 코드의 양은 엄청나게 길어질 것이다. 예를 들어 자료구조에서 많이 사용되는 Stack과 같은 클래스는 namespace System { namespace Co..
1. .NET의 특징 3가지 (1) .NET Framework 가 깔려있는 곳이면 어디서든 동작한다. (자기들 좋을대로 해석) à .NET Fremework가 깔려있지 않은 곳이면 동작하지 않는다. (이게 맞음) 사실 .NET Framework 는 Window가 아니면 깔리지 않는다. 즉 Linux와 같은 환경에선 실행할 수 없다… (2) 여러 언어로 사용할 수 있다. (C#, J#, Managed C++, VB.NET 모두 같은 원리) 이들은 각각의 컴파일러에 의해 IL(언어와 기계어의 중간언어쯤으로 인식)코드로 변환되며 실행시 .NET Framework (정확히는 CLR)에 의해 기계어로 변환되어 실행된다. (3) 기존코드와의 상호 운영성 .NET은 기존 C, C++과 같은 기존코드와 상호 운영할 수..
#if, #endif 보다는 Conditional Attribute를 이용하라! 기존방법 예제 : #if, #endif 방법 private void Check() { #if DEBUG string name = new StackTrace().GetFrame(1).GetMethod().Name; Trace.WriteLine("Check for Person : "); Trace.WriteLine("called by " + name); #endif } 좋지 않은 점 : 1. Release모드일 때에는 메소드 내용이 포함되지는 않지만 쓸데없는 메소드 호출을 피할 수 없다. 2. 코더의 실수를 유발하여 의도하지 않은 코드가 삽입될 수 있다. 개선시킨 방법 예제 : Conditional Attribute 사용 방법 ..
강제 형 변환보다는 as, is가 좋다! C#에서도 C, C++, Java등에서 사용하던 강제 형 변환을 할 수 있다. 형 변환 예) void EventHandler(object obj, EventArgs e) { MyClass myClassByCast = (MyClass)obj; // cast사용 MyClass myClassByAs = obj as MyClass; // as 사용 } C#에서는 위처럼 object형을 형 변환해야 할 때가 종종 있다. 중요한 점은 위처럼 강제 cast를 하나 as키워드를 사용하나 그 결과는 같다는 것이다. 그렇다면 왜 as키워드를 사용해야 하는 걸까? 1. as나 is 연산자는 런타임에 객체의 형 변환이 가능한지를 확인하기 위해서 사용자가 정의한 형 변환 연산자를 고려하..