목록etc (29)
Coding Memo
조건부 컴파일 심볼 정의는 파일의 첫줄에 해야한다. #define WINDOWS // ... #if WINDOWS //... #else //... #endif 조건부 컴파일 심볼이 하나의 파일에만 사용되면 간단히 위의 예시처럼 하면 된다. 만약, 저 심볼을 하나의 파일에서가 아니라, 다수의 파일에 적용해야하는 경우가 있다. 예를 들어, 조건부 컴파일 디렉티브로 플랫폼 별 코드를 작성해 놓았는데, 이런 코드가 하나의 파일에서가 아니라 프로젝트의 다수의 파일에 각각 다 심볼이 정의가 되어있을 때가 그런 경우다. 이 경우에는 빌드를 A로 하고 싶으면 심볼이 들어가 있는 모든 파일에 '#define A'가 들어가 있는지 다 확인해야한다. 그 반대로 A가 아닌 빌드를 원한다면 '#define A'가 모두 주석 처..
구글에서 제공하는 프로토버퍼를 이용해 서버와 클라이언트간 패킷을 주고받는 시나리오를 계획했다. 서버와 클라이언트 간 전송 시에는 byte[]라는 배열로 주고 받게 되는데, 이 배열을 다시 어떤 객체로 파싱하는 과정이 필요하다. CustomBuffer (직접 직렬화한 버퍼)를 사용하였을 때는 버퍼의 헤더를 추가하여, 버퍼의 맨앞에 2바이트 타입을 추가하고 그 값으로 전체 패킷의 길이를 넣었고 두번째 2바이트 값으로 해당 패킷의 원래 객체 타입을 정의해서 넣었었다. 아래의 구조와 같이 직렬화하는 버퍼를 CustomBuffer라고 하겠다. 파싱할 때는, 처음 2바이트를 읽어서 단위 패킷의 범위를 정한다. 그 다음으로 2바이트를 읽어서 Body에 있는 데이터를 어떤 객체로 역직렬화할 건지 알아낸다. 마지막으로,..
에코 서버? 클라이언트로 부터 들어온 데이터(메세지)를 서버에서 그대로 다시 클라이언트로 전송하는 서버를 말한다. 서버와 클라이언트 설계 TCP 소켓을 이용해 서버와 클라이언트를 먼저 연결한 후에 메시지를 보낸다. 기억해야할 점은 데이터는 byte[] 타입으로 주고받는다는 것이다. 이를 잘 처리해야한다. 공통 1. TCP 소켓을 이용해 데이터를 송수신 2. 메시지 타입은 string, 인코딩 형식은 UTF-8로 통일 3. localhost를 이용하되, 코드를 통해 컴퓨터의 주소를 가져오고 그 첫 번째 주소를 엔드포인트로 사용 (port: 8888) 4. 간단하게 작성하고 테스트하기 위해 blocking 함수로 소켓 프로그래밍 5. 소켓에 대한 에러 확인 및 예외 처리는 생략 서버에서 이뤄져야 할 것들 1..
소켓이란? 네트워크를 통해 두 프로그램이나 프로세스 간의 통신을 위한 끝 점(EndPoint) 이다. 두 프로그램은 이 소켓을 통해 네트워크에서 데이터를 서로 주고 받을 수 있다. IP 주소와 포트 넘버을 소켓에 지정하여 컴퓨터의 주소와 프로그램을 식별할 수 있다. 소켓 생성은 OS에 의해 실행된다. (시스템 호출로 소켓 생성 시, context-switching이 일어난다.) 프로그램이 종료되면, OS에 의해 사용했던 소켓에 할당된 리소스를 해제한다. 자주 사용하는 TCP 타입과 UDP 타입 외에도 다양한 소켓 타입이 있다. 소켓 프로그래밍 소켓 프로그래밍 시에 공통적인 사항이 있다. 1. 소켓 생성 시 소켓 타입, 프로토콜 등을 지정한다. 2. 엔드포인트 (소켓 주소) 생성 시, 호스트(ip주소 등)..
먼저 메모리의 구조는 다음과 같다는 것을 확인하고 넘어가자. stack에는 지역변수와 함수 호출 정보가 저장되어 있고 스택의 자료구조로 되어 있다. 여기서 함수 호출 정보가 무엇을 의미하는지 확인해보자. 함수 호출 스택 예시로 사용할 코드이다. int func1(int a) { int b; b = a * a; return b; } int main() { int i = 0; char* s; s = new char[1024]; i = func1(i); delete[] s; return 0; } main 먼저 main 함수가 로드 되었을 때의 메모리 상태이다. main 함수의 지역 변수 i와 s가 스택에 들어가게 된다. frame pointer: 현재 함수의 스택 프레임을 추적하기 위해 컴퓨터 프로세서에서 사..

스택과 힙? 프로그램 실행 중 함수 호출 스택, 변수 데이터 등을 저장하는 메모리 영역(segment)를 말한다. kernel Os가 상주하는 보호된 메모리 영역으로 시스템 리소스를 관리한다. 커널코드, 데이터 구조, 장치 드라이버등의 필수 구성요소를 포함하고 있다. 사용자 프로세스는 일반적으로는 커널 공간에 직접 액세스 할 수 없다. text (code) 프로그램의 실행 코드를 저장하고 있는 부분으로 읽기 전용 메모리 영역이다. 프로세서가 실행하는 명령이 포함되어 있으며, 일반적으로는 한 프로그램의 여러 인스턴스간 공유되어 사용해 자원 절약을 한다. 실행 코드가 있는 부분을 text 메모리 영역에 저장한다. data 프로그램 실행 시작 전에 초기화되는 static 및 global 변수 (정적 변수 및 ..
이벤트 버스를 통해 구독자와 게시자가 서로 통신하는 형태의 디자인 패턴으로 게시-구독(Publisher - Subscriber)의 형태로 구현된다. 서로 직접적인 종속성 없이 통신할 수 있도록 지원하는 패턴이다. 컴포넌트가 이벤트 버스에 이벤트를 게시(publish) 후, 다른 컴포넌트가 해당 이벤트를 구독하고 반응 (handle, trigger)하는 것이 핵심 디자인이다. 이벤트 버스 패턴도 관찰자 패턴과 마찬가지로 언어 자체적으로 간접적 지원을 위한 인터페이스를 제공하거나 언어와 관련된 프레임워크에 포함되는 경우가 많다. Java Application Event Publisher (Spring) C# Event-based Asynchronous Pattern (EAP), Event Keyword Ja..
Command 패턴은 어떤 객체를 활용할 때 그 객체를 직접 조작하는 것 대신에, 조작을 어떻게 하라고 명령을 보내는 방식을 사용하는 패턴이다. 조작 방식 명령을 보낼 때, Command라는 인터페이스나 추상 클래스를 포함하도록 캡슐화 하여 중간 매개체인 Invoker는 Command에 대한 구체적인 내용은 알 수 없도록 한다. 요청을 매개변수화, 요청 대기 열, 로깅, 실행 취소 등에 활용 될 수 있는 패턴이다. 커맨드 패턴 Command 요청을 캡슐화 하는 인터페이스나 추상 클래스로 execute를 구현하고 이 요청을 실행할 수신자(receiver)를 가지고 있는 개체 Invoker 작업 수행 명령 수신자에 요청하는 매개체로 클라이언트로부터 받은 실행 명령을 설계된 패턴에 의해 수신자에게 명려을 요청..