목록Language (77)
Coding Memo
C++에서 상수를 정의하는 방법으로 2가지가 있다. 첫 번째로, define을 이용하여 매크로로 상수를 정의하는 방법이 있고, 두 번째로는 constexpr을 이용하여 상수를 정의하는 방법이 있다. #define PI 3.141592 constexpr double PI = 3.141592; 두 방법의 특징과 차이점을 보고 무엇을 사용하면 더 좋을지 확인해보자. define define은 전처리기(preprocessor) 지시자로, C++의 전처리기를 통해 상수를 정의하는 방법이다. 이는 매크로를 이용하는데, 매크로는 컴파일 전에 사용된 매크로값이 텍스트 치환을 통해 해당 정의 내용으로 그대로 바뀐다. (말 그대로 매크로 값에 정의했던 내용이 그대로 들어간다. 단순히 텍스트 치환 기능이다.) define의..
vector, deque, set, map, stack, queue, priority_queue 등의 컨테이너와 자료구조에서 자주 사용하는 함수들을 간단하게 요약하였다. 먼저, 간단하게 표현하기 위해서... 편의상 템플릿 타입과 컨테이너 사이즈 타입(size_t)은 int 형으로 하였다. 템플릿 타입 명시 를 생략하였다. const를 생략했고 각 컨테이너의 iterator는 간단하게 iterator로만 표현했다. 진짜 진짜 주요한 함수만 확인해보려면 스크롤을 맨 아래로 내리자! 참조: https://en.cppreference.com/w/cpp/container vector Sequence Container로 요소에 대해 순차적으로 접근 할 수 있다. (forward, backward 둘 다 순회 가능)..
흐름 제어란? 발신자가 수신자가 처리할 수 있는 것보다 더 빨리, 많이 데이터를 보낼 경우에 수신자는 일부 데이터(패킷)에 대해 삭제가 되거나 손실이 발생 할 수 있다. 이 문제를 방지하기 위해 TCP 연결에서는 흐름제어를 사용한다. 흐름제어(flow-control)는 수신자의 상태를 보고 전송을 제어하여 데이터의 손실이나 정체 없이 효율적이고 안정적으로 통신을 가능하게 한다. 예를 들어, 수신자가 100바이트의 버퍼를 가지고 있는데, 발신자가 150바이트의 데이터를 보냈다고 가정하자. TCP 연결에서 발신자는 수신자가 처리 할 수 있는 데이터의 양 (Sliding Window)을 미리 정한다. 따라서 발신자는 먼저 100바이트를 송신하고, 수신자가 먼저 100바이트를 받고 처리 후, 발신자에게 추가 데..
[요약] SocketAsyncEventArgs.BufferList을 통해 데이터를 전송 할 때, 반드시 새로운 리스트를 만들고 바이트 데이터를 그 리스트에 추가(Add)를 한 후에 그 리스트를 SocketAsyncEventArgs.BufferList에 직접 할당해야만 한다!! (이 관련 내용은 공식적으로 문서화 되어있지 않다고 한다.) 1. 리스트 생성 (IList) 2. 1에서 생성한 리스트에 아이템 추가(Add) 3. SocketAsyncEventArgs.BufferList에 1에서 생성한 리스트 직접 할당 ***SocketAsyncEventArgs.BufferList에 직접 아이템 Add 하지 말자.*** Why? BufferList의 Setter 호출 시, 기존 리스트에 있는 버퍼만 사용하기 때문..
C++에서 출력을 표처럼 간격에 맞춰서 깔끔하게 출력하고 싶다. double이나 float 타입의 숫자를 특정 자릿수까지 출력하고 싶다. 특정 숫자를 16진수, 8진수로 바로 출력하고 싶다. double을 출력했는데 자릿수가 얼마 안나온다. ... int main() { double pi = 3.1415926535; cout
Summary SetMinThreads로 Worker Thread의 최소 수를 지정할 때는 SetMaxThreads로 최대 수도 함께 지정해주어야 한다. (그 역도 마찬가지이다.) 그렇지 않으면 System의 default 값이 적용된다. 코드를 테스트하다가 우연히 알게 되었다. SetMaxThreads로 worker 쓰레드 수를 한정하고 초과 개수의 쓰레드를 돌려도 잘 돌아가는 현상을 보고 ‘뭐지…’ 하고 한참을 찾아보고 테스트 해보다가 해결했다. using System; using System.Threading; namespace Test { class Program { static void Main(string[] args) { ThreadPool.SetMinThreads(1, 1); ThreadP..
Summary 자료형에 따라 call by reference 인지, call by value인지 결정되는데, 직접 전달 방식을 정할 수도 있다. call by value: 값을 복사하여 사용 call by reference: 값을 참조하여 사용 Value Type: 기본 자료형 (int, float, char), struct, … Reference Type: Class (string …), Action, … Variable Data Type Call By 매개변수에서 참조하는 개체 상태 수정 - 호출자 표시 여부 매개 변수에 다른 객체를 참조하여 할당 - 호출자 표시 여부 Value value X X reference (ref) O X Reference value O X reference (ref) O ..
매개 변수 앞에 한정자를 붙여 전달 방식을 지정할 수 있다. ref 인수 할당 필요, 매개 변수를 다른 개체로 재할당 가능 in 인수 할당 필요, read only out 인수 할당이 필수가 아님, 대신 호출된 메서드에서는 이 매개 변수에 값을 반드시 할당 해야함 params: 매개 변수의 개수를 가변으로 지정 ex) int Add(params int[] nums) out은 Try~~(out ~~) 함수를 생각하면 이해하기 편할 것이다. ex) TryGetValue(), TryGetComponent() … ref는 C의 포인터나 참조로 생각하면 쉽다. out은 C언어 함수에서 값을 할당하는 인자로 생각하면 쉬울거 같은데 값 할당이 필수가 아닌 C와 달리 C#에서는 out 키워드가 있으면 반들시 값을 할당..