한정자

C#/Language

C# - Language - Async 한정자 / Await 연산자

Introduction async 한정자는 비동기 프로그래밍을 쉽게 지원하기 위해 C# 5에 도입되었다. 메서드, 무명 메서드, 람다 식 등에 사용할 수 있으며, await 연산자와 함께 사용된다. async 한정자는 로직 내에 await 연산자가 있다는 것을 컴파일러에 알려준다. await 연산자는 지정한 작업이 끝날 때까지 호출자의 스레드가 블락되지 않고 기다릴 수 있게 해준다. async 한정자는 다음과 같은 리턴 형식을 가질 수 있다. GetAwaiter 메서드가 있는 형식 (Task, Task, ValueTask, ValueTask ...) void void의 경우 이벤트 처리에만 사용한다. 일반적으로는 Task를 사용한다. Async 선언 기본적인 async 메서드는 아래와 같다. // 리턴이..

C#/Language

C# - Language - Event

Introduction event 한정자는 객체에서 사건이 발생했을 때 다른 객체에 알려주는 역할을 한다. event는 특수한 종류의 멀티캐스트 대리자로 여러 객체에서 구독하는 것이 가능하다. event의 처리는 메서드 또는 람다 식을 통해 정의한다. 액세스 한정자를 적용할 수 있으며, 파생 클래스에서 상속받아 재정의 하는 것이 가능하다. event는 GUI 및 비동기식 로직 처리 등에 활용된다. Example // Declare & invoke event public class FooArgs : EventArgs { public FooArgs(int a) => A = a; public int A { get; set; } } public class Pub { public event EventHandler..

C#/Language

C# - Language - In 제네릭 한정자

Introduction 제네릭 한정자로 사용되는 in 키워드는 참조 형식 매개 변수를 반공변으로 할 수 있는 한정자이다. 제네릭 인터페이스 선언 및 대리자에 사용할 수 있다. IComparer 같은 인터페이스가 이를 이용해 구현되어 있다. 대리자의 경우 반환 형식이 void이며 파라미터에 형식이 정의되는 경우 사용 가능하다. 반공변성을 부여하여 암시적 변환에 의해 상위 형식의 사용이 가능해진다. Example // Interface 예시 public interface InterfaceA { Type GetType() => typeof(T); } public class ClassA : InterfaceA { } private static void Main(string[] args) { InterfaceA ..

C#/Language

C# - Language - Out 제네릭 한정자

Introduction 제네릭 한정자로 사용되는 out 키워드는 참조 형식 매개 변수를 공변으로 할 수 있는 한정자이다. 제네릭 인터페이스 선언 및 대리자에 사용할 수 있다. 대표적인 예시로는 IEnumerable 인터페이스가 있다. 대리자의 경우 반환 형식으로만 사용 가능하다. 공변성을 부여하여 암시적 변환에 의해 파생 형식의 사용이 가능해진다. Example // Interface 예시 public interface InterfaceA { Type GetType() => typeof(T); } public class ClassA : InterfaceA { } private static void Main(string[] args) { InterfaceA a = new ClassA(); Interface..

C#/Language

C# - Language - New 한정자

