본문 바로가기

분류 전체보기91

C#의 동작 원리 위 그림만으로도 거의 모든 설명이 가능할 듯한데, 요약하자면 1. C#은 컴파일러에 의해 Common Intermediate Language(CIL 혹은 IL, MSIL)로 컴파일된다. 2. IL은 Common Language Runtime(CLR) 상의 컴파일러에 의해 네이티브 코드로 컴파일된다. 라고 정리할 수 있다. 아래는 부연설명이다. 1. Common Language Infrastructure(CLI)는 마이크로소프트에서 개발한 표준이다. CLI는 다양한 요소들로 구성되어 있는데, 크게는 언어적인 요소와 시스템적인 요소로 구분할 수 있다. .NET은 이러한 CLI의 가장 대표적인 구현체로서 각각의 요소를 IL과 CLR로 칭하고 있다. 2. .NET을 기반으로 하는 언어들은 C#, VB, F# 등.. 2023. 2. 3.
공유기의 원리와 NAT 요약 1. ip는 사설(private) ip와 공인(public) ip의 두 종류로 나뉜다. 사설 ip는 말그대로 private하여 로컬에서만 사용할 수 있고, 인터넷 상에서는 사용할 수 없다. 반대로 공인 ip는 인터넷 상에서 나를 대표하는 유일한 주소이다. 2. 우리는 인터넷 공급자(KT, SKT 등)로부터 하나의 공인 ip를 부여받는다. 그러나 하나의 ip를 여러 기기들이 동시에 사용할 수는 없으므로(ip 충돌), 공유기를 활용해야 한다. 3. 공유기를 연결하면, 공인 ip는 공유기가 사용하게 된다. 그리고 그 공유기와 공유기에 연결된 기기들은 사설 ip를 부여받는다. (따라서 공유기는 사설과 공인 ip를 동시에 가진다) 사설 ip는 주로 192.168.x.x로 약속되어 있으며, 그 중에서도 공유기는 주.. 2023. 1. 12.
백준 18870 C#) 좌표 압축 요약하자면, 주어진 숫자가 몇번째로 작은지를 출력하는 문제이다. class Program { static void Main() { StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput())); //입력 int n = int.Parse(Console.ReadLine()); string[] x = Console.ReadLine().Split(); //압축된 좌표를 기존 위치에 출력하려면 기존 위치를 기억해야 하므로, //입력받은 x(num)를 기존 위치(oldIdx)와 함께 ValueTuple로 묶어 저장한다(input) (int num, int oldIdx)[] input = new (int, int)[n]; for (int i = 0; .. 2022. 12. 30.
C#에서 배열을 부분 참조하는 방법 소켓 프로그래밍을 공부하다 알게 된 내용인데, 과연 다른 곳에 써먹을 일이 있을까 싶지만, 아무튼... C#의 배열은 기본적으로 참조 타입이므로 아래와 같은 작업이 가능하다. class Program { static void Main() { int[] arr1 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] arr2 = arr1; Console.WriteLine($"{arr1[0]} {arr2[0]}"); arr1[0] = 123; Console.WriteLine($"{arr1[0]} {arr2[0]}"); } } 위 코드처럼 arr2 에 arr1 을 대입하면 두 변수는 동일한 배열을 참조하게 되는 것을 알 수 있다. (참고로 C++에서는 복사 생성자가 호.. 2022. 12. 29.
핑(ping)이란 무엇인가 온라인 게임을 하다보면 핑이라는 단어를 쉽게 접할 수 있다. 이제는 거의 국민 게임이라고 할 수 있는 리그 오브 레전드에서도 핑을 찾아볼 수 있다. 네트워크 용어임에도 불구하고, 핑은 반응 속도와 직결된 문제로서 굉장히 예민하게 다루어지곤 한다. 다만, 많은 사람들이 착각하는 부분인데, 핑은 반응 속도 자체를 일컫는 말이 아니다. 핑은 반응 속도를 측정하기 위한 수단이다. 핑을 실행하는 예시로, cmd에 ping google.com을 입력하면 아래와 같은 화면이 나온다. (네이버는 모종의 이유로 핑을 막아놨는데, 흔히 있는 일이다) 하단의 왕복 시간을 보면 우리가 게임 상에서 보던 익숙한 단위와 숫자들이 나오는데, 이는 RTT(Round Trip Time)라는 것으로, ICMP 프로토콜을 통해 구글 서버.. 2022. 12. 8.
C#으로 구현한 스핀락 스핀락은 그냥 공회전이라고 생각하면 된다. 특별히 하는건 없지만, 굳이 자원을 소모해가며 스레드의 주도권을 유지하는 것이다. 물론 그렇게 하는 데에는 이유가 있다. 스핀락으로 인한 낭비와 컨텍스트 스위치로 인한 낭비를 비교했을 때 전자가 더 저렴한 경우가 존재하기 때문이다. 예를 들어, 임계 구역에서의 작업이 단시간에 끝나는 경우 모니터락보다 스핀락이 더 효율적일 수 있다. C#에는 이미 내장된 SpinLock 클래스가 존재하지만, 뭐든지 몸소 체득하는 편이 빠르므로 스핀락을 직접 구현해보기로 하였다. 스핀락의 대기는 무한루프로 이루어진다. 따라서 코드를 아래와 같이 작성할 수 있다. class MySpinLock { int flag = 0; //0 = unlocked, 1 = locked public .. 2022. 11. 22.
부동소수점의 정밀도 문제에 대하여 부동소수점이란, 임의의 실수를 가수부와 지수부로 나누어 표현하는 방법이다. 소수점이 떠다니듯 움직여서 부동(浮動, float)이라고 하는데, 예를 들어 1.23 * 10^2과 12.3 * 10^1이 동일한 값을 나타내듯 소수점의 위치를 임의로 조정할 수 있기 때문에 붙여진 이름으로 추측된다. 부동소수점은 컴퓨터가 실수를 근사하여 표현하는 데에 사용된다. float 자료형의 경우, 국제 표준인 IEEE 754에 의거하여 부호 1비트, 지수 8비트, 가수 23비트로 총 32비트를 사용하는데, 여기서 지수는 bias = 127을 더함으로써 0~255의 범위가 아닌 -127~128의 범위를 가진다. 이에 float의 크기는 대략 2^-127 ~ 2^128, 즉 10^-38 ~ 10^38으로 굉장히 넓은 범위를 .. 2022. 10. 28.
다익스트라 알고리즘의 증명 알고리즘에 대한 설명은 생략하겠다. 이 글에서는 다익스트라 알고리즘의 증명만, 그것도 최대한 간단하게 설명할 것이다. 증명은 귀류법으로 진행된다. 1. 다익스트라 알고리즘이 정당하다면, 한번 결정된 최단거리가 갱신되는 일은 없어야 한다. 만약 갱신된다면 그것은 '진짜' 최단거리가 아니기 때문이다. 2. 증명을 위해, 다익스트라 알고리즘이 정당하지 않다고 가정하자. 이는 최단거리가 갱신될 수 있다는 뜻이다. 3. 다익스트라 알고리즘에 의하면, 한 노드의 최단거리가 결정되는 시점은 해당 노드를 방문할 때가 된다. 따라서 최단거리의 갱신은 그 이후에, 즉 아직 방문하지 않은 노드에 의해서만 이루어질 수 있다. 4. 그러나 이는 불가능하다. 다익스트라 알고리즘은 매 반복마다 가장 가까운 노드를 방문하는데, 어떻.. 2022. 10. 14.