728x90
반응형

C# 44

Convert 그리고 Parse의 문화권 문제 [C#]

JSON 파일로 데이터를 받아오는 경우도 있지만 문자열로 데이터를 받아오는 경우도 있는데 최근에 문제가 생겼었다. 바로 C#에서의 parse 문제다. Convert도 마찬가지다. 그 중에서 float이나 double 같이 소수점이 있는 아이들이 문제가 많다. https://docs.microsoft.com/en-us/dotnet/api/system.single.parse?view=net-6.0 https://docs.microsoft.com/ko-kr/dotnet/api/system.convert?view=net-6.0#methods 본론으로 들어가보자 1. 문제 숫자에서 0.005를 float.parse 했을 때, 0이 되어버리는 현상 기존 서비스하던 국가가 아닌 다른 국가에서 나타나는 현상 2. 원인..

C#에서의 값 형식, 참조 형식, 박싱(Boxing), 언박싱(Unboxing) [Unity]

C#에는 2가지 데이터 형식이 존재한다. 중요하다고 볼 수 있는 점은 대입 연산자 과정에 있다. 더욱이 복사 연산이 될 때다. 이 차이점은 이들 형식이 복사되는 방식에 따라 나뉘게 된다. 값형식의 데이터는 항상 값으로 복사되지만, 참조형식 데이터는 항상 참조로 복사된다. 알아보자 참고로 값 형식은 얕은 복사(Shallow) 참조 형식은 깊은 복사(Deep) 기본 제공 데이터 형식 중 하나 또는 사용자 정의 구조체를 사용하여 선언된 변수는 값 형식을 가진다. ** 예외적으로 string 타입은 참조 형식이다. 기본 제공 타입은 이정도? bool, char, byte, decimal, double, enum, float, int long, short, sbyte, struct, uint, ulong, ush..

C#에서의 Func, Action [Unity]

메서드와 Action이 같을까? 한 번쯤 Action을 써봤을 수도 있다. 그렇다면 Action을 쓰면 메서드가 실행되는 것을 안다. 하지만 메서드와 실행방식이 다르다. 등록의 과정이 필요하다. 또한 Func이나 Action은 일반 메서드가 아닌 무명메서드도 등록이 된다. ???흠.. 무명메서드가 되는 이유가 무엇일까?? 사실 무명 메서드를 사용하기 위헤서는 델리게이트 변수가 있어야하고 델리게이트 타입의 변수를 선언해야한다. 그렇다면 각기 다른 타입의 무명 메서드를 여러개 만들 때는 어떻게 해야할까? 당연히 무명 메소드마다 그 타입에 맞는 델리게이트 타입과 변수를 따로 따로 선언해야 할 것이다. 하지만 비효율적인 작업이기 때문에 C#에서는 Func과 Action이라는 델리게이트를 제공한다. Func와 A..

String과 StringBuilder의 차이, 용도 [Unity]

우리는 문자열이라면 무심코 String을 쓴다. 그게 잘못되었다는 말이 아니다. 다만 게임이라는 볼륨이 큰 작업에 있어서는 최적화 작업 중 하나가 될 수 있다는 것이다. ??? 어떻게 하는데??? 알아보자 우선 string 클래스가 있어서 우리는 문자열을 쓸 수 있다는 것을 안다. 하지만 StringBuilder 클래스도 있는데.. 왜 이것이 최적화가 된다는 말인가??? -> 물론 모든 곳에서 쓰이는 곳이 아니다. -> 프로그래밍에서 무조건 좋은 방법이란 없다. Trade-off 라는 것을 명심하자. 예를 들어보자. 캐릭터가 살고 있는 주소를 표현한다고 하자. //용산역에 살고 있다면..? string myAddress = "서울시" + "용산구" + "뭔동"; 아무튼.. 저기서 문자열이 합쳐질 때 우리..

게임 오브젝트의 2가지 충돌, OnTriggerXXX, OnCollisionXXX [Unity]

유니티에서는 게임 오브젝트의 충돌의 종류에는 일반적으로 2가지가 있다. 충돌 종류에 따라 실행되는 콜백함수가 다르다. 일반적으로 최초의 충돌이 일어났을 때는 OnTriggerEnter, OnCollisionEnter 둘 중 하나의 함수가 실행될 것이다. (충돌 이벤트 메서드(함수)) ** 이 함수가 메시지를 받았기 때문에 실행되는 것인데..? 한 번 알아보자 일반적으로 Start()나 Update() 메서드가 자동으로 실행되는 이유는 Start, Update 메시지를 받아서 해당 함수를 실행하기 때문이다. 즉, 충돌 메시지에 대응하려면 충돌 메시지와 같은 이름으로 메서드를 작성하면 된다는 말이다. 하지만 일반적으로 충돌 메시지에는 메서드 이름뿐만 아니라 충돌한 오브젝트에 대한 정보도 같이 들어간다. A와..

Nullable Type 이용하기 [Unity]

널러블..?? Nullable? null + able?? null 이 가능하다고..? 뭐지?? 알아보자 매우 유용한 기능 중 하나로 예를 들자면 사용방법이다. int? num; //1, 선언 int? a = null;//2. 할당 -> int 형 변수인 a에 null 값을 할당함. 이게 도대체 어디에 이용되느냐? 바로 null check다. 실제로 바로 사용되지 않는 변수를 선언할 때 초기화를 해야하는데 int형 같은 경우에는 일반적으로 null값이 들어가지 않아 거의 사용되지 않는 값을 집어넣는게 대부분이다.(ex. minValue) 하지만 null을 집어넣어서 실제로 사용되지 않으면 null 값으로 남아있어 좋다. nullCheck는 아래처럼 이용한다. **HasValue이용 -> 기억하자. 1. H..

Async , Await 키워드, 비동기 프로그래밍(Asynchronous Programming) [Unity]

기존에도 비동기 프로그래밍 방법이 있었지만 Async와 Await은 C# 5.0부터 더 나은 비동기 프로그래밍을 지원하기 위해 나온 키워드이다. 알아보자 우선 Docs의 정의는 await 연산자는 피연산자가 나타내는 비동기 작업이 완료될 때까지 바깥쪽 await 메서드의 평가를 일시 중단합니다. async 한정자를 사용하여 메서드, async 또는 무명 메서드를 비동기로 지정합니다. 메서드 또는 식에 이 한정자를 사용하면 비동기 메서드라고 합니다. **참고로 C# 7.0 에서는 이러한 3가지 async 리턴타입에 대한 제약을 넘어 커스텀 리턴 타입을 허용하게 되었다. -> Custom 리턴 타입의 하나로 .NET Framework에서 ValueTask 라는 타입이 제공되고 있는데, Nuget 패키지에서 ..

Task, Task<TResult> 클래스 , 비동기 프로그래밍 [Unity]

일반적으로 System.Threading.Tasks 네임스페이스 안에 2가지 클래스가 대표적으로 들어있는데 1. Task -> 비동기 작업을 나타냄 2. Task -> 값을 반환할 수 있는 비동기 작업 위 2개의 클래스들의 역할은 간단하게 말하자면 쓰레드풀로부터 쓰레드를 가져와 비동기 작업을 실행한다. ** Task 관련 클래스들과 Parallel 클래스들을 합쳐 Task Parallel Library(TPL)이라 부르는데 기본적으로 다중 CPU 병렬 처리를 염두해서 만들었다. ???뭔지 모르겠다고?? 알아보자 먼저 1번 Task부터 살펴보자 Task클래스 사용을 위해 흔히 사용되는 방법은 두 가지가 있다. 첫번째로 Task.Factory.StartNew()를 사용하여 실행하고자 하는 "메서드에 대한 델..

C#/Unity Event - 개념

Event에서 간단하게 정리하려고 한다. 알아보자 무엇이냐??? Event는 C#이 지원하는 하나의 기능으로 특정한 일(event)이 있어났음을 외부의 이벤트 가입자(subscriber)들에게 알려주는 기능을 한다. 즉, 외부와의 커플링, Coupling을 줄이기 위한 도구 중 하나이다. 왜쓰냐?? 위에서 말했다시피 Coupling을 줄여줌은 물론 Event가 발생했을 때만 Subscriber된 함수가 실행됨으로 Update로 항상 지켜보지 않아도 된다는 장점이 있다. -> 하지만 해당 Event를 발생시키는 것은 Update로 봐야한다는 단점도 존재한다. 결국 Event의 Event도 어차피 누군가는 감지를 해야 발행할 수 있으니까..? 어떻게 사용하는 지를 보면서 더 감을 잡도록 하자. 어떻게 쓰냐?..

게임 일시정지하기, 퍼즈, pause 만들기 [Unity]

간단하다. 하지만 응용은 무궁무진하다. 버튼을 눌러서 일시정지 상태를 조절할 수 있고 어떠한 조건에 걸리면 일시정지 후 어떤 행동을 할 수 있다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Util : MonoBehaviour { bool isPause; //초기화 void Start () { IsPause = false; } void Update () { if (여기서 내가 원하는 조건이 들어갈 수 있다.) { //퍼즈 if (IsPause == false) { Time.timeScale = 0; IsPause = true; return; } // 퍼즈 풀기 if (IsPause =..

728x90
반응형