c#

    [C#] default와 new() 제약조건 사용하기

    generic 함수를 작성하는데, 기본 값을 생성해줘야 할 때가 있었다. 이 때 사용하게 되는 키워드가 new와 default다. 이 글에서는 class, struct 그리고 enum을 사용할 때 어떤 점을 주의해야 하는지 살펴보도록 하겠다. new와 default new는 generic 함수의 제약 조건이다. 해당 제약 조건을 걸면 generic 함수 내에서 new T()와 같은 코드를 사용할 수 있다. 이 제약 조건을 걸었을 경우 struct와 enum은 항상 사용가능하고, class는 구현에 따라 달라지게 된다. default는 C#의 기본 키워드로 제약 조건이 필요하지도 않고, 다른 많은 곳에서도 사용할 수 있는 기능이다. default를 각 타입에 사용할 경우 아래 표와 같은 값이 생성된다. t..

    [C#] 제네릭 메서드(Generic Method) 널(Null) 반환 방법

    매개변수가 null이 아니면, 매개변수의 값을 반환하고 매개변수의 값이 null이면, null을 반환하는 코드다. T ReturnValue(T val) { if (val != null) { return val; } else { return null; } } 하지만, return null; 코드에서 에러가 발생한다 C#에서 null이 올 수 있는 데이터 타입이 있고 불가능한 데이터 타입이 존재한다. 기본적으로 숫자형 타입들은 Nullable 연산자를 사용하지 않으면, null값을 할당할 수 없다. 즉, 제네릭 타입은 null이 가능한 타입도 있고 불가능한 타입이 있으므로 null을 반환할 수 없다. 만약, 제네릭 메서드에서 null을 반환하고 싶은 경우 default(T)를 사용한다. T ReturnVal..

    [C#] 자료형(Data Type)의 기본 값(default) 연산자

    C# 7.1부터는 컴파일러가 자료형을 유추하여 기본값을 할당하는 default 리터럴이 추가되었으며, 코드를 심플하게 작성할 수 있다. default 연산자, 리터럴 default 연산자는 괄호 안에 자료형을 명시해준다. int num = default(int); Console.WriteLine(num); // 0 default 리터럴은 괄호를 생략할 수 있다. 컴파일러가 변수 num의 자료형을 유추하여 기본값을 할당한다. int num = default; Console.WriteLine(num); // 0 아래 표는 각 타입의 기본 값이다. 자료형(Data Type) 기본값 참조 형식 null 정수 숫자 유형 0 부동 소수점 숫자 유형 0 bool false char '\0' enum 0 struct ..

    [C#] 리플렉션 (Reflection) 예시

    리플렉션 개념 사용 방법 Assembly.GetType으로 접근하려는 Type 검색 Reflection을 사용하기 위해서는 Assembly.GetType을 통해 접근하고자 하는 클래스의 Type을 찾아야 한다. Type이라는 용어가 다소 생소할 수도 있는데, 클래스명 = Type이라고 생각하면 된다. public Type GetAuthDataManagerType() { //모든 assembly를 검색합니다. foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var test3 = assembly.GetTypes(); foreach (var type in assembly.GetTypes()) { //찾는 Type이 있을 경우 반환합니다...

    [C#] var 키워드

    var 사용 예제 var는 암시적 타입 지역변수(implicitly typed local variable) 이다. var는 데이터 타입을 개발자가 아닌 컴파일러(Compiler) 가 결정한다. 다음은 var 로 지역변수를 선언한 예제 코드다. 아래 예제에서 var idx의 값은 int형 정수 10으로 설정됨으로 컴파일러에 의해 int형으로 타입이 결정된다. var idx = 10; //Implicitly typed. int idx = 10; //Explicitly typed. 다음은 C#에서 사용하는 var 사용 예제코드다. using System.Linq; namespace VarTest { class Program { static void Main(string[] args) { // idx 변수 in..

    [C#] 참조에 의한 매개변수 전달 (ref, out)

    값에 의한 호출 (Call by value) 함수와 메소드를 호출할 때, 필요한 값들을 전달해주기 위해 매개변수에 값을 넣어 전달해 준다. 허나, 기본적으로 값 형식(Value type)은 매개 변수로 전달 시에 해당 인자의 값을 복사해서 전달을 한다. 이건 함수와 메소드에서 값을 리턴할 때도 마찬가지다. 이것을 값에 의한 호출(Call by value)이라고 한다. 두 매개 변수를 받아서 서로 값을 바꾸는 Swap() 함수에서 이런 예시가 자주 나온다. static void Swap(int x, int y) { int temp = x; x = y; y = temp; } static void Main(string[] args) { int x = 3; int y = 5; Swap(x, y); Console..

    [C#] 구조체 (struct)로 메모리 절약하기

    메모리의 타입(유형) 스택(Stack) 스택은 매우 단순하고 균일한 방식으로 할당되는 연속적인 메모리 영역이다. 메모리는 스택의 하위 메모리 주소에서 상위 메모리 주소로 할당 된다. 가장 최근에 할당된 메모리만 해제 할 수 있으며, 당연히 스택 맨 아래에 할당 된(먼저 할당 된) 메모리를 해제하려면 위에 할당된 메모리를 모두 해제해야만 한다. 스택에 할당 되지 않은 메모리는 단순한 메모리 포인터로 추적된다. 스택 영역에 메모리가 할당 되면 포인터가 적절한 양만큼 위로 이동한다. 반대로 메모리가 해제되면 포인터가 다시 아래로 이동한다. 실제 스택 영역에서 메모리가 해제 된다고 하더라도 메모리에 저장되어 있는 값을 지우는 것이 아닌 단순히 포인터만 이동하고, 해당 메모리는 필요 할 때 덮어 쓰여지게 된다. ..

    [C#] 관리되는, 관리 되지 않는 코드

    관리되는 코드 .NET CIL로 작성하고 컴파일 하는 .NET상의 코드 - GC 메모리 관리가 된다. 관리되지 않는 코드 기계 코드를 직접 컴파일 하도록 컴파일되는 .NET에 없는 코드 - GC 메모리 관리가 안된다. ex) 윈도우 시스템 자원 IntPtr - 인터포인터 관리되지 않는 메모리 블록에 대한 포인터 정수형 포인터를 의미하는 값 형식의 타입 포인터는 메모리 주소값을 보관하는 곳 IntPtr타입은 메모리 주소를 가리키는것 외에 윈도우 OS의 핸들값을 보관하는 용도로 쓰인다. 핸들은 윈도우 OS가 특정 자원에 대한 식별자로서 보관하는 값인데 일례로 파일이 좋은예다. 파일처리, OS에서 제공되는것 처리를 할때 사용된다. ex) 이미지 처리에서도 쓰인다. Marshal Class - 마샬 관리되지 않..

    C++과 C#의 차이 (데이터, 메모리)

    게임 개발에 사용하는 대표적인 엔진인 언리얼 엔진과 유니티 엔진은 각각 C++, C# 언어로 스크립트를 작성한다. 두 언어 모두 C언어에서 파생되었다는 것과 객체지향 프로그래밍 언어라는 공통점이 있지만, 꽤나 큰 차이가 있다. · 컴파일 결과 C++와 C#은 똑같이 컴파일이라는 과정을 거쳐 실행 파일을 생성하게 되지만, 프로그래머가 작성한 소스파일의 컴파일 결과로 생성되는 중간 파일의 형태가 다르다. C++로 작성한 코드는 어플리케이션의 실행 파일을 운영체제가 바로 실행하기 때문에, 컴퓨터가 이해할 수 있는 기계어에 가까운 어셈블리어라는 언어로 컴파일한다. 반대로 C#으로 작성한 어플리케이션은 운영체제 위의 .NET이라는 가상 머신 실행 환경에서 실행되기 때문에 .NET에 적합한 IL(Intermidia..

    C, C++, C# VB 데이터 타입 및 비교표

    C# 데이터 타입 및 C,C++,VB와 비교표 (tistory.com)