728x90
반응형

using System;
class AdvancedSyntaxAndFeatures
{
// C# 고급 문법과 기능
// 제너릭(Generic)
// - 클래스나 메서드를 정의할 때, 데이터 형식을 일반화하는 것
// - 클래스나 메서드를 선언할 때, 데이터 형식을 지정하지 않고, 인스턴스를 생성할 때 데이터 형식을 지정할 수 있다.
// - 제너릭을 사용하면 코드의 재사용성을 높일 수 있다.
// - 제너릭 클래스를 선언할 때는 클래스 이름 뒤에 <T>를 붙이고, 메서드를 선언할 때는 메서드 이름 뒤에 <T>를 붙인다.
// - T는 임의의 데이터 형식을 나타내는 식별자이다.
// - 제너릭 클래스나 메서드를 사용할 때는 클래스나 메서드 이름 뒤에 <데이터 형식>을 붙인다.
// - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정해야 한다.
// - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정하지 않으면 컴파일 오류가 발생한다.
// - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정할 수 있는데, 이를 형식 매개변수(Type Parameter)라고 한다.
// - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정할 수 있는데, 이를 형식 인수(Type Argument)라고 한다.
// 제너릭 클래스 선언 예시
class Stack<T>
{
private T[] elements;
private int top;
public Stack()
{
elements = new T[100];
top = 0;
}
public void Push(T item)
{
elements[top++] = item;
}
public T Pop()
{
return elements[--top];
}
}
public static void TestGeneric()
{
Stack<int> intStack = new Stack<int>();
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop());
Console.WriteLine(intStack.Pop());
Console.WriteLine(intStack.Pop());
Stack<string> stringStack = new Stack<string>();
stringStack.Push("A");
stringStack.Push("B");
stringStack.Push("C");
Console.WriteLine(stringStack.Pop());
Console.WriteLine(stringStack.Pop());
Console.WriteLine(stringStack.Pop());
}
// Out, Ref 키워드
// - Out 키워드 : 메서드의 반환값이 여러 개일 때 사용
// - Ref 키워드 : 메서드의 매개변수를 참조로 전달할 때 사용
// out 키워드 사용 예시
static void Divide(int a, int b, out int quotient, out int remainder)
{
quotient = a / b;
remainder = a % b;
}
// ref 키워드 사용 예시
static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void TestOutRef()
{
int quotient, remainder;
Divide(7, 3, out quotient, out remainder);
Console.WriteLine($"몫 : {quotient}, 나머지 : {remainder}");
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"x : {x}, y : {y}");
}
// Null 조건부 연산자
// - Null 조건부 연산자는 ?.로 표시하며, 참조형식 변수가 null이 아닐 때만 멤버에 접근한다.
// Null 조건부 연산자 사용 예시
static void PrintLength(string message)
{
Console.WriteLine(message?.Length);
}
static void TestNullConditionalOperator()
{
string message = null;
PrintLength(message);
// message가 null이므로 null이 출력된다.
}
// Null 병합 연산자
// - Null 병합 연산자는 ??로 표시하며, 왼쪽 피연산자가 null이 아니면 왼쪽 피연산자를 반환하고, null이면 오른쪽 피연산자를 반환한다.
// Null 병합 연산자 사용 예시
static void PrintMessage(string message)
{
Console.WriteLine(message ?? "기본 메시지");
}
static void TestNullCoalescingOperator()
{
string message = null;
PrintMessage(message);
// message가 null이므로 "기본 메시지"가 출력된다.
}
// 문자열 보간
// - 문자열 보간은 문자열 안에 변수나 식을 삽입하는 것을 말한다.
// - 문자열 보간은 $를 문자열 앞에 붙이고, 중괄호 {} 안에 변수나 식을 넣는다.
// 문자열 보간 사용 예시
static void TestStringInterpolation()
{
int x = 10;
int y = 20;
Console.WriteLine($"x : {x}, y : {y}, x + y : {x + y}");
// x : 10, y : 20, x + y : 30이 출력된다.
}
// 람다식
// - 람다식은 익명 메서드를 간결하게 표현하는 방법이다.
// - 람다식은 매개변수 목록, 화살표(=>), 식으로 구성된다.
// - 람다식은 무명 메서드와 달리 람다식이 선언된 위치에 따라 컴파일러가 자동으로 형식을 추론한다.
// 람다식 사용 예시
static void TestLambdaExpression()
{
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(1, 2));
// add는 두 개의 int형 매개변수를 받아 더한 결과를 반환하는 람다식이다.
// add(1, 2)는 1 + 2를 계산한 결과인 3을 출력한다.
}
}728x90
반응형
'C#' 카테고리의 다른 글
| C# 예외 처리, 값형과 참조형식 (0) | 2025.03.04 |
|---|---|
| C# 인터페이스와 열거형 (0) | 2025.03.03 |
| C# 클래스와 객체 (0) | 2025.02.13 |
| C# 메서드(Method)와 구조체(Structures) (0) | 2025.02.11 |
| C# 배열과 컬렉션 (1) | 2025.02.10 |