본문 바로가기
C#

C# study

by haheehee 2023. 8. 30.

Nullable Type

  • Null 을 가질 수 없는 데이터 타입을 Null을 가질 수 있는 타입으로 만든 새로운 타입
  • 대표적으로 값 타입(value type)들이 Null을 가질 수 없음
    • int, 구조체, double, bool 등의 데이터 타입은 값이 없는 상태(NULL)이 불가능한 데이터 타입
    • 클래스와 같은 reference type(=참조 타입)은 이미 Null 체크가 가능하기 때문에 따로 Nullable Type으로 만들지 않아도
  • int와 같은 값 타입에 대해서 **"값이 없다"**를 표현하기 위해 Nullable Type이 개발

<aside> ✔️ Nullable<T> 변수명

</aside>

<aside> ✔️ T? 변수명

</aside>


as 연산자

  • 객체를 캐스팅할 때 사용되는 연산자
  • 캐스팅에 성공하면 캐스트 결과를 리턴, 실패하면 null값 리턴
  • reference type간 캐스팅만 가능(value type은 불가)

is 연산자

  • 캐스팅 성공유무를 확인할 수 있는 연산자
  • is연산자는 캐스팅이 가능하면 true, 캐스팅이 불가능하면 false를 리턴
    • 단지 캐스팅 성공유무만 판단 가능

DateTime.Date 속성

DateTime.Date 속성 (System)

using System;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2008, 6, 1, 7, 47, 0);
      Console.WriteLine(date1.ToString());

      // Get date-only portion of date, without its time.
      DateTime dateOnly = date1.Date;
      // Display date using short date string.
      Console.WriteLine(dateOnly.ToString("d"));
      // Display date using 24-hour clock.
      Console.WriteLine(dateOnly.ToString("g"));
      Console.WriteLine(dateOnly.ToString("MM/dd/yyyy HH:mm"));
   }
}
// The example displays output like the following output:
//       6/1/2008 7:47:00 AM
//       6/1/2008
//       6/1/2008 12:00 AM
//       06/01/2008 00:00
DateTime date1 = DateTime.Now;
DateTime date2 = DateTime.UtcNow;
DateTime date3 = DateTime.Today;

