ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • string
  • 그래픽스
  • 티스토리챌린지
  • C
  • 백준
  • 함수
  • C++
  • 알고리즘
  • 배열
  • 포인터
  • 문자열
  • SQL
  • 오블완
  • 클래스
  • 파이썬
  • 유니티
  • Unity
  • 언리얼
  • 프로그래머스
  • c#

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[C#] default와 new() 제약 조건 사용하기
프로그래밍 언어/C#

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

2024. 12. 16. 16:37

new와 default

new는 generic 함수의 제약 조건이다. 해당 제약 조건을 걸면 generic 함수 내에서 new T()와 같은 코드를 사용할 수 있다. 이 제약 조건을 걸었을 경우 struct와 enum은 항상 사용 가능하고, class는 구현에 따라 달라지게 된다. 

 

default는 C#의 기본 키워드로 제약 조건이 필요하지 않고, 다른 많은 곳에서도 사용할 수 있는 기능이다. default를 각 타입에 사용할 경우 아래 표와 같은 값이 생성된다.

class

class는 참조 타입(reference type)이기 때문에 null을 허용하기에 default를 사용했을 때 값은 항상 null이 된다.

new의 경우 생성자를 하나도 만들지 않은 상태라면, 항상 사용이 가능하다(기본 생성자). 반대로 매개 변수가 있는 생성자만 있을 때는 사용할 수 없다.

public class ClassDefault1
{
    public int item1 { get; set; }
    public string item2;
}

public class ClassDefault2
{
    public int item1 { get; set; }
    public string item2;

    public ClassDefault2(int item1Value)
    {
        item1 = item1Value;
    }
}

class Program
{
    public static TRefType GetDefault<TRefType>()
where TRefType : new() => new TRefType();

    static void Main(string[] args)
    {
        var cls = GetDefault<ClassDefault1>();
        // ClassDefault1 { item1 = 0, item2 = null }
        var cls2 = GetDefault<ClassDefault2>();
        // Error CS0310
    }
}

struct

값 타입 (value type)이다. 참조가 아니기 때문에 null을 허용하지 않는다.

public struct StructDefault {
    public int item1 { get; set; }
    public string item2;

    public StructDefault(int i) {
        item1 = i;
        item2 = "";
    }
}

var str = default(StructDefault);
var str2 = new StructDefault());
// str, str2 == StructDefault { item1 = 0, item2 = null }

 

만약 default나 new로 생성하고자 하면 각 멤버에 기본 값을 설정해주면 된다.

public struct StructDefault {
    public int item1 { get; set; } = 10;
    public string item2 = "test";
}

var str = default(StructDefault);
// StructDefault { item1 = 10, item2 = "test" }

enum

enum은 struct와 같은 값 타입이다. default와 new를 사용할 때 항상 '(E) 0'이 설정된다.

public enum EnumDefault1 {
    Item1,
    Item2,
    Item3,
    Item4,
}
public enum EnumDefault2 {
    Item1, // 0
    Item2, // 1
    Item3 = 0,
    Item4, // 1
}
public enum EnumDefault3 {
    Item1 = 1,
    Item2, // 2
    Item3, // 3
    Item4, // 4
}

var enm1 = default(EnumDefault1);
// EnumDefault1.Item1
var enm2 = default(EnumDefault2);
// EnumDefault2.Item1
var enm3 = default(EnumDefault3);
// 0

var newEnm = new EnumDefault1();
// EnumDefault1.Item1

 

EnumDefault3은 항목 중 0인 값이 없기 때문에 상수 0이 들어가게 된다. 이런 경우가 생길 수 있기 때문에 MSDN에서는 상수 0인 값이 항상 enum에 포함되는것을 권장한다.

 

만약 enum만 사용가능한 generic 함수를 만들고 싶다면 아래와 같은 코드를 작성하면 된다, 다만 이런 형태의 코드를 사용할 경우, 컴파일러 오류로 체크되지 않을 수 있다.

public TEnum EnumDefault<TEnum>()
    where TEnum : struct, IConvertible
{
    if (!typeof(TEnum).IsEnum) 
   {
      throw new ArgumentException("TEnum must be an enumerated type");
   }
    return default(TEnum);
}

 

default와 new() 제약조건 사용하기 • CodeFIct

저작자표시 (새창열림)

'프로그래밍 언어 > C#' 카테고리의 다른 글

[C#] 7.0 튜플 (Tuple)  (0) 2025.02.09
[C#] switch문에 추가된 기능 (버전 7~9)  (0) 2025.02.03
[C#] Attribute : Obsolete - 더 이상 사용하지 않거나 그럴 예정인 코드에 대해서  (0) 2024.12.16
[C#] IsNullOrEmpty와 IsNullOrWhiteSpace의 차이점  (0) 2024.11.10
[C#] 포인터 관련 unsafe fixed 키워드  (0) 2024.05.23
    '프로그래밍 언어/C#' 카테고리의 다른 글
    • [C#] 7.0 튜플 (Tuple)
    • [C#] switch문에 추가된 기능 (버전 7~9)
    • [C#] Attribute : Obsolete - 더 이상 사용하지 않거나 그럴 예정인 코드에 대해서
    • [C#] IsNullOrEmpty와 IsNullOrWhiteSpace의 차이점
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바