EC2 인스턴스를 활용한 서버 구축 및 외부 접속 작업 AWS에서 EC2 인스턴스 머신을 임대하고, 도메인을 구매해서 외부 접속이 가능한 간단한 채팅 서버를 구현해보았다 EC2 서버머신 Client1 Client2 UI 작업을 아예 안해서 솔직히 채팅 프로그램이라고 하기는 좀 그렇지만 어쨌든 AWS EC2 를 활용하면서 도메인을 통한 퍼블릭 IP를 뽑아내서 외부 접속을 가능하게 한 데에 의미가 있는 것 같다 공부/그 외 2024.07.14
함수형 프로그래밍(Functional Programming) 함수형 프로그래밍이란? 순수 함수들로만 조합해서 프로그램을 완성하는 프로그래밍 패러다임. 여기서 순수 함수란 내부 상태를 갖지 않아서 같은 입력에 대해서 항상 같은 출력을 보장하는 함수 함수형 프로그래밍의 특징 및 장단점 불변성을 추구 불변성을 지향하는 프로그래밍 패러다임이다. 즉 변경 가능한 상태를 최대한 제거하려고 하는 언어. 다른 말로 순수 함수를 지향하는 프로그래밍 언어라고 하기도 하는데, 순수 함수란 위에서 언급했듯이 내부 상태를 갖지 않아서 같은 입력에 대해 항상 같은 출력이 보장되는 함수이다. 또 다른 표현으로는 side effect가 없는 함수라고 한다. side effect가 없는 함수의 예시로는 삼각 함수가 있다. 삼각 함수는 내부 상태가 없으며, 같은 입력이면 항상 같은 출력을 보장한.. 공부/그 외 2022.09.26
멀티바이트(Multibyte), 유니코드(Unicode), ANSI 그리고 ASCII 먼저 "유니코드와 멀티바이트를 비교하라" 는 질문을 받았고 간단하게 대답을 하려면 멀티 바이트는 문자를 다양한 바이트로 표현하는 인코딩 방식 유니코드는 세계 모든 문자를 2바이트 길이의 바이너리(=코드)와 매핑해놓은 코드표(=문자열 셋)이다(예를 들어 '가' 라는 문자를 U+AC00 이런식의 코드에 매핑) 이렇게 대답하면 좋을 것 같다. 앞서 유니코드와 멀티바이트를 비교 하려고 하는데 엄밀히 이야기하면 비교 대상이 잘못됐다. 명확한 비교는 WBCS과 MBCS(흔히 말하는 멀티바이트)를 비교해야한다(유니코드가 WBCS의 형태라서 이렇게 통상적으로 비교하는 듯 하다). 먼저 문자열 셋(Chracter Set)과 인코딩에 대한 이해가 필요하다. 문자와 바이너리를 매핑시켜주는 표를 문자열 셋(Character .. 공부/그 외 2022.09.23
객체 지향 프로그래밍(OOP) 객체 지향 프로그래밍이란? 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호 작용을 통해 프로그램을 만드는 것 객체란? 클래스라는 틀(template)에서 생겨난 실체(Instance) 객체 지향 프로그래밍을 사용해야 하는 이유는? 실세계에 대한 쉬운 모델링 응용 소프트웨어를 하나의 절차로 모델링 하기는 어렵다. 대부분의 응용 소프트웨어 특성상 절차보다는 관련된 여려 객체들간의 상호작용으로 모델링하는 것이 더 쉽고 적합하다 생산성 상속과 다형성으로 이미 만들어진 클래스를 기반으로 재정의해서 사용할 수 있고, 캡슐화로 만든 클래스를 실체화 시킨 객체를 계속해서 만들어낼 수 있다 보안성 캡슐화로 구현된 클래스에서 특정 부분을 은닉할 수 있다 SOLID (객체 지향 설계 원칙) 1. 단일 책임 원칙.. 공부/그 외 2022.09.11
Visual Studio 문자 집합 사용(유니코드, 멀티바이트) 다른게 없고 그냥 전처리기에서 유니코드 관련 매크로(ex. TEXT, TCHAR 등)을 사용했을때 멀티바이트 문자열(char로 선언된 문자열)을 유니코드 문자열(wchar로 선언된 문자열)로 변환해줄건지, 그대로 리턴할건지에 정해줄 뿐이다. 문자 집합을 유니코드 문자 집합 사용을 쓰던, 멀티바이트 문자 집합을 사용을 쓰던, char는 멀티바이트를 담는 타입, wchar는 유니코드를 담는 타입이라는 사실은 변함 없다. 공부/그 외 2021.12.08
C2678 : 이항 '~': 왼쪽 피연산자로 '~' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다. ~는 내가 쓰던 코드에서 선언한 타입이었다. ~에는 쓴 코드에서 사용한 연산자와 타입이 올 것이다. 에러에 관한 이야기를 하기 전에 짚고 넘어 가야 할 중요한 사실이 있는데 C++에서 const를 요구하는 인자에 non-const를 넘기는 것은 괜찮지만 non-const를 요구하는 곳에 const를 쓰면 에러가 생긴다(https://erlerobotics.gitbooks.io/erle-robotics-cpp-gitbook/content/advanced_topics_i/const_and_non-const.html) 예를 들어서 우리가 흔히 쓰는 복사 생성자는 인자로 const reference 타입을 받지만 인자로 넘겨줄 객체를 const로 선언하지 않아도 에러가 생기지 않는다. 예를 들어서 class A.. 공부/그 외 2021.09.02
레지스터(Register) vs 레지스트리(Registry) 공부를 하던중 레지스트리가 나와서 레지스터랑 비슷한건가 생각하면서 찾아봤는데 레지스터랑은 관련 없는 별개의 단어 였다. 레지스터(Register) 우리가 흔히 아는 main memory, cache보다도 접근이 빠르지만 용량이 적은 기억장치. 시스템 프로그래밍 과목에서 assembly 배울 때 나왔던 범용 레지스터(General Purpose Register)도 레지스터다. reverse engineering 하면서 봤던 %eax, %esp 이런 녀석들이다. 레지스트리(Registry) 윈도우에서 시스템 구성 정보(ex. Main memory의 크기, 시스템 매개변수 등)를 저장하고 있는 데이터베이스로써, 부팅 시에 필요한 정보들을 담고 있다. WinAPI에서 RegisterMyClass 함수는 이 레지.. 공부/그 외 2021.08.18
C7510 : 종속적 형식 이름은 'typename' 접두사와 함께 사용해야 합니다. Hash Table을 구현하다가 제목과 같은 오류를 만났다. 아래와 같은 코드를 작성하다가 만났다. 아래 코드에서 "에러 발생 지점"이라고 표시한 부분을 잘 보자 template class CHashNode { template friend class CHashTable; template friend class CHashTableIterator; private: CHashNode() { } ~CHashNode() { // 에러 발생 지점 // 아래 코드 2줄 맨 앞에 typename을 붙여줘야 한다. CList::iterator iter = m_Chain.begin(); // 에러 발생 지점 CList::iterator iterEnd = m_Chain.end(); for (; iter != iterEnd;.. 공부/그 외 2021.08.12
꼬리 재귀(Tail recursion) 재귀 함수가 반복문으로 짠 것 보다는 가독성이 좋지만 느릴 수 있다는 것은 이미 알고 있다. 하지만 이 재귀 함수의 단점을 어느 정도 커버할 수 있는 꼬리 재귀(Tail recursion)란 것이 있는데, 이것에 대해 간단히 정리해보자. 우선 꼬리 재귀란 재귀 함수이긴 하지만 재귀 함수 호출 이후에 연산을 추가적으로 하지 않는 재귀 함수 형태를 의미한다. 예를 들어서 factorial함수를 재귀 함수로 짜보면 int factorial(int Num) { if(Num == 0) return 1; return Num * factorial(Num - 1); } 아마 대부분 factorial함수를 재귀함수로 짤 때 이런식으로 만들 것이다. 하지만 보이다시피 factorial(Num - 1)을 호출하고 retur.. 공부/그 외 2021.08.04
오브젝트 풀(Object Pool) 메모리 풀에 이어서 이번에는 오브젝트 풀을 스스로 구현해보았다. 사실 구현이라고 할 만큼 뭔가 대단한 걸 한건 아니고 그냥 내가 이해한 걸 간략하게나마 코드로 짜본 것인데 뒤에 언급하겠지만 사실 성능상의 문제점도 존재하고 완벽히 정확하게 구현했는지는 잘 모르겠다. 우선 오브젝트 풀이란 프로그램 내에서 사용할 오브젝트들을 container(ex. list, vector)나 container adaptor(ex. queue, stack)에 담아 두었다가 사용자가 요청시 꺼내서 주고, 반환시 container에 다시 담아두는 것을 의미한다. 만약 동적 할당및 해제가 잦은 프로그램내에서 오브젝트 풀을 사용한다면 잦은 할당및 해제로 인한 오버헤드와 메모리 단편화도 조금 방지할 수 있다고 생각한다(사실 요즘 mem.. 공부/그 외 2021.07.19