Study/TIL(Today I Learned)

24.08.05 C#

에린_1 2024. 8. 5. 19:47
728x90

C#

튜플(Tuple)

  • C#에서 여러 개의 값들을 하나의 값처럼 묶어 사용하는 데이터 구조이다.
  • 서로 다른 타입의 값들을 하나의 단위로 묶어서 처리할 수 있어, 메서드에서 여러 값을 반환하거나 임시 데이터 구조를 생성할 때 유용하게 사용된다.
  • 튜플을 값 타입이며, C# 7.0 이후로 개선된 ValueTuple 구조를 사용하여 더 간결하고 효율적으로 사용할 수 있다.

특징

  1. 불변성
    • 기본적으로 불변(immutable)이다. 한 번 값을 설정하면 수정할 수 없다.
    • 이는 다중 스레드 환경에서 데이터의 일관성을 유지하는 데 유용하다.
  2. 값 타입
    • 힙이 아닌 스택에 할당되어 메모리 할당이 더 효율적이다.
  3. 가변 길이
    • 튜플은 최대 8개의 요소를 가질 수 있으며, 필요에 따라 더 많은 요소를 중첩 튜플로 확장할 수 있다.
  4. 명명된 요소
    • C# 7.0 이후에는 튜플의 요소에 이름을 지정할 수 있어 코드의 가독성을 높일 수 있다.

장점

  • 간단한 구조
    • 여러 값을 쉽게 그룹화할 수 있다.
  • 임시 데이터 구조
    • 복잡한 데이터 구조를 정의하지 않고도 여러 값을 반환하거나 전달할 수 있다.
  • 명명된 요소
    • 요소의 의미를 명확히 할 수 있다.

단점

  • 불변성
    • 요소의 값을 변경할 수 없다. 필요한 경우 새로운 튜플을 만들어야 한다.
  • 복잡한 구조 표현의 한계
    • 많은 요소를 가지거나 복잡한 데이터 구조를 표현하기에는 부적합하다.
  • 의미 부족
    • 복잡한 데이터 구조의 비해 의미가 명확하지 않을 수 있다.

IEnumerable<out T>

  • C#에서 제네릭 인터페이스 IEnumeable<T>를 나타내며, 제네릭 타입 매개변수 T가 공변성(Covariance)을 가지는 것을 의미한다.
  • 공변성은 타입 계층에서 파생된 타입을 사용할 수 있게 해주는 기능으로, 이는 특히 인터페이스나 델리게이트에서 유용하게 쓰인다.

IEnumerable<T> 인터페이스

  • 컬렉션을 반복(iterate)할 수 있는 기능을 제공하는 제네릭 인터페이스이다.
  • System.Collections.Generic 네임스페이스에 속하며, 다음과 같은 기본 멤버를 포함한다.
    • IEnumerator<T> GetEnumerator();
  • 이 인터페이스는 컬렉션의 요소에 대해 순차적으로 접근할 수 있는 기능을 제공한다. 예를 들어, foreach 문에서 IEnumerable<T>를 사용하여 컬렉션의 모든 요소를 열거할 수 있다.

공변성(Covariance)

  • <out T>에서 out 키워드는 공변성을 나타낸다. IEnumerable<Base>가 IEnumerable<Derived>로 대체될 수 있다는 것을 의미한다.
    • 여기서 Derived는 Base의 파생 클래스이다.

out 키워드의 역할

  • 제네릭 인터페이스나 델리게이트에서 out 키워드는 해당 타입 매개변수가 반환 타입으로만 사용 될 수 있음을 명시한다. 이는 다음과 같은 제약을 의미한다.
    • T는 반환할 수는 있지만, T를 소비(즉, 메서드의 매개변수로 사용)할 수는 없다.
  • 즉, IEnumerable<T>의 경우 T 타입의 요소를 열거할 수는 있지만, T 타입의 요소를 추가하거나 수정할 수 없다.

LINQ Count 메서드

  • IEnumerable<T> 컬렉션의 요소를 쉽게 셀 수 있다.
  • System.Linq 네임스페이스에 정의되어 있다.
  • 리스트의 요소 개수를 반환한다.

성능 고려 사항

  • 컬렉션 타입에 따른 성능 차이
    • Count 메서드는 ICollection<T> 인터페이스를 구현한 컬렉션에서 O(1) 시간 복잡도를 가진다. 이는 Count 프로퍼티가 직접 제공되기 때문이다. 하지만 IEnumerable<T>만을 구현한 컬렉션에서는 O(n) 시간 복잡도를 가지며, 모든 요소를 순회해야 한다.
  • 대안
    • 매우 큰 컬렉션의 경우 Count 대신 조건에 맞는 첫 번째 요소만을 확인하려면 Any 메서드를 사용하는 것이 더 효율적일 수 있다. 예를 들어, 조건을 만족하는 요소가 하나라도 존재하는지 확인하려면 Any를 사용할 수 있다.

사용

  • Count()
    • 기본적으로 컬렉션의 모든 요소 개수를 센다
  • Count(Func<T, bool> predicate)
    • 족너을 만족하는 요소의 개수를 센다.

System.Data.SqlClient

  • C#에서 SQL Server 데이터베이스에 연결하고 작업을 수행하는 데 사용되는 네임스페이스이다. 이 네임스페이스에는 SQL Server와 통신하는 데 필요한 클래스들이 포함되어 있으며, 데이터베이스 연결, 명령 실행, 데이터 읽기, 트랜잭션 관리 등의 기능을 제공한다.

