EveryDay.DevUp

C# 2.0 본문

C#

C# 2.0

EveryDay.DevUp 2025. 1. 10. 21:02

주요 변경 사항

- Generic / ?? (널병합 연산자) / default 예약어 / yield return, break / partial / 값 형식? Nullable / Anonymous method / static class 

Generic

- C# 1.0에서 기본 타입으로 컬랙션 객체를 생성할 경우 박싱/언박싱 문제가 발생

: ArrayList<object> 형식으로 구현되었기 때문에 int <-> object로 박싱/언박싱이 발생

: 박싱 -> 스택 메모리에 값이 힙메모리에 복사되는 것 // 언박싱 -> 힙 메모리에 값이 스택메모리에 복사 되는 것

- Generic을 사용할 경우 CLR은 JIT 컴파일 시에 타입에 따라 확장된 기계어 코드를 생성

- 클래스와 메서드에 사용할 수 있음

- 제네릭을 사용함으로써 박싱/언박싱의 문제와 중복된 코드 문제를 해결할 수 있음

- 제네릭은 형식 매개 변수 제약 조건을 통해 형식 매개 변수에 사용할 수 있는 타입을 지정할 수 있음

: class, struct, new, 상속받은 클래스 (인터페이스 등)

?? (널 병합 연산자)

- 피연산자1 ?? 피연산자2

: 참조형식의 피연산자1이 null 이 아니라면 피연산자1을 null 이라면 피연산자2를 반환

default 예약어

-  초기화 되지 않은 값 형식의 초기 값은 0, 참조 형식의 초기 값은 null로 초기화 됨

: struct의 default는 구조체를 생성하여 내부의 선언된 변수를 값 형식 또는 참조 형식에 따라 초기 값을 설정함

public struct A
{
    public int value;
}

public struct B
{
    public A aStruct;
}

public class DefaultKeyword : IExample
{
    public void Run()
    {
        var bStruct = default(B);
        Console.WriteLine(bStruct.aStruct.value);
    }
}

// 결과 0

yield return / break

- IEnumerable, IEnumerator 인터페이스를 이용해 한 열거 기능을 쉽게 구현할 수 있음 

-  yield return이 실행된 코드의 위치를 기억했다가 다음에 다시 한번 메서드가 이후 코드부터 실행을 재개하는 개념

: 컴파일러는 yield 문이 사용된 메서드를 IEnumerable, IEnumerator 를 구현한 코드로 치환

Partial

- 클래스의 소스코드를 2개 이상으로 나눌 수 있도록 구현 가능

- 컴파일러는 빌드 시에 같은 프로젝트에 있는 partial 클래스를 단일 클래스로 빌드 

Nullable

- System.Nullable<T> 구조체를 의미 

- 일반적인 값 형식은 초기 값이 0으로 할당되는데, 초기 값이 0인지, 0이라는 숫자를 넣은 것인지 상태를 구분할 수 없는 단점이 있음

- 값 형식에 ? 문자를 함께 붙일 경우 컴파일러가 자동으로 Nullable<T> 로 변경함

Anonymous Method 

- 이름이 없는 메서드로, 델리게이트에 전달되는 메서드가 일회성으로 필요할 때 사용 

- 익명 메서드가 사용되면 빌드 시점에 특별한 문자열을 하나 생성해서 메서드를 구현함

Static classes

- 클래스의 정의에도 static 예약어를 사용할 수 있게 되었고, 정적 클랙스에는 정적 멤버만을 내부에 포함할 수 있음