Singleton

  • 객체지향 프로그래밍에서 사용되는 디자인 패턴
  • 싱글톤 패턴 : 해당 클래스의 인스턴스가 오직 하나만 생성, 전역적으로 접근 가능하도록한 것
  1. 오직 하나의 인스턴스
    • 싱클톤 클래스 : 내부적으로 자체 생성한 유일한 인스턴스 갖음 (다른 객체들이 이 인스턴스에 접근해 공유할 수 있음)
  2. 전역적인 접근
    • 어디서든 해당 인스턴스에 접근 가능
  3. 지연된 초기화
    • 싱글톤 인스턴스는 필요한 시점에 생성
    • 처음으로 인스턴스를 요청할 때 생성, 이후에는 같은 인스턴스 반환

  1. 클래스와 객체 지향 프로그래밍: C#은 객체 지향 프로그래밍을 지원하며, 클래스를 사용하여 객체를 만들 수 있습니다.
  2. class Person { public string Name { get; set; } public int Age { get; set; } public void SayHello() { Console.WriteLine("안녕하세요, 저는 " + Name + "이고 " + Age + "살입니다."); } } // 객체 생성과 사용 Person person = new Person(); person.Name = "John"; person.Age = 30; person.SayHello();
  3. 배열: 배열은 여러 개의 값을 하나의 변수에 저장할 수 있도록 도와줍니다.
  4. int[] numbers = { 1, 2, 3, 4, 5 }; string[] names = new string[3] { "Alice", "Bob", "Charlie" }; // 반복문을 사용하여 배열의 요소 접근 for (int i = 0; i < numbers.Length; i++) { Console.WriteLine(numbers[i]); }
  5. 예외 처리 (try-catch): 예외 처리를 통해 프로그램의 실행 중 오류를 처리할 수 있습니다.
  6. try { // 예외가 발생할 수 있는 코드 int result = 10 / 0; } catch (DivideByZeroException ex) { // 예외 처리 코드 Console.WriteLine("0으로 나눌 수 없습니다."); }

  1. LINQ (Language-Integrated Query): LINQ는 C#의 특별한 기능으로, 데이터를 쿼리하는 데 사용됩니다. 컬렉션과 데이터베이스, XML 등의 데이터 원본에 대해 일관된 방법으로 쿼리를 작성할 수 있습니다.
  2. var numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = from num in numbers where num % 2 == 0 select num; // 또는 메서드 구문을 사용할 수 있습니다. var oddNumbers = numbers***.Where(num => num % 2 != 0).ToList();***
  3. 이벤트와 델리게이트 (Events and Delegates): 이벤트와 델리게이트는 C#에서 강력한 이벤트 처리 메커니즘을 제공합니다. 이벤트는 클래스에서 발생하는 특정 동작에 대한 통지를 가능하게 하며, 델리게이트는 이벤트 처리기를 연결하는 데 사용됩니다.
  4. public class Button { public delegate void ClickEventHandler(object sender, EventArgs e); public event ClickEventHandler Click; public void OnClick() { // 버튼이 클릭되었을 때 이벤트를 발생시킴 if (Click != null) Click(this, EventArgs.Empty); } } // 버튼 인스턴스 생성 및 이벤트 처리기 연결 Button myButton = new Button(); myButton.Click += MyButtonClickHandler; // 이벤트 처리기 정의 void MyButtonClickHandler(object sender, EventArgs e) { Console.WriteLine("버튼이 클릭되었습니다."); }
  5. Nullable 타입: C#에서 값 형식에 null을 지원하기 위해 Nullable<T> 타입을 사용할 수 있습니다.
  6. int? nullableInt = null; if (nullableInt.HasValue) { int intValue = nullableInt.Value; }
  7. 인터페이스 (Interfaces): C#은 인터페이스를 지원하여 다중 상속을 피하고 클래스 간의 계약을 정의하는 데 사용됩니다.
  8. public interface IShape { void Draw(); } public class Circle : IShape { public void Draw() { Console.WriteLine("원을 그립니다."); } } public class Rectangle : IShape { public void Draw() { Console.WriteLine("사각형을 그립니다."); } }
  9. Async/Await: C# 5.0부터 Async와 Await 키워드를 통해 비동기 프로그래밍을 지원합니다. 이를 사용하면 비동기 작업을 간단하고 쉽게 처리할 수 있습니다.
  10. public async Task<string> DownloadDataAsync(string url) { using (HttpClient client = new HttpClient()) { string data = await client.GetStringAsync(url); return data; } }

Delegate 델리게이트

  • 델리게이트(Delegate)는 C#에서 함수 포인터와 비슷한 개념
  • 메서드 참조를 저장하고 호출하는데 사용되는 형식
  • 델리게이트는 특정 형식의 메서드 시그니처를 나타냄
  • 해당 시그니처와 일치하는 메서드를 참조할 수 있음
  • 델리게이트는 이벤트 처리, 비동기 프로그래밍, LINQ 등 다양한 상황에서 유용하게 사용됨
  • 델리게이트를 사용하면 콜백 함수를 구현하거나, 동적으로 메서드를 선택하거나, 런타임에 메서드를 교환하는 등의 유연한 프로그래밍이 가능해짐

델리게이트의 선언 형식은 다음과 같습니다:

delegate 반환타입 델리게이트이름(매개변수타입 매개변수1, 매개변수타입 매개변수2, ...);
  1. 델리게이트 인스턴스 생성과 메서드 참조 설정:
  2. public delegate int MyDelegate(int x, int y); public class MathOperations { public int Add(int a, int b) { return a + b; } public int Subtract(int a, int b) { return a - b; } } MathOperations math = new MathOperations(); MyDelegate addDelegate = new MyDelegate(math.Add); MyDelegate subtractDelegate = new MyDelegate(math.Subtract);
  3. 델리게이트를 사용하여 메서드 호출:
  4. int result1 = addDelegate(5, 3); // 5 + 3 = 8 int result2 = subtractDelegate(5, 3); // 5 - 3 = 2
  5. 델리게이트를 파라미터로 전달:
  6. public int Calculate(MyDelegate operation, int a, int b) { return operation(a, b); } int result3 = Calculate(addDelegate, 10, 5); // 10 + 5 = 15 int result4 = Calculate(subtractDelegate, 10, 5); // 10 - 5 = 5

델리게이트는 또한 익명 메서드(Anonymous Methods)와 람다 식(Lambda Expressions)과 함께 사용하여 코드를 더욱 간결하고 간편하게 작성할 수 있습니다.

  1. 익명 메서드:
  2. MyDelegate anonymousDelegate = delegate (int x, int y) { return x * y; }; int result5 = anonymousDelegate(3, 4); // 3 * 4 = 12
  3. 람다 식:
  4. MyDelegate lambdaDelegate = (x, y) => x / y; int result6 = lambdaDelegate(10, 2); // 10 / 2 =

델리케이트

메소드의 리턴값이나 인수의 정의만을 미리 해두고, 나중에 셋팅하는 방법.

delegate 리턴값 DelegateName([인수]);
DelegateName 변수 = 실체가되는함수([인수]);

LINQ (Language Integerated Query)

  • 특정 데이터들에서 Query를 하여 데이터를 빠르고 편리하게 추출하는 방식
  • 해당기능은 C# 3.0부터 추가된 문법
  • 기본적으로 람다표현식을 사용하여 간결하고 가독성 좋게 작성 가능
  • Query를 하는데에는 SQL을 사용
    • SQL 이란 Structured Query Language의 약자
    • SQL에서 가장 많이 사용하는 문법
      • from : 어떤 데이터에서 찾을 것인가
      • where : 어떤 조건으로 찾을 것인가
      • order by : 어떤 항목을 기준으로 정렬할 것인가
      • select : 어떤 항목을 추출할 것인가
    // 쿼리식 표현
    var v = ***from*** ord ***in*** db.Orders                              
            ***where*** ord.Customer_ID == "FRANS"
            ***orderby*** ord.Order_Date ***ascending***
            ***select*** ord;
    
    // 메서드식 표현1
    var v = db.Orders.***Where***(order => order.Customer_ID == "FRANS").***Select***(o => o);
    
    // 메서드식 표현2
    // 위의 메서드식 표현1의 Select()메서드는 동일데이터를 변형없이 리턴하므로 생략가능
    var v = db.Orders.***Where***(order => order.Customer_ID == "FRANS");
    

'C#' 카테고리의 다른 글

C# Dictionary 딕셔너리  (0) 2023.11.07
C#의 record  (0) 2023.10.25
#2 kioskProject - CRUD, ORM  (0) 2023.08.31
#1 kioskProject - erd diagram  (0) 2023.08.31

댓글