본문 바로가기
반응형

개발/기본) 기본기70

기본기) 랜덤 - 의사 난수 발생기 (Pseudo Random Number Generator : PRNG) 랜덤 - 의사 난수 발생기 (Pseudo Random Number Generator : PRNG) 의사 난수 발생기는 많은 양의 난수 발생이 필요할 때 확률 및 통계, 응용프로그램을 위해서 사용되는 랜덤 발생기이다. 랜덤이라는 알고리즘이 아무리 정교하더라도 다음 숫자를 예측할 수 있는 상황이 생기기 때문에 이러한 숫자 난수 시퀀스는 실제로는 무작위가 아니다. 의사 난수 발생기는 초기 시드(Seed)를 이용해서 임의의 시작 상태에서 시작하여 난수의 속성에 가까운 일련의 숫자를 생성한다. 난수 발생기 중 가장 유명한 3가지에 대해서 간략하게 코드만 정리하도록 한다. Xn+1=(aXn+c)mod m return (float)((seed * 9301 + 49297) % 233280 / 233280.0f); 기존.. 2021. 10. 27.
기본기)Unity) Fake Null Unity Fake Null 유니티 오브젝트는 C++로 작성된 네이티브 객체의 래퍼이다. Unity 객체는 씬이 변경되거나 Object.Destroy()를 사용하면 제거되지만 그 객체를 C#으로 래핑 한 유니티 오브젝트는 가비지 컬렉터가 수집을 완료할 때까지 남아있게 된다. 실상으로는 모두 다 파괴가 된 상태가 아니라는 이야기이다. Unity에서는 이 상태를 “Fake Null”이라고 하고 있습니다. 테스트 케이스인 코드를 확인하게되면 다음과 같다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { IEnumerator Start() { BoxColl.. 2021. 10. 19.
기본기)c#) ?. , ??, ??= 연산자 ?. , ??, ??= 연산자 C# 6 이상에서 사용할 수 있는 null 조건부 연산자는 피연산자가 null이 아닌 것으로 평가되었을 때만 멤버 액세스 ?. 또는 요소 액세스, ?[]연산을 피연산자에게 적용해서 null을 반환을 한다. 예시를 보면 다음과 같다. A?.B.C(); A가 null이 아니면 B는 평가되지 않고 C()는 호출되지 않는다. double SumNumbers(List setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum1 = SumNumbers(null, 0); Console.WriteLine(sum1); // output: NaN var nu.. 2021. 9. 28.
기본기)Event Handler 대리자 EventHandler 대리자 이벤트 데이터가 없는 이벤트를 처리할 메서드를 만들때 사용한다. 어떤 이벤트를 처리하는 메서드를 만들때 사용하는 형태로 += 를 통해서 Event를 등록한다. 하단의 예제는 임계점을 설정후 a버튼에 대한 제한 처리를 하는 로직이다. using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Counter c = new Counter(new Random().Next(10)); c.ThresholdReached += c_ThresholdReached; Console.WriteLine("press 'a' key to increase total"); while (Cons.. 2021. 9. 26.
기본기)c# switch statement on a range(switch 문 범위 조건) c# switch statement on a range(switch 문 범위 조건) 예전 c#버전에서는 switch 문법을 사용할 때 조건에 해당하는 정수형을 모두 다 나열하거나 if 문법으로 변환해서 범위에 대한 처리를 하곤 했다. 지금은 c# 7.0 버전 이상에서는 범위에 대한 switch문법을 지원한다. switch(conditionValue) { case 1: case 2: case 3: case 4: case 5: Console.WriteLine("1~5 사이"); break; } 변경된 문법은 다음과 같다. switch(conditionValue) { case int n when( n 6: Console.WriteLine("1~5 사이"); break; } 지원되는 c#의 버전을 확인하고 좀 .. 2021. 9. 13.
기본기) Switch 문 안에 Switch 문법 (Nested switch-case) Switch 문 안에 Switch 문법 (Nested switch-case) 코드를 작성하다보면 조건분기가 점점 많아지는 예외 상황이 생길 경우가 있다. 다중 if 문도 비슷하지만 switch 문안에 다중 switch가 생기는 경우에 대한 고민과 생각이 들어서 관련되서 찾아보고 포스팅하게 되었다. Nested switch-case 라고 하는 표현은 가독성과 순환 복잡성이 늘어난다고 한다. 순환 복잡성이 높아지면 여러가지 케이스가 생기게되고 버그 및 사이드 이펙트, 결함이 비례한다는 이야기가 있다. 결론적으로 예시의 코드처럼 Nested switch-case문은 사용하는것을 지양해야 한다. public void TestSwitchCase(int paramValue1, int param.. 2021. 8. 26.
기본기)페어 프로그래밍(Pair Programing) 페어 프로그래밍(Pair Programing) 페어 프로그래밍(Pair Programing)이란 두 사람이 한 짝이 되어서 같이 프로그래밍을 하는 것을 말한다. 단순하게 한 컴퓨터를 두고 두 사람이 시간을 구분해서 코딩한다고 하기도 하는데. 현시점에서 페어 프로그래밍이라고 하는 방식으로는 같은 작업 업무를 두 사람이 같이 작업하는 형태를 말한다. 작업을 구분해서 하고 서로 작업된 코드에 대한 견해를 나누거나 두 개를 결합하는 방식으로 조 진행한다. 페어 프로그래밍을 하게되면 장단점은 다음과 같다. 장점 단점 에러 및 사이드 이펙트가 줄어든다. 혼자 작업하는것보다 더 효율적인 코드를 작업할 확률이 올라간다. 팀워크를 향상시킨다. 시간이 오래걸린다. 작업 효율이 떨어질수 있다. (서로의 스타일이 안맞을 경우.. 2021. 8. 9.
기본기)c#) lock lock 문 lock은 특정 상황에서 상호 배제 잠금을 하는 키워드로 해당 상황에서는 lock을 걸게되면 다른곳에서 자원을 사용하지 못하도록 독립적인 상황을 만드는 방법이다. 대부분은 병렬적으로 처리가되는 형태에서 데이터의 무결성을 확보하기 위해서 사용을 하게되는데 형식은 다음과 같다. lock(x) { //Your code.. } 예제는 다음과 같다. 전용 balanceLock 인스턴스에 잠금을 설정하여 해당 개인 balance 필드에 대한 액세스를 동기화하는 Account 클래스를 정의합니다. 동일한 인스턴스를 잠금에 사용하면 Debit 또는 Credit 메서드를 동시에 호출하려는 두 스레드에 의해 balance 필드가 동시에 업데이트되지 않습니다. using System; using System.T.. 2021. 5. 12.
기본기) 소프트웨어 관리 버전(Semantic Versioning) 소프트웨어 관리 버전(Semantic Versioning) 소프트웨어를 관리하고 서비스하다 보면 버저닝 관리에 대한 고민을 하게 된다. 계속적인 서비를 진행하다보면 점점 많은 버전들이 계속적으로 늘어나게 되는데 소프트웨어 관리 버전에 대한 정의는 중요하다. 소프트웨어 관리 버전 규칙에 대한 설명을 간략하게 정리하기 위한 포스팅이다. 유의적인 버전 명세 규칙은 다음과 같다. 1. 버전은 어떤 방식으로든, 빌드의 구분을 정확하고 이해하기 쉬워야 한다. 2. 버전의 일반적인 구성은 정답은 없으나 Major , Minor, Build or Maintenance Version ex) 1.0.0 의 형태로 구성한다. 3. 번호 넘버링형태로 1부터 시작하고, 빌드의 성향에 따라 버전을 한 개 올린다. 유의적 버전을 .. 2021. 4. 19.
기본기)c#) Async / Await 사용법 Async / Await 사용법 Task 비동기는 코드에 대한 추상화가 가능하고 비동기적으로 실행된다. Await 키워드는 작업을 차단하지 않는 방식으로 처리 Async / Await 사용법 Task 비동기는 코드에 대한 추상화가 가능하고 비동기적으로 실행된다. static async Task MakeToastWithButterAndJamAsync(int number) { var toast = await ToastBreadAsync(number); ApplyButter(toast); ApplyJam(toast); return toast; } Task를 사용해서 백그라운드 스레드를 시작하고 Await를 사용해서 결과를 기다리고 후 처리된다. private DamageResult CalculateDamage.. 2021. 4. 14.
기본기)c#) 무시 항목 무시 항목 C# 7.0부터 C#에서는 애플리케이션 코드에서 의도적으로 사용되지 않는 자리 표시자 변수인 무시 항목을 지원합니다. 무시 항목은 할당되지 않은 변수에 해당하므로 값을 가지지 않는다고 한다. '_' 의 형태로 선언되는 항목은 무시 항목으로 처리된다고 한다. 예시로 Task를 무시하고 비동기 작업에서 생성되는 모든 오류를 무시하려고 하는 의도로 처리가 된다. private static async Task ExecuteAsyncMethods() { Console.WriteLine("About to launch a task..."); _ = Task.Run(() => { var iterations = 0; for (int ctr = 0; ctr < int.MaxValue; ctr++) iterati.. 2021. 4. 14.
Tip) vi 명령어 정리 vi 명령어 정리 vi 편집기에서 ESC를 를 통해서 여러 가지 상태로 변경하게 되는데 자주 사용하는 명령어들을 정리했다. vi(Visual Editor) 편집기는 Unix 계열 운영체제에서 주로 쓰이는 오픈 소스 문서 편집기이다. 다음과 같다. 명령 모드(Command Mode) esc i 현재 커서 위치에 삽입(입력모드) a 현재 커서 바로 다음위치에 삽입(입력모드) x 커서가 위치한 곳의 글자 1개 삭제 dw 커서가 위치한 곳에서 부터 단어 삭제(커서의 위치를 기준으로 다음 띄어쓰기전까지) dd 커서가 위치한 곳의 한 줄 삭제 p dd의 명령을 복구 u 방금 한 명령 취소(실행취소 Ctrl + z 기능) 0 커서가 줄의 맨 앞으로 이동 $ 커서가 줄의 맨 끝으로 이동 G 파일 끝으로 이동(대문자) .. 2021. 4. 1.
기본기) Seed Random 구현 방식(고정랜덤) Seed Random 구현 방식(고정 랜덤) Random이라는 난수를 발생시키는 과정에서 늘 항상 고정으로 특정 처리를 하고 싶은 경우에 사용한다. 실제 난수발생기 로직으로 볼 수 없고 '선형 합동 생성기'라고 한다. 특정 시드를 기준으로 늘 항상 같은 List를 값을 반환해주는 코드이다. public class SeedRandom { private int seed; private List m_listShuffleData = new List(); public SeedRandom(int nSeed, int _totalCount) { seed = nSeed; ShuffleIntList(_totalCount); } #region Private Method private float Random() { seed+.. 2021. 3. 8.
기본기)c#) is 연산자, as 연산자 is 연산자, as 연산자 is 연산자는 자료형 타입 (형식)과 일치하는지 확인하기 위해서 사용한다. 사용 방식은 다음과 같다. 변수 is 타입으로 선언하게 되면 형식이 맞는지에 대한 return 값 (bool)으로 확인이 가능하다. using System; public class Employee : IComparable { public String Name { get; set; } public int Id { get; set; } public int CompareTo(Object o) { if (o is Employee e) { return Name.CompareTo(e.Name); } throw new ArgumentException("o is not an Employee object."); } } .. 2021. 3. 5.
기본기)빌보드 기법(Bill-Board) 빌보드 기법(Bill-Board) 빌보드 기법이라는 것은 3D 공간상 오브젝트를 카메라의 정면으로 바라보게 하는 기법으로 시점에 대한 처리를 할 때 많이 사용하는 기법이다. 어느 방향으로 이동을 하더라도 항상 같은 면을 보여준다. - 객체의 면의 법선 벡터 n, 근사한 상향 벡터 u가 있을 때, 외적을 통해 수직 벡터 r을 구하고, 위 벡터에 수직인 벡터 u' = n cross r로 구할 수 있음. 위에서의 벡터들로 회전 행렬 Mr = (r, u', n)을 구할 수 있다. 카메라를 바라보는 방식은 Y 축을 기준으로 빌보드를 처리하면 된다. Y축으로 빌보드를 처리하는 공식은 다음과 같다. Unity 에서는 Transform.LookAt으로 처리할 수 있다. Unity Documentation : [링크] .. 2021. 2. 15.
반응형