BCL과 운영체제의 관계 정리
입력과 출력은 운영체제와 밀접하게 관련되어 있다.
키보드 입력, 화면 출력, 파일 저장 등은 모두 운영체제가 제공하는 기능이다.
닷넷은 C#과 같은 언어로 만들어진 프로그램이 운영체제와 연동할 수 있도록 관련 기능들을 모아 BCL(Base Class Library) 내부에 담아두었다.
ex) Console 타입이 있다.
BCL은 운영체제에서 제공하는 입출력 기능에 의존해 Console 타입을 구현해두었고,
C# 응용 프로그램은 Console 타입을 통해 간접적으로 운영체제의 입출력 기능을 사용한다.
즉, C# 프로그램 → BCL → 운영체제 구조로 동작한다.
운영체제 기능 접근
BCL은 Console 타입 외에도 닷넷 응용 프로그램과 운영체제 사이를 중계하는 다양한 클래스를 제공한다.
- 소켓(Socket)
- 스레드(Thread)
- 파일(File)
- 레지스트리(Registry)
운영체제가 제공하는 이러한 기능에 접근하고 싶다면, 직접 OS API를 호출하는 대신 BCL에서 제공하는 클래스를 사용하면 된다.
이 덕분에 개발자는 운영체제의 세부 구현을 몰라도 일관된 방식으로 기능을 사용할 수 있다.
BCL은 중계 역할만 하는가?
BCL은 단순히 운영체제와의 중계 역할만 담당하는 것은 아니며, 프로그램의 “처리” 과정에서 자주 사용되는 기능들도 함께 포함하고 있다.
예를 들어, 개발자는 데이터 처리 과정에서 다양한 수학 연산을 수행한다.
- Log(자연로그)
- Cos(코사인)
- Pow(거듭제곱)
이러한 기능은 C#으로 직접 구현할 수도 있지만,
자주 사용되기 때문에 마이크로소프트는 이미 Math 타입을 BCL에 포함시켜 제공한다.
즉, BCL은 운영체제 기능을 사용할 수 있게 해주는 중계 역할과 자주 사용하는 공통 기능을 미리 구현해둔 라이브러리 역할
을 함께 수행한다.
시간
Ststem.DateTime
DateTime은 struct로 정의된 값 형식이다. 자주 사용되는 생성자는 다음과 같다.
public DateTime(int year, int month, int day);
public DateTime(int year, int month, int day, int hour, int minute, int second);
public DateTime(int year, int month, int day, int hour, int munutem int second, int millisecond);
속성 중에서는 Now와 Year, Month, Day, Hour, Minute, Second, Millisecond가 자주 사용된다.
public static DateTime Now { get; };
public int Year { get; }
public int Month { get; }
public int Day { get; }
public int Hour { get; }
public int Minute { get; }
public int Second { get; }
public int Millisecond { get; }

1초(Second)는 1,000밀리초(Millisecond)인데, 이보다 정밀도가 더 높은 시간 값이 필요하다면 Ticks 속성을 이용하면 된다.
이 값은 1년 1월 1일 12시 자정을 기준으로 현재까지 100나노초 간격으로 흐른 숫자값이다.
즉, 1밀리초의 10,000분의 1에 해당하는 정밀도를 보인다.

협정 세계시(UTC)와 시간대(Time Zone)
1. UTC와 GMT
협정 세계시(UTC, Universal Time Coordinated)는 현재 국제 표준시로 사용되는 시간 체계이다.
과거에는 그리니치 평균시(GMT, Greenwich Mean Time)가 세계 표준시 역할을 했지만, 현재는 UTC가 공식 표준으로 사용된다.
UTC와 GMT의 차이는 초 단위의 미세한 오차 수준이기 때문에, 일반적인 일상생활에서는 거의 차이를 느끼기 어렵다.
2. 시간대(Time Zone)
지구는 자전하고 있기 때문에, 지역에 따라 태양이 떠 있는 시간이 다르다.
이로 인해 각 지역은 시간대(Time Zone)를 기준으로 시간을 조정한다.
- 기준 경도: 영국 그리니치 천문대가 위치한 경도 0도
- 이곳의 시간을 기준으로 동쪽으로 갈수록 시간이 증가
- 서쪽으로 갈수록 시간이 감소
- 날짜 변경선(International Date Line)을 기준으로 날짜가 바뀐다
3. 대한민국의 시간대
대한민국은 영국의 동쪽에 위치하며, 시간대는 UTC+9이다.
즉, 영국이 0시라면, 대한민국은 9시이다.
이 때문에 UTC+9는 한국 표준시(KST, Korea Standard Time)라고도 한다.
4. 지역 시간(Local Time)
시간대가 반영된 시간을 지역 시간(Local Time)이라고 한다.
- 영국은 UTC와 지역 시간이 동일하다.
- 대한민국은 UTC+9이므로 UTC보다 9시간 빠르다.
따라서 영국이 자정(00:00)일 때 대한민국은 오전 9시가 된다.
이처럼 대부분의 국가에서는 시간을 표현할 때 그 시간이 UTC 기준인지, 지역 시간인지 명확히 표시해야 정확한 시간 전달이 가능하다.
닷넷의 DateTime 타입은 이 구분을 열거형 타입인 Kind 속성으로 알려준다.
| 열거형 값 | 설명 |
| Unspecified | 어떤 형식인지 지정되지 않은 시간 |
| Utc | 동시간의 그리니치 천문대 시간 |
| Local | 시간대를 반영한 지역시간 |

