분류 전체보기
C# Reflection 이용하여 Class 속성, 값 출력하기
using System; using System.Collections.Generic; using System.Reflection; namespace ReflectionTest { class Program { static void Main(string[] args) { Student stu = new() { Name = "범범조조", Age = 29 }; School school = new() { SchoolName = "가나다학교", Area = "한국", since = 2021 }; // Student 객체 값 출력 PrintPropertyInfo(stu); Console.WriteLine(); // School 객체 값 출력 PrintPropertyInfo(school); // stu 학생의 친구 리..
모듈과 컴포넌트의 차이점
모듈이란? 모듈이란 비슷하거나 연관성 있는 것들로 이루어진 메소드나 클래스의 집합이다. 자동차로 예를 들자면 엔진을 이루고 있는 구성품들의 집합을 엔진이라고 하고 엔진을 모듈이라고 할 수 있다. 여기서 구성품들은 클래스나 메소드들을 가르킨다. 결론은 재사용이 가능한 코드의 모음이라고 보면 된다. 모듈은 코드의 재사용 및 유지보수를 쉽게 해줘서 프로그램을 만들 때 모듈화하여 만들고 있다. 컴포넌트란? 기능의 최소 단위다. 프로그램을 만들때 재사용하기 위해서 모듈화하여 사용한다고 하였다. 재사용하기 위해선 독립적인 기능을 가져야하지만 독립적으로 개발하여도 모듈간의 호환이 되지 않는 경우가 있어 소프트웨어의 재사용이 어려워지게 된다. 그런 문제를 해결하기 위한 방법이 컴포넌트이고 컴포넌트는 소프트웨어의 재사용..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnh2Jq%2FbtsnFKgYZyM%2FKuOB18S5DP4Vd1A8udq2K1%2Fimg.png)
C# 클래스 할당시 메모리 구성 디버깅
디스어셈블링 및 실제 메모리를 디버깅하면서 데이터와 객체를 할당시 어떤 구조로 메모리에 올라가는지와 C#에서 클래스를 할당하면, 힙이 어떻게 동작하는지를 보자 쉽게 보기 위해서 예제는 x86(32bit)로 컴파일되었고 이를 기준으로 설명한다 예제로 사용할 모습은 이와 같다. 아무 클래스나 하나 만들고 그 안에 문자열 하나와 int 하나를 선언, 구조체 역시 메모리를 살펴보기 쉽게 int형 두개로 선언했다 먼저 Case1 메소드를 디버깅해보자 Watch창에서 살펴보면 현재 testObject의 상태를 알 수 있고, '&testObject'로 testObject의 실제 메모리 주소를 볼 수 있다. C# 문법에서는 직접적인 포인터를 사용하려면 unsafe 옵션을 이용해서 사용 할수 있으나, 이는 그리 권장하는..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPmtAD%2FbtsnGYTm1ZF%2Fbq9UkYVKkKeUxdIGz5KoS1%2Fimg.jpg)
[C#] Nullable type, int? 널러블 타입에 대해서
1. Nullable Type 이란? C# Nullable Type 이란 Null 을 가질 수 없는 데이터 타입을 Null을 가질 수 있는 타입으로 만든 새로운 타입이다. 대표적으로 값 타입(value type)들이 Null을 가질 수 없는데요. int, 구조체, double, bool 등의 데이터 타입은 값이 없는 상태(NULL)이 불가능한 데이터 타입들이다. (클래스와 같은 reference type(=참조 타입)은 이미 Null 체크가 가능하기 때문에 따로 Nullable Type으로 만들지 않아도 된다.) int와 같은 값 타입에 대해서 "값이 없다"를 표현하기 위해 Nullable Type이 개발 되었다. 우리는 int를 nullable int type으로 변경함으로서 값이 할당 되었는지 아닌지..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP6LdJ%2FbtsnOsTm2zc%2FwOZwfeORpNr11lCDOeIlm1%2Fimg.png)
C# 공변성(Covariance)과 반공변성(Contravariance)
사실 공변성과 반공변성을 통칭 가변성이라고 한다. 그리고 이와 반대되는 의미로는 불변성이 있다. 가변성(Variance) : 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 말한다. 공변성(Covariant) : X -> Y가 가능할 때 C가 C -> C로 가능하다면 이는 공변이다. 반공변성(Contravariant) : X -> Y가 가능할 때 C가 C -> C로 사용 가능하다면 이는 반공변이다. 불변성(Invariant) : X -> Y가 가능하더라도 C는 C로만 사용할 수 있다. 기본적으로 제네릭은 불변이다. 좀 더 상세히 설명하기 위해서 아래와 같은 다형성을 가진 환경이 있다고 가정해보자. class Base : ICompareable { public int Id { get; set..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAol68%2FbtsnEnTZvxw%2FzLWDaMqfXvkA7usiBHdX8k%2Fimg.png)
C# 포인터 사용
C#에서는 포인터를 안전하지 않은(unsafe) 형식으로 지정하여 표면적으로는 지원하지 않고 있지만 기존의 C++의 라이브러리 등의 외부 라이브러리를 사용한다던가 프로그램의 비약적인 성능향상의 목적을 위해 사용할 필요성을 가지게 된다. 이러한 포인터를 사용하기 위해서는 다음과 같은 절차를 거쳐야 사용할 수 있다. 1. 솔루션설정변경 생성한 솔루션에서 설정메뉴를 통해 들어간 뒤 빌드를 확인하면 위와 같이 안전하지 않은 코드를 사용할 수 있는 체크박스를 확인할 수 있다. 이 항목을 체크하면 솔루션 내에서 포인터를 사용할 수 있는 조건을 만들어 주게 된다. 2. unsafe 블럭 생성 class Program { static void Main(string[] args) { int number = 10; uns..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkI56%2FbtsnDN6j4DE%2FUDV3xQBv40xGqtnENczeN1%2Fimg.png)
.NET 환경의 컴파일 과정 - CLR, CIL, JIT, AOT
예전의 C, C++의 경우 개별 환경이 프로그램의 실행 시간에 영향을 미치는 문제가 있었지만 Java가 나오면서 컴파일된 바이트코드는 윈도우, 리눅스, 그 어떤 실행환경이든 JVM만 실행 가능하다면 실행할 수 있다는 장점을 통해 인기를 끌었고, 마이크로소프트는 이를 이용해 기존 문제를 해결할 수 있도록 .NET 환경에 가상 머신을 만들어서 .NET 환경의 언어로 개발된 IL(Intermediate Language, 중간 언어) 코드들은 .NET Framework가 설치된 어떠한 환경에서도 실행할 수 있도록 하였다. 대표적인 예시로 VB .NET, C#이 있다. CLR(Common Language Runtime, 공통 언어 런타임)은 이 가상머신의 구성요소 중 하나이며, CIL(Common Intermid..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS3bRo%2FbtsnLui2ajx%2F64QpSKpRGmHTUYHQqZ7kwK%2Fimg.png)
[Unity] 이벤트 함수는 어떻게 실행되는 것일까?
유니티엔진에서 ‘스크립트’를 작성한다고 하면, 보통 MonoBahaviour를 상속받는 클래스의 스크립트를 작성하는 것을 떠올릴 것이다. 그리고 자연스럽게 이 클래스 내에 Awake(), Start(), Update() 등의 메소드를 작성하게 된다. 심지어 비주얼 스튜디오 같은 개발 환경에서는 이런 메소드들에 대해 자동 완성도 해주고, 메소드 위에는 Unity 메시지라는 글자도 띄워준다. 이런 메소드들은 ‘Unity Event Function’, ‘Unity Message’ 또는 ‘Magic Method’라고 불린다. 그런데 생각해보면 이 메소드들은 MonoBehaviour 또는 그 부모 클래스로부터 상속받은 메소드도 아닌데, 어떻게 유니티가 알아서 찾아 적절한 타이밍에 호출해줄 수 있는 걸까? Send..
[Direct X] Constant Buffer(상수 버퍼) 란?
상수 버퍼(Constant buffer)는 정점 및 픽셀 셰이더에서 사용될 상수를 모아 놓은 버퍼이다. 상수 버퍼 사용을 위해 cpp 코드 영역에 상수 버퍼 타입의 구조체를 정의하고 셰이더에도 동일한 포맷으로 상수 버퍼 구조체를 정의. 그리고 시스템 메모리에서 구조체 변수 생성 및 값 설정 후 정점 혹은 픽셀 셰이더에 Set 시킨다. 값 설정 및 set은 보통 매 프레임 실행되는 Render() 함수에 적용한다. 그러면 이 Set 시킨 데이터를 설정한 셰이더에서 사용할 수 있다. 상수 버퍼를 사용하는 이유? 셰이더에서 매번 사용되는 상수, 하지만 cpp 파일에서 전달해주어야 한다고 가정할 때, 개별적으로 하나하나 값을 전달해 주는 것은 대역폭(bandwidth)이 크고 부담이 많이 된다고 한다. 따라서 ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9Uzr2%2FbtsnwlVzWiB%2FXggpkWQ35ek9BBBpA3JqLK%2Fimg.png)
[DX11] 튜토리얼 4 - 3D 공간
메커니즘은 매 프레임마다 Y값을 회전하고 이를 상수버퍼에다 실은 후 셰이더 파일에 1:1 매핑 시킴으로써 큐브의 버텍스가 매 프레임마다 위치를 변경하는데 마치 회전하는 효과를 준다. // 행렬의 전이를 계산 ConstantBuffer cb; cb.mWorld = XMMatrixTranspose( g_World ); cb.mView = XMMatrixTranspose( g_View ); cb.mProjection = XMMatrixTranspose( g_Projection ); g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb, 0, 0 ); g_pImmediateContext->VSSetShader( g_pVertexShade..