BEST
-
공용 언어 런타임(CLR)의 실행 모델
해당 내용은 서적 CLR via C# 을 기반으로 작성하였습니다. 들어가기 앞서,우리는 여러가지 어플리케이션을 개발할때 개발 목적에 따라 언어를 선택하게 된다. C++과 같은 언어는 Win32 API를 자유로이 쓸 수 있고 메모리로 직접 접근이 가능하여 우리가 원하는 아주 섬세한 부분까지 제어할 수 있기 때문에, 시스템 서비스와 같은 하위 수준의 어플리케이션을 개발할때 적합하고, Visual Basic과 같은 언어는 쉬운 문법, 빠른 UI 디자인 작업 등이 용이하여 고객의 요구 사항이 빈번하게 바뀌는 업무 프로젝트를 진행하기에 아주 적당하다고 할 수 있다. 즉, 기존의 언어 사이에는 우열이 존재하며, 개발 목적에 따라 언어의 선택이 이루어질 수 있고, 이러한 결정은 매우 신중하게 이루어져야 한다. 그러나..
-
스택은 왜 높은 곳에서 낮은 곳으로 저장될까?
문득 스택만 높은 영역에서 낮은 영역으로 저장된다는 부분에 의문점이 들어 작성한 글이다.1. 스택 포인터의 역할스택은 스택 포인터라는 레지스터로 관리된다. 이 레지스터는 스택의 최상단을 가리키는 메모리 주소를 저장한다. 푸쉬(push) : 데이터를 스택에추가할때, SP를 감소시키고 데이터를 저장한다.팝(pop) : 데이터를 스택에서 제거할 때, 데이터를 읽고 SP를 증가시킨다.위 두 연산은 각각 감산 또는 가산 연산 한번으로 단일 메모리 접근만으로 처리된다. 이러한 간결성은 하드웨어 설계와 명령어 실행을 단수화하고 효율적이다. 2. 커널 영역을 침범하지 않으면서 전체적인 영역을 일정하게 차지하기 위함스택이 높은 영역에서 낮은 영역으로 가기 때문에 커널 영역에 침범하지 않는 매우 중요한 이유도 존재한다. ..
-
[Design Pattern] 커맨드 패턴(Command pattern)
이 글은 'level up your code with game programming patterns' 서적을 기반으로 각종 블로그에서 추가적인 정보를 얻어 작성하였습니다.[커맨드 패턴]만약 실행 취소/다시 실행 기능이 사용되거나 입력 내역이 목록으로 유지되는 게임을 플레이해 본 적이 있다면 아마 커맨드패턴을 본적이 있을 것이다. 사용자가 실제로 여러 턴을 실행하기 전에 계획할 수 있는 전략 게임을 생각해보면 그것이 바로 커멘드 패턴이다.커맨드는 어떠한 요청(캐릭터를 앞으로 이동시킨다)를 요청에 대한 모든 정보를 포함한 독립실행형 객체로 변환하는 행동 디자인 패턴이다. 즉 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 메서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또..
-
[Design Pattern] MVC 패턴과 MVP 패턴
이 글은 'level up your code with game programming patterns' 서적을 기반으로 각종 블로그에서 추가적인 정보를 얻어 작성하였습니다.[MVC 패턴]MVC(모델 뷰 컨트롤러) (이하 MVC) 패턴은 사용자 인터페이스를 개발할 때 흔히 사용되는 일련의 디자인 패턴이다. MVC의 기본 아이디어는 소프트웨어의 논리적 부분과 데이터 및 프레젠테이션에서 분리하는 것이다. 그러면 불필요한 종속 관계를 줄이는 데 도움이 되며, 잠재적으로 스파게티 코드도 줄일 수 있다.이름에서 알 수 있듯 MVC 패턴은 다음 3가지의 레이어로 분할된다.Model : 데이터를 저장한다. 모델은 전적으로 값을 저장하는 데이터 컨테이너이며 게임플레이 로직이나 계산을 수행하지 않는다.View : 인터페이스..
-
[Unity] 유니티는 왜 싱글 쓰레딩을 권장하는가?
동기 비동기 관련된 개념만 보면 비동기식 멀티 쓰레딩이 가장 좋아보인다. 하지만 유니티는 우리가 알다시피 싱글 쓰레딩을 권장한다. 왜 그러는지 의문점이 생겨 작성한 글이다.비동기식 멀티 쓰레딩 개념에 대해 정리 해놓은 부분을 다시 읽어보면 다음고 같이 적혀있다.나는 사장이고 베이컨을 굽는 직원이 있고 토스트를 굽는 직원이 있고 서빙을 담당하는 직원이 있다고 보면 된다.베이컨 주문이 10개 들어오면 팬에 베이컨을 올리고 타이머를 누르는 작업을 10번 수행하고 10개의 타이머가 순차적으로 울릴면 차례로 뒤집는 작업을 한다. 토스트를 굽는 직원도 동일한 메커니즘이다.이는 이상적인 식당의 모습이다. 그러나 실제 식당의 모습은 위처럼 흘러가지만은 않는다. 이를테면 다음과 같은 문제들이 발생할 수 있다. 1. 작..
-
[unity] 코루틴이 비동기적인 것처럼 보이는 이유
유니티에서 코루틴(Coroutine)을 열거자(Enumerator)로 선언하는 이유는, 코루틴이 유니티의 게임 루프와 비동기적으로 작동하기 때문입니다. 정확하게는 비동기적인 것처럼 실행되는 것이다. 실제로는 유니티의 메인 스레드에서 순차적으로 실행되며, 진정한 비동기적 작업(즉, 멀티쓰레드에서 동시에 실행되는 작업)은 아니다.비동기적 "처럼" 보이는 이유유니티의 코루틴은 메인 스레드에서 동작하면서도, yield return 을 통해 특정 지점에서 일시 정지하고 특정 조건이 충적되면 다시 재개한다. 이 일시 정지 상태동안, 다른 작업들이 스레드에서 계속 실행될 수 있기 때문에, 마치 비동기적인 작업처럼 느껴지는 것이다. yield 키워드IEnumerator 코드를 특정 지점에서 멈추게 할 수 있는 이유는 ..
-
interface는 인스턴스는 못 만들지만 참조는 만들 수 있다?
c#에서 인터페이스는 인스턴스를 만들 수 없지만 참조를 만들 수 있다. 즉, 인터페이스 자체로는 객체를 생성할 수 없지만, 인터페이스를 구현한 클래스의 객체는 인터페이스 타입의 변수를 할당하여 사용할 수 있다는 뜻이다.이를 이해하기 위해 클래스와 인터페이스의 차이를 예제로 설명해보자.public class Dog{ public void Bark() { Console.WriteLine("Woof!"); }}Dog dog = new Dog(); // 클래스의 인스턴스를 생성dog.Bark(); // 출력: Woof!여기서 Dog 클래스는 Bark 메서드를 가지고 있으며, Dog 클래스를 사용해 dog 라는 객체를 만들고 Bark() 메서드를 호출할 수 있다. 즉 Dog 클래스..
-
[C#] 기본 인터페이스 메서드, 이제 interface도 인스턴스화를?
interface는 인스턴스는 못 만들지만 참조는 만들 수 있다? 위 글을 읽고 이어서 보면 더 좋습니다 C# 8.0부터 인터페이스에도 기본 구현을 넣을 수 있게 되었다. https://learn.microsoft.com/ko-kr/dotnet/csharp/advanced-topics/interface-implementation/default-interface-methods-versionspublic interface IDamageable{ int Health { get; } void TakeDamage(int amount); // C# 8.0+: 기본 구현 제공 가능 bool IsDead => Health 그럼 이제 인스턴스화 가능한가? 라고 한다면 여전히 불가능하다. He..
-
[C#] 타입(형)변환, 캐스팅
형 변환 퀴즈에서 헷갈려서 정리를 해보려고 한다.class B{}class D : B {}위와 같이 두개의 클래스가 정의되어 있다고 가정해보자.아래의 표를 채워볼건데, 각각의 코드에 대하여 어떤 코드가 컴파일되고 성공적으로 수행될 것인지(OK), 어떤 코드가 컴파일 시점에 오류(CTE에 체크), 또 어떤 코드가 런타임에 오류(RTE에 체크)를 발생시키는지 채워보자. 정답은 맨 아래에 적어놨다.위 표는 책 CLR via C#에 나와있는 표이다. StatementOKCTERTEObject o1 = new Object(); Object o2 = new B(); Object o3 = new D(); Object o4 = o3; B b1 = new B(); B b2 = new D(); D d..
-
[백준] C# 16926번 배열 돌리기1
문제 이해해당 문제는 같이 회전시킬 좌표들을 하나의 리스트로 인식하여, 회전시킬 수 있어야 한다.예제 입력 1을 예로 들면 2차원 배열을 아래의 두 리스트로 분리한다.1,2,3,4,8,12,16,15,14,13,9,52,3,7,11,10,6이후 회전 시켰다는 것은, 앞에 요소를 다시 뒤로 돌려주면 된다.1,2,3,4,8,12,16,15,14,13,9,5,1,22,3,7,11,10,6,2,3여기까지 진행했다면, 각 배열별로 회전시킨 것과 동일하기 때문에 배열 순서대로 2차원 배열로 만들어주면 된다. 풀이1. 배열의 시작점이 될 좌표(앵커)를 선정해야 한다./// 앵커가 될 수 있는 최대 값은 축이 짝수면 /2 하고 -1을 해야한다./// 만약 /2만 하면 축이 4일때 2값이 리턴되는데 2는 이미 2차원 배..
-
IL 코드 명령어들
힙 객체(참조 타입 인스턴스)의 맴버 변수접근ldfld(load field) / stfld(storefield) -> 객체의 인스턴스 필드를 읽거나 쓸때 사용 로컬 변수를 읽고 쓸 때예제 코드// 인스턴스 메서드라고 가정 (this 사용 예시를 위해)class Sample{ void Demo(ref int a, int b) { int x = a + b; // 로컬 x x = x + 5; // 로컬 x 갱신 a = x; // ref 인자 a에 값 써넣기 System.Console.WriteLine(x); }}IL 코드.method private hidebysig instance void Demo(int32& ..
-
[C#] 클로저(closure)
클로저의 개념일반적으로 지역변수는 함수가 끝나면 스택에서 사라진다. 하지만 람다식(익명 메서드)과 같은 함수는 단순히 '코드 조각'이 아니라 외부 변수를 캡쳐해서 함께 저장하는 객체를 만든다. 즉 컴파일러가 람다용으로 힙에 별도의 참조형 객체를 만들어 그 안에 저장한다.이렇듯, 함수(람다, 익명 메서드)가 자기 외부의 지역 변수를 캡처해서, 함수 실행이 끝난 뒤에도 그 변수를 계속 참조할 수 있게 하는 기능을 클로저(Closure)라고 한다.예시void Example(){ var isInit = false; Action callback = uid => { if (isInit) Console.WriteLine("다시 호출됨"); else ..