첫 번째 worldcup2002 변수에 담긴 2002년 5월 31일은 시간대가 정해지지 않았으므로 이 값은 지구의 경도마다 제각기 해석될 수 있는 여지를 남긴다. 따라서 DateTime 타입의 인스턴스를 생성자를 통해 직접 만들 때는 반드시 그 시간이 UTC 기준인지, 지역 시간 기준인지 명시하는 것을 권장한다.
자바스크립트나 자바 플랫폼과 관련해서 호환상의 이유로 알아둬야 할 용어가 하나 더 있다.
닷넷의 DateTime은 시간의 기준값이 1년 1월 1일이지만, 유닉스 및 자바 관련 플랫폼에서는 1970년 1월 1일을 기준으로 한다.
그 시간을 가리켜 Epoch Time이라 하고 다른 말로는 Unix Time, Unix Timestamp, POSIX time이라고도 한다.
ex) 자바에서는 System.currentTimeMillis 메서드를 제공하는데, 이 메서드는 현재 시간을 UTC 기준의 밀리초 단위로 Epoch 시간 이후로 흐른 값을 반환한다.
//자바 코드
System.println(System.currentTimeMillis());
닷넷의 경우 밀리초 단위의 시간은 다음과 같이 구할 수 있다.

자바의 코드와 출력값을 보면 값의 차이가 크다. 자바의 출력값과 닷넷에서의 차이는 닷넷의 기준시간인 1년 1월 1일과 자바의 기준 시간인 1970년 1월 1일 사이의 시간 간격에 해당하는 밀리초다.
따라서 자바/자바스크립트에서 구한 밀리초 값을 닷넷에서 구한 값과 정상적으로 비교하려면 다음과 같이 1970년에 해당하는 고정 밀리초 값을 빼야한다.
long javaMillis = (DateTime.UtcNow.Ticks - 621355968000000000) / 10000;
즉, .NET과 Java/Unix 시스템 간에 로그를 주고받거나, 서버와 클라이언트가 다른 플랫폼일 때, API로 시간 데이터를 교환할 때 시간 기준이 다르면 변환을 해줘야 한다.
ex) Unix Timestamp → .NET DateTime, DateTime → Unix Timestamp 로 변환하는 과정이 반드시 필요하다.
System.TimeSpand
DateTime 타입에 대해 사칙 연산 중에서 유일하게 허용되는 것은 '빼기'이다.
빼기의 연산 결과값은 2개의 DateTime 사이의 시간 간격을 나타내는 TimeSpan으로 나온다.

TotalDays 말고도, TotalHours, TotalMilliseconds, TotalMinutes, TotalSeconds 등의 속성을 통해 손쉽게 해당하는 단위의 시간 간격을 알 수 있다.
System.Diagnostics.Stopwatch
시간차에 대해 DateTime과 TimeSpan을 쓰는 것도 가능하지만, 닷넷에서는 더 정확한 시간차 계산을 위해 Stopwatch 타입을 제공한다.
Stopwatch st = new Stopwatch();
st.Start();
Sum();
st.Stop();
//st.elapsedTicks 속성은 구간 사이에 흐른 타이머의 틱(Tick) 수
Console.WriteLine("Total Ticks: " + st.ElapsedTicks);
//st.ElapsedMilliseconds 속성은 구간 사이에 흐른 시간을 밀리초로 반환
Console.WriteLine("Millisecond: " + st.ElapsedMilliseconds);
//밀리초로 흐른 시간을 초로 환산
Console.WriteLine("Second: " + st.ElapsedMilliseconds / 1000);
//Stop.Frequency 속성이 초당 흐른 틱수를 반환하므로, ElapsedTicks에 대해 나눠주면 초 단위의 시간을 잴 수 있다.
Console.WriteLine("Second: " + st.ElapsedTicks / Stopwatch.Frequency);
StopWatch 타입은 코드의 특정 구간에 대한 성능을 측정할 때 자주 사용된다.
Reference
시작하세요! C# 12 프로그래밍 기본 문법부터 실전 예제까지
'C#' 카테고리의 다른 글
| C# BCL(Base Class Library) - 직렬화/역직렬화 (0) | 2026.03.07 |
|---|---|
| C# BCL(Base Class Library) - 문자열 처리 (0) | 2026.03.07 |
| C# 1.0 - 힙과 스택 (0) | 2025.09.26 |
| C# 1.0 - 예외 (0) | 2025.09.24 |
| C# 1.0 - 프로젝트 구성 (0) | 2025.09.24 |