주요 클래스

  1. SqlConnection
    • SQL Server 데이터베이스에 대한 연결을 나타낸다.
    • 데이터베이스에 연결하려면 SqlConnection 객체를 사용한다. 연결 문자열을 제공하여 데이터베이스의 위치, 데이터베이스 이름, 인증 정보 등을 지정할 수 있다.
  2. SqlCommand
    • SQL 쿼리나 저장 프로시저를 데이터베이스에 전달한다.
    • SqlCommand를 사용하여 SQL 쿼리나 저장 프로시저를 실행할 수 있다.
  3. SqlDataReader
    • 읽기 전용의 전진 전용 데이터 스트림을 제공한다.
    • SqlDataReader를 사용하여 쿼리 결과를 읽는다.
  4. SqlDataAdapter
    • 데이터베이스와 DataSet 간의 데이터 통신을 관리한다.
  5. SqlTransaction
    • SQL Server 데이터베이스에서 트랜잭션을 나타낸다.
    • SqlTransaction을 사용하여 트랜잭션을 관리할 수 있다.

ExecuteReaderAsync

  • C#의 System.Data.SqlClient.SqlCommand 클래스에서 제공하는 비동기 메서드로, SQL 쿼리를 비동기적으로 실행하고 결과를 SqlDataReader로 반환한다.
  • 이 메서드는 비동기 작업을 수행할 때 사용되며, 데이터베이스 쿼리 실행 중에 UI 스레드나 다른 중요한 작업을 차단하지 않기 때문에 비동기 프로그래밍 모델에서 매우 유용하다.

기본 사용법

  • ExecuteReaderAsync를 사용하려면 메서드가 async로 선언되어 있어야 하고, 반환값을 처리하기 위해 await 키워드를 사용해야 한다. 또한 System.Data.SqlClient 네임스페이스를 포함해야한다.

장점

  • 응답성 유지
    • 특히 UI 애플리케이션에서는 UI 스레드가 긴 작업 동안 차단되는 것을 방지하여 사용자 경험을 향상 시킨다.
  • 효율적인 리소스 사용
    • 스레드를 블록하지 않고 다른 작업을 수행할 수 있어 시스템 리소스를 더 효율적으로 사용한다.

예외 처리

  • 비동기 메서드는 Task 객체를 반환하므로, 일반적으로 try-catch 블록을 사용하여 예외를 처리할 수 있다. 예외가 발생하면 catch 블록에서 적절한 예외 처리를 수행할 수 있다.

ExecuteNonQueryAsync

  • C#의 System.Data.SqlClient.SqlCommand 클래스에서 제공하는 비동기 메서드로, 데이터베이스에서 데이터 행을 수정하는 SQL문(INSERT, UPDATE, DELETE 등)을 비동기적으로 실행한다. 미 메서드는 결과 집합을 반환하지 않는 명령을 실행할 때 사용되며, 수행된 작업의 영향을 받은 행 수를 비동기적으로 반환한다.

기본 사용법

  • ExecuteNonQueryAsync를 사용하려면 메서드를 async로 선언하고, await 키워드를 사용하여 비동기 작업을 기다려야 한다.
  • 이 메서드는 특히 UI 애플리케이션에서 긴 작업을 수행하는 동안 UI를 차단하지 않기 위해 사용된다.

장점

  • 응답성 유지
    • UI 스레드를 차단하지 않기 때문에 UI 애플리케이션에서 사용자 경험을 향상시킬 수 있다.
  • 효율적인 리소스 사용
    • 비동기 작업을 통해 시스템 리소스를 더 효율적으로 사용하고, 다른 작업을 수행할 수 있다.

예외 처리

  • 비동기 메서드는 Task 객체를 반환하므로, 일반적으로 try-catch 블록을 사용하여 예외를 처리할 수 있다. 예외가 발생하면 catch 블록에서 적절한 예외 처리를 수행할 수 있다.

적용 사례

  • 데이터 삽입
    • 테이블에 새로운 데이터를 삽입할 떄
  • 데이터 업데이트
    • 기존 데이터를 수정할 때
  • 데이터 삭제
    • 테이블에서 데이터를 삭제할 때

HasRows

  • System.Data.SqlClient.SqlDataReader 클래스에서 제공하는 속성으로, 현재 데이터베이스 쿼리의 결과 집합에 행이 있는지 확인하는 데 사용된다.
  • 이 속성은 쿼리 결과가 하나 이상의 행을 포함하고 있을 때 true를 반환하고, 그렇지 않으면 false를 반환한다. 이를 통해 쿼리 결과를 처리하기 전에 결과가 있는지 빠르게 확인할 수 있다.

사용 사례

  • 존재 여부 확인
    • 특정 조건을 만족하는 데이터가 존재하는지 확인할 때 유용하다.
  • 결과 처리 최적화
    • 쿼리 결과가 없는 경우 데이터 처리를 건너뛸 수 있어 성능 최적화에 도움이 된다.
  • UI 피드백
    • 결과가 없는 경우 사용자에게 적절한 메시지를 제공할 수 있다.

[System.Runtime.CompilerServices.CallerMemberName]

  • 호출된 메서드의 호출자(Caller)의 이름을 가져오기 위해 사용되는 특성(Attribute)이다.
  • 이 특성은 컴파일러가 메서드를 호출한 위치에서 메서드 이름을 자동으로 제공하도록 한다. 이를 통해 로깅, 디버깅, 예외 처리 등에서 호출된 메서드의 이름을 자동으로 얻을 수 있다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.08.07 C#  (0) 2024.08.07
24.08.06 C#, 젠킨스  (0) 2024.08.06
24.08.02 C#, DEV  (0) 2024.08.02
24.08.01 C#, 데이터베이스 샤딩  (0) 2024.08.01
24.07.31 C#  (0) 2024.07.31