C#

BCL

연향동큰손 2026. 1. 10. 18:23

 

IsNullOrEmpty

문자열이 비어있는지 확인

string name = "";
if(string.IsNullOrEmpty(name) == true)
{
    Console.WriteLine("비어있음.");
}
else
{
    Console.WriteLine(name);
}

 

 

System.DateTime

시간과 관련된 기능 제공

DateTime now = DateTime.Now;
Console.WriteLine(now); //현재 날짜, 시간 출력

DateTime dayForChildren = new DateTime(now.Year, 5, 5);
Console.WriteLine(dayForChildren);

//출력 결과
2026-01-10 오후 5:14:33
2026-05-05 오전 12:00:00

 

System.TimeSpan

DateTime 타입에 대해 사칙 연산 중에서 유일하게 허용되는 것이 빼기 이며 빼기의 연산 결괏값은 2개의 DateTime사이의 시간 간격을 나타내는 TimeSpan으로 나온다.

 DateTime endOfYear = new DateTime(DateTime.Now.Year, 12, 31);
 DateTime now = DateTime.Now;

 Console.WriteLine("오늘 날짜: " + now);

 TimeSpan gap = endOfYear - now;
 Console.WriteLine("올해의 남은 날짜: " + gap.TotalDays);

 

 

System.Diagnostics.Stopwatch

BCL에서 제공하는 고정밀 시간 측정 클래스

※코드 특정 구간의 성능을 측정할 때 자주 사용된다.

Stopwatch sw = new Stopwatch();

sw.Start();
// 측정하고 싶은 코드
Thread.Sleep(500);
sw.Stop();

Console.WriteLine(sw.ElapsedMilliseconds + " ms");

 

 

System.String

string타입에 대한 다양한 기능을 제공

https://learn.microsoft.com/ko-kr/dotnet/api/system.string?view=net-8.0

 

String 클래스 (System)

텍스트를 UTF-16 코드 단위의 시퀀스로 나타냅니다.

learn.microsoft.com

 

아래 코드의 출력 결과는 모두 True이다.

string txt = "Hello";
Console.WriteLine(txt == "Hello");
Console.WriteLine(txt.Equals("Hello"));

 

== 연산은 값 형식에서는 값 자체를 비교하고, 참조 형식에서는 주소를 비교하는데 

왜 txt == "Hello"가 True를 반환할까?

 

이유는 System.String에서 == 연산을 값을 비교할 수 있도록 오버로딩 했기 때문이다.

Format

string str = "Hello {0}: {1}";
string output = string.Format(str, "World", "Anderson");
Console.WriteLine(output);

//실행 결과
Hello World: Anderson

 

Format Item 구조

{index[,alignment][:formatString]}

요소의미

index 인자 번호
alignment 정렬 (생략 가능)
formatString 출력 형식 (생략 가능)

 

 

System.Text.StringBuilder

string 타입은 불변 객체이기 때문에 string에 대한 모든 변환은 새로운 메모리 할당을 발생시킨다.

 

문자열 변경에서의 문제점(StringBuilder X)

string txt = "Hello World";
for(int i=0; i<300000; i++)
{
    txt = txt + "1";
}

 

위 코드의 동작 방식

  1. 힙에 Hello World 문자열 공간 할당
  2. 스택에 txt변수의 주소를 저장
  3. txt + "1" 동작을 수행하기 위해 txt.Length + "1".Length 크기의 메모리를 힙에 할당하고 txt와 "1"을 복사하여 붙힘
  4. 3번 과정을 통해 새롭게 할당된 힙 주소를 스택에 저장
  5. 3번 4번 과정을 30만번 반복

StringBuilder를 통해 문자열을 더했을때

 string txt = "Hello World";
 Stopwatch sw = Stopwatch.StartNew();

 for(int i=0; i<300000; i++)
 {
     txt = txt + "1";
 }
 sw.Stop();
 Console.WriteLine(sw.ElapsedMilliseconds);

 string txt2 = "Hello World";

 Stopwatch sw2 = Stopwatch.StartNew();
 StringBuilder sb = new StringBuilder();
 sb.Append(txt2);

 for (int i = 0; i < 300000; i++)
 {
     sb.Append("1");
 }
 string newText = sb.ToString();
 sw2.Stop();
 Console.WriteLine(sw2.ElapsedMilliseconds);
  1. StringBuilder가 내부적으로 일정한 양의 메모리를 항당
  2. Append 메서드에 들어온 인자를 미리 할당한 메모리에 복사
  3. 2번 과정만 30만번 반복, 만약 Append로 추가된 문자열이 미리 할당된 메모리보다 많아지면 여유분의 메모리를 할당
 +로 문자열을 더했을때 걸린 시간 : 23580 ms
StringBuilder로 문자열을 더했을때 걸린 시간 : 2 ms

 

 

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

[C#] LINQ(데이터 쿼리)  (0) 2026.02.19
스레딩  (0) 2026.01.13
[C#] 대리자(delegate)  (0) 2026.01.08
[C#] Collection / Generic Collection  (0) 2026.01.04