Introduction new 한정자는 override와 달리 동일한 이름을 가진 상속받은 멤버를 숨기는 데 사용한다. new 한정자 없이 멤버를 숨기는 것이 가능하지만, 컴파일러에서는 CS0108 경고를 출력한다. 반대로, 숨길 것이 없을 때 new 한정자를 사용하면 CS0109 경고가 출력된다. new 한정자를 사용하면 컴파일러에서는 명시적으로 선언한 것으로 받아들여 경고가 발생하지 않는다. 한정자를 이용하여 상속된 멤버를 숨기더라도, 캐스팅 또는 정규화된 이름을 사용하여 접근 가능하다. Example public class Base { public string Foo() => "Foo"; public class Inner { } } public class Derived : Base { public ..

C#/Language

C# - Language - Private protected 한정자

1. Introduction private protected는 멤버 액세스 한정자이다. 선언 어셈블리 안의 파생된 형식까지 액세스 가능하며, 이외 영역에서는 접근이 불가능하다. 2. Information 2.1. private private의 범위는 가장 낮은 액세스 수준으로, 선언 형식 내에서만 사용할 수 있다. 이를 다이어그램 및 코드로 나타내면 아래와 같다. namespace Assembly1 { public class BaseClass { private string A = "private"; } internal class DerivedA : BaseClass { public DerivedA() { A = "DerivedA"; // CS0122 } } internal class OtherClass ..

C#/Language

C# - Language - Protected internal 한정자

1. Introduction protected internal은 멤버 액세스 한정자이다. 선언 어셈블리 또는 파생된 형식에서 액세스 가능하며, 이외 영역에서는 접근이 불가능하다. 2. Information 2.1. protected protected의 범위는 선언 및 파생 클래스 내부로, 클래스 외부에서는 접근이 불가하다. 이를 다이어그램 및 코드로 나타내면 아래와 같다. // Assembly 1 namespace Assembly1 { public class BaseClass { protected string A = "protected"; } internal class DerivedA : BaseClass { public DerivedA() { A = "DerivedA"; // OK } } interna..

C#/Language

C# - Language - File 한정자

Introduction file 한정자는 C# 11 (.NET 7) 에 도입된 형식 한정자다. 이 한정자는 형식의 범위를 해당 파일로 지정한다. 다른 코드 파일에서 이름이 겹치는 객체가 있는 경우 편리하게 사용할 수 있다. Example // File 1 namespace A { file class Stock { public string Name { get; init; } public string Code { get; init; } public override string ToString() => $"{Name}-{Code}"; } } // File 2 namespace A { file class Stock { public string Name { get; init; } public string Code..

C#/Language

C# - Language - Private 한정자

Introduction private 키워드는 멤버 액세스 한정자이다. 가장 낮은 액세스 수준으로, 선언 형식 내에서만 사용할 수 있다. Example namespace Assembly1 { public class BaseClass { private string A = "private"; } internal class DerivedA : BaseClass { public DerivedA() { A = "DerivedA"; // CS0122 } } internal class OtherClass { public BaseClass Base = new BaseClass(); public OtherClass() { Base.A = "OtherClass"; // CS0122 } } } Backing field of..

C#/Language

C# - Language - Internal 한정자

Introduction internal 키워드는 형식 및 멤버에 대한 액세스 한정자이다. internal로 선언하면 해당 어셈블리 내에서 public같이 접근이 가능하게 된다. 주로 모듈 단위 프로젝트에서 내부 구성요소에 사용한다. Example Type // Assembly 1 namespace Assembly1 { internal class BaseClass { internal string A = "internal"; } internal class DerivedA : BaseClass { public DerivedA() { A = "DerivedA"; // OK } } internal class OtherClass { public BaseClass Base = new BaseClass(); priva..

C#/Language

C# - Language - Protected 한정자

Introduction protected 한정자는 멤버 액세스 한정자이다. protected의 범위는 선언 및 파생 클래스 내부로, 클래스 외부에서는 접근이 불가하다. Example // Assembly 1 namespace Assembly1 { public class BaseClass { protected string A = "protected"; } internal class DerivedA : BaseClass { public DerivedA() { A = "DerivedA"; // OK } } internal class OtherClass { public BaseClass Base = new BaseClass(); public OtherClass() { Base.A = "OtherClass"; /..

C#/Language

C# - Language - Public 한정자

Introduction public 한정자는 범위에 제한이 없는 액세스 한정자이다. 모든 액세스 시도가 성공하기 때문에 외부 노출이 필요 없는 멤버에 대해서는 public을 사용하지 않는 것이 좋다. Example // Assembly 1 namespace Assembly1 { public class BaseClass { public string A = "public"; } internal class DerivedA : BaseClass { public DerivedA() { A = "DerivedA"; // OK } } internal class OtherClass { public BaseClass Base = new BaseClass(); public OtherClass() { Base.A = "Ot..

Peponi_
'한정자' 태그의 글 목록