개발/C#(18)
-
C# Garbage Collection
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.메모리 관리 문제는 항상 주의를 살펴도, 코드의 규모가 커질수록 비일비재했습니다. 자원을 해제하지 못해 발생하는 메모리 누수는 프로그램의 안정성에 치명적이었습니다. 메모리를 해제하는 순서도 중요했습니다. 잘못 해제하면 dangling pointer로 인한 예측되지 않는 동작이 발생하거나, segment fault가 발생하며 프로세스가 비정상적으로 종료됐습니다. 그렇기에 C++에서는 RAII 객체를 사용하여 메모리를 관리하였습니다. 그런데 GC, Garbage Collection 있다는 것을 알게 되었습니다. 자원관리를 알아서 자동으로 해준다니, 위 문제에서 자유로워지고 온전히 코드의 설계에 대해서만 생각할 수 있게 될 것이라 ..
2025.04.01 -
C# 네트워크 프로그래밍
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.서버는 정확히 무엇일까요. 시스템 엔지니어로 일할 때 서버들을 유지보수하며 생각했었습니다. apache, mariadb와 같은 서버 프로그램을 구동하고 있는 워크스테이션을 서버로 부를 수 있는 것인가. 그러면 Dell R750과 같은 서버 하드웨어에 단순하게 ssh를 통해 접속해 OpenFOAM과 같은 전산유체역학 소프트웨어를 실행하여 개인 컴퓨터로 사용한다면 이 것은 서버일까. 같은 생각을 말이죠. TcpListener / TcpClientSystem.Net.Sockets 네임스페이스에 정의되어 있는 클래스로 소켓기반의 서버와 클라이언트 역할을 합니다. Server.csusing System;using System.Net;us..
2025.03.28 -
C# 스레드와 태스크
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.스레드는 컴퓨터의 실행 단위로 사용되기도 하지만 어원은 아마로 만든 실에서 나왔다고 합니다. 그래서 연결된 무언가를 뜻하기도 한다고 합니다. 저는 컴퓨터 관련 용어를 공부할 때 어원을 궁금해서 찾아보곤 합니다. 그 어원을 알게 되면 그 개념의 본질에 대해 더 이해되는 것 같습니다. 예를 들어 바이트 오더를 뜻하는 엔디안의 경우 걸리버의 여행기에서 소인국 편에서 나오는 사람들을 뜻합니다. 여기 사람들은 계란을 깨는 것을 가지고 편을 갈라 격론을 펼칩니다. 계란을 깰 때 가장 두꺼운 끝 부분을 깨야한다는 사람들과 가장 얇은 끝 부분을 깨야하다는 사람들로 말이죠. 그래서 계란의 어느 끝 부분을 깨는 사람을 End에 접미사 an을 붙여..
2025.03.19 -
C# 입출력 작업
이 글은 박상현 님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. System.IO는. NET에서 제공하는 파일 및 데이터 스트림 등을 지원하는 네임스페이스입니다. 저희는 여기에 선언된 객체들을 통해 C# 코드에서 파일 및 디렉터리 작업을 수행할 수 있습니다. File, FileInfo, Directory, DirectoryInfoC#에서 파일과 디렉터리를 다룰 때 사용하는 주요 클래스들입니다. 이름에서 알 수 있듯이 File과 FileInfo는 파일을 다룰 수 있는 클래스이며, Directory와 DirectoryInfo는 디렉터리를 다루는 클래스입니다. 그리고 File과 Directory는 정적 메서드를 통해 파일과 디렉터리 작업을 지원하여 간단하게 사용할 수 있습니다. 반대로 FileI..
2025.03.09 -
C# dynamic
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 대부분의 컴파일러는 최적화를 위해 컴파일 타임에 모든 데이터 형식이 결정되어 바뀌지 않습니다. C#에서는 var를 사용해도 컴파일 타임에 컴파일러가 추론하여 올바른 데이터 형식을 결정하는 것 처럼 말이죠. 그래서 확정된 데이터 형식 덕분에 컴파일된 코드 부분은 오류가 발생하지 않고 더 빠른 속도로 작업을 처리할 수 있습니다. 그런데 컴파일 타임에 데이터 형식을 결정하지 않고 런타임에 결정되는 데이터 형식이 있습니다. Dynamic앞서 말한 런타임에 데이터 타입이 결정되는 데이터 형식 입니다. 컴파일러는 dynamic 형식에 대한 타입 검사를 하지 않으며, 관련된 모든 메서드 호출과 연산들은 런타임에 확인됩니다.class MyCl..
2025.03.05 -
C# 애트리뷰트
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 저희는 코드로 담을 수 없는 부가정보를 주석을 통해 표현합니다. 사람의 경우에는 이 주석을 통해 코드의 자세한 사용법을 익히거나 동작을 예상할 수 있을 겁니다. 하지만 주석은 컴파일 타임에 무시되어 런타임에서는 확인할 수 없습니다. 그렇다면 컴파일타임 혹은 런타임중에 부가정보를 전달할 수 있는 방법은 없을까요? 애트리뷰트, Attribute 클래스, 메소드, 구조체, 프로퍼티 등과 같은 요소에 추가적인 메타데이터를 제공하는 기능입니다. 애트리뷰트를 사용하면 컴파일타임 혹은 런타임에 특정동작을 수행할 수 있습니다. 대표적인 애트리뷰트로는 Obsolete가 있습니다.using System;class Program{ [Obsol..
2025.02.25 -
C# 리플렉션
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 제가 생각하는 컴파일타임과 런타임의 차이는 정적과 동적으로 구분됩니다. 컴파일타임은 최적화를 위해 정적인 요소를 확정 짓는다고 생각합니다. 매크로, 스택 메모리 크기, 자료형 등 변하지 않는 값들은 확정되어 프로그램의 동작에 최적화와 안정성을 보장합니다. 그리고 런타임은 프로그램의 실행을 뜻하며, 사용자의 입력 등으로 변하는 동적값들이 런타임에 사용되어 사용자가 원하는 작업을 처리할 수 있게 해줍니다. 그렇다면 런타임에 사용자의 요청으로 컴파일타임에 확정되었을 클래스와 메서드의 구조를 새롭게 생성하는 것은 가능할까요? 리플렉션, ReflectionRuntime에서 객체의 정보를 확인 및 조작 할 수 있는 기능을 뜻합니다. 이 기..
2025.02.23 -
C# LINQ
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다. 코드를 작성하다 보면 데이터를 탐색하는 경우가 많습니다. C를 배울때는 반복문으로 데이터를 순회하며, 조건문을 사용해 데이터가 유효한지 검사하는 방식으로 탐색했습니다. C++을 배우면서 부터는 STL 라이브러리의 메서드 혹은 전역함수를 사용하여 탐색하였습니다. 그리고 C#은 특별한 데이터 핸들링 기술을 지원합니다. LINQLanguage Integrated Query의 약자로 데이터를 쉽게 쿼리할 수 있는 데이터 핸들링 기술입니다. SQL을 공부해보신 분들은 익숙한 SQL 스타일의 쿼리를 C#에서도 사용할 수 있게 해 주어 다양한 데이터 소스에서 간결하게 데이터를 추출할 수 있게 합니다. int[] scores = [83, 95..
2025.02.21 -
C# 이벤트
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.C#을 공부하며 처음 이벤트를 공부했는데 잘 이해가 되지 않았습니다. 대리자와 비슷하지만 더 제한적이어서 사용하기에 더 불편하다는 느낌이 강했습니다. 그런데 C#을 공부하면서 다양한 안정성 기능들을 알게되니, 제가 안정성의 중요함을 잘 모르고 있었다는 것을 깨달았습니다. 이벤트event 키워드를 선언할 수 있으며, 이벤트는 대리자를 캡슐화하여 더 높은 안정성과 객체 간의 결화도를 낮추는 기능을 제공합니다. 이벤트 시스템의 구성 요소는 이벤트를 소유하고 있는 발행자와 이벤트를 처리할 가입자로 나누어 집니다. 사용방법은 아래와 같습니다.public delegate void EventHandler();우선 이벤트가 기반으로 사용할 대리..
2025.02.20 -
C# 대리자, 익명 메서드 그리고 람다식
이 글은 박상현님의 '이것이 C#이다 개정판'을 참고하여 공부한 내용입니다.delegateC#의 대리자는 C의 함수 포인터와 비슷한 기능을 하는 타입입니다. 대리자는 호출될 메서드와 호출할 개체를 지정하여 안정적인 메서드의 참조를 지원합니다. 즉 메서드를 변수로 바꿔 다른 메서드에 전달하여 실행할 수 있다는 뜻입니다.delegate void MyDelegate(string message);void PrintMessage(string msg){ Console.WriteLine(msg);}MyDelegate del = PrintMessage;del("Hello, World!"); // print: Hello, World!우선 대리자에 할당할 메서드와 대리자(delegate)를 선언합니다. 이때 대리자의..
2025.02.18