공모전을 준비하면서 유니티와 아두이노사이에서 데이터를 주고 받을 일이 생겨 열심히 하던중 한가지 문제가 생겼다.아두이노에서 계속해서 "Hello" 라는 메시지를 시리얼로 보낸 후 C#을 통해 읽는 형식인데Unity를 이용해 시리얼에서 값을 읽어 오게 하였다.그런데 넘어 오는 값이 제대로 오는 것도 있고 짤리는게 꽤나 많다.문자는 이정도 짤려도 큰 문제가 없을 수도 있지만, 만약 구조체나 다중 데이터를 보내야 할때 큰 문제가 생기기 때문에 문제를 해결해야 한다.하루 걸러 이유를 찾아냈는데. 이유는 아두이노에서 시리얼에 메시지를 쓸때 한 번에 넘기는 것이 아닌 1 바이트씩 시리얼에 쓰게 된다.그래서 아두이노에서 메시지를 쓰던 도중에 C#에서 읽어버리니까 메시지가 다 써지지 않았음에 불구하고 읽어버리고 나머지..
유니티와 아두이노 사이에서 시리얼 통신을 해야 해서 인터넷에서 C# 시리얼 통신 예제를 찾아다니면서 해보던중유니티에서 사용하면 다음과 같은 에러가 난다.혹시 몰라서 유니티 프로젝트가 아닌 일반 C# 프로젝트에서 해봤는데, 당연히 된다.이게 왜 안될까 싶어 구글링을 시도해보았는데.Player Settings의 (각자 플랫폼) Api Compatibility Level이 다음과 같으면 C#의 내장 라이브러리중 일부를 사용하지 못하게 되는데, 그중에 System.IO.Ports도 포함 되어 있었는거 같다..Net2.0 Subset에서 .Net2.0으로 바꿔주면 모든 내장 라이브러리를 사용 할 수 있게 된다.이제 에러도 없어 졌다.
팀프로젝트를 진행하던중 맵 데이터와 플레이어 데이터에 대한 간단한 포맷을 만들고 그에 대한 스크립트를 작성중 한 가지 문제점과 의문점이 생겼다.그것은 아무런 글이 적혀 있지 않은 빈 줄과 즉 str == ""과 str == null은 같을까? 라고 생각했다.이 글을 작성하던중 한 가지 생각이 더 떠올랐다. 아무것도 적혀 있지 않은 빈 줄은 "\r\n" 또는 "\n" 값이 들어 있다는 사실을...그러므로 아무것도 적혀 있지 않은 빈 줄은 "" 가 아닌 "\r\n" 또는 "\n"이 되는 것이다! 아무것도 적혀 있지 않은 빈 줄이 ""가 아닌 사실은 알아냈다 하지만 그래도 남아 있는 궁금점 str == "" 과 str == null은 같을까? 간단하게 코드를 작성하여 확인 해보았다. 만약 ""와 null이 같..
이번에는 구조체에 대하여 알아 보겠습니다. 보통 C++에서의 구조체는 class 와의 별반 차이 없는 차이라고 해봤자 기본 접근 지시자가 private이냐 public이라는 차이점 밖에 없습니다. C#또한 그렇…지 않습니다! C#에서는 구조체 또한 기본 접근 지시자가 private로 되어 있습니다. (지못미) 그러면 C#에서는 구조체와 클래스의 차이점은 무엇 일까요? 클래스와 구조체의 차이점은 클래스는 힙 (Heap)영역 에서 참조(Reference) 타입 이고, 구조체는 스택(Stack)영역에 생성되는 값(Value) 타입 입니다. 따라서 구조체가 클래스보다 메모리 소모가 덜 하다고 합니다. 두번째로 매개변수가 없는(..!!) 생성자와 소멸자를 선언 할 수 없습니다. 게다가 상속을 지원하지도 않습니다(..
확장 메소드는 기존의 클래스의 기능을 "확장"시켜주는 메소드(함수) 라 고 볼 수 있습니다. 보통 자바 좀 하신 분이라던가 이것저것 C#으로 만지작 거리신 분이라면 보셨을텐데 이렇게 그냥 일반적인 배열인데 뒤에 메소드처럼 사용하여서 사진처럼 배열의 길이 라던가 그 변수의 타입을 가져 올 수 있습니다. 위 코드의 실행 결과는 보다시피 배열의 길이와 타입이 출력 되었습니다. 이제 한번 직접 확장메소드를 만들어 보겠습니다. 첫번째로 확장메소드가 포함된 클래스의 접근 지시자를 public으로 해야 내부 함수에 접근 할 수 있고 static으로 해야 클래스를 생성 하지 않아도 접근 할 수 있게 합니다 함수 또한 마찬가지 입니다. 만드는 방법은 아래와 같습니다(빨간줄 으ㅓㅓ) 확장메소드 끝
이번엔는 get,set 에 대해 알아 보겟습니다 클래스 내부에서 변수를 만들 때 public으로 하면 변수가 막 바뀔까 봐 문제되고 private로 하면 바꿀 때 귀찮아 지는 경우가 있는데 이럴 때 get,set을 이용하면 됩니다 쓰는 방법은 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { ..
이번엔 배열을 알아 볼 것이다. 배열도 은근 많이 바꼇다. 배열을 선언하는 방식은 int[] Arr = new int[100]{1,2,3…….}; 와 같이 선언한다 당연하지만 배열 인덱스는 0부터 시작 또한 int[] Arr = new int[]{1,2,3….}; 와 같은 선언도 가능하며 int[] Arr = {1,2,3…}; 도 가능 하다 이와 같은 선언은 위 문장의 선언과 같다. 다차원 배열을 선언 하는 방식은 Int[,] arr2 = new int[5,5]; 와 같이 선언 하며 초기화 방법은 다 같다 참고로 콤마 잘 못 넣은거 아님 그 이외에 차원을 계속 늘리고 싶으면 콤마를 계속 늘려주면 된다. System.Array 이번에는 Array클래스에 대해 알아 볼 것 이다. 배열에 관한 클래스인데 은근..
이번에는 메소드에 인자 제한 없이 인자를 넘길 수 있는params에 대해 알아 보겠습니다. 먼저 C/C++에도 이런 방법..? 이 있었고 실제로도 사용이 됐지요(printf,scanf와 같은) 실제로도 C#에서도 Console.Write()함수에도 사용 되고 있습니다.(라고 해도 잘 안 쓸 거 같은데..) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplicatio..
이번에는 ref와 out을 알아 볼 것 인데 보통 C# 에서는 포인터를 사용하지 않습니다 그 이유가 CLR이 메모리를 자동 관리 해준다고 하기 때문에 직접 메모리를 건드는 것은 안전하지 않으므로 포인터는 사용하지 않고 메모리를 건드는 것이 아닌 참조자를 이용하는거 같습니다.(C#에서도 포인터를 사용 할 수 있다만 함수에 unsafe를 붙여야 한다) C++ 에서의 참조자는 int& 형으로 변수를 만들었는데 C#에선 &가 아닌 ref라는 단어를 붙여줘야 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42using System; using Syst..