Development
[Flatbuffers] 플랫버퍼란?
두괄식으로, 플랫버퍼는 메세지 송/수신에 사용되는 플랫폼 종속성 없이 사용가능한 "직/역직렬화 라이브러리" 이다. 플랫버퍼를 쓰는이유? 데이터 송/수신 시 파싱/언패킹을 안해도 된다. 메모리 효율성이 높고, 빠른 속도를 보장한다 유연성(사용하는 데이터타입에 대한) 적은 량의 코드로 작성 가능(이건 좀 거짓이 있다. 코드가 간단하진 않다) 사용하기 편리하다 크로스 플랫폼, 종속성 없이 사용이 가능 프로토콜 버퍼(Protocol Buffer)라고 기존에 구글이 만들어 놓은 직렬화 라이브러리가 존재했었는데, 이 FlatBuffer는 완전히 "게임"에 초점을 맞춘 라이브러리 라고 할 수 있겠다. 비교 표를 보면 ProtoBuf를 팀킬했다 능가하는 성능을 자랑한다. 사실 이게 꼭 사용 안해도 되는 라이브러리인데,..
[JAVA / 네트워크] 비동기 통신 프로그램 샘플
저번 포스팅에 이어서 JAVA MessagePacker 및 이를 활용한 비동기 통신 프로그램의 예이다. /* * Author : Gompang * Desc : MessagePacker를 활용한 비동기 통신 프로그램 서버 * Blog : http://gompangs.tistory.com/ */ package Chat; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; ..
[JAVA / 네트워크] 멀티룸 구조에 대하여(게임&채팅 방 여러개)
멀티 룸 구조라는 것에 대해 이해는 하고 있지만 구현에 애를 먹었던 기억이 있다. 이는 채팅 이라던지, 게임에 통용되는 개념으로 하나의 방을 가지는 게임과 채팅이라면 상관은 없으나, 여러개의 방을 가져야하는 프로그램에서는 구현을 해주어야 한다. 일단 접속하는 각각의 유저마다 소켓을 가지고 있을 것이다. 서버에서는 여러개의 소켓을 생성하여 클라이언트를 할당하게 되고, 그 소켓을 방(Room) 개념에 맞게 분배해주면 간단하게 구현이 된다. 예를 들어 메인 클래스가 있다고 했을 때 멀티룸 구조를 위해서 두개의 클래스가 더 필요하게 된다. 편의상 간단하게 RoomManager, GameRoom 이라는 이름으로 정한다고 가정하자. 구조는 다음과 같다. 그림이 많이 심플하긴한데.. 전달하고자 하는 의미는 전달되었으..
[JAVA / 네트워크] 간단한 통신 메세지 프로토콜 구성하기
해당 글은 직접 Message를 다루는 코드를 짜보는 거에 의의를 두고 만약 실제로 메세지 송/수신에 필요한 프로토콜을 쓰고 싶다면 이거말고 MessagePack(MsgPack), Protobuf, Flatbuffers, Thrift, GRPC를 사용하도록 합시다 사실 이 글은 필자가 직접 느껴왔던 어려움을 적는(?) 포스팅이다. 대학교 재학 중, 네트워크 과목을 이수하면서 JAVA와 C계열 언어로 채팅 프로그램을 개발해야 했던 적이 있었는데 그 때는 진짜 아무런 기초가 없었기 때문에 지금와서 돌이켜보면 매우 비효율적으로 메세지 송/수신을 했다. 컴퓨터에서 다른 컴퓨터로 데이터를 전송하기 위해선 논리적인 연결이 필요한데, 그것이 많이 들어봤을법한 TCP / UDP / HTTP 등으로 연결을 하는 것이다...
정렬(Sorting) 알고리즘 O(n^2)
정렬 알고리즘 컴퓨터분야 전공을 했다면 한번쯤 반드시 들어봤을법한 "정렬" 에 관하여 얘기를 하고자 한다. 앞선 포스팅(이라고 해도 몇개월 전에 쓴..) 에서 잠깐 언급을 했었는데, 자세하게 보지않고 스쳐간 것 같아서 정리할 겸 글을 끄적여본다. 사실 간략하게 요약하면 "이진탐색(Binary Search)을 사용하기 위해 데이터를 정렬한다." 의 의미가 클 수 있다. 분산된 데이터는 자료를 참조하기가 어렵다. 예를 들어 100만개의 데이터가 있고, 맨 마지막에 데이터가 있다면, 원하는 데이터를 찾기 위해서는 100만개를 다 봐야할 수 있다. 그렇기 때문에 최악의 경우 n번 탐색을 해봐야 한다. 하지만 이진탐색을 사용하면 의 속도로 검색할 수 있다. 별로 체감이 안될 수 있는데, 다음 그래프를 보면 이해가..
[주저리] 사천성 게임의 경로탐색
사천성(Shishen-sho) 한번쯤은 즐겨본 적이 있을 "사천성" 이라는 게임이다. 이 게임에서 가장 주된 기능이라고 하면 단연코 "경로탐색" 알고리즘일 것이다. 처음 문제에 접근할 땐 단순히 "두번이상 꺾이지 않는 경로만 탐색하면 되겠지!" 라고 생각했었는데, 이게 점차 갈수록 최적경로가 아닌 문제와 더불어 소거되는 경로를 표시하려면 좌표를 저장해야 하는데 그러한 사소한 문제부터 걸리기 시작한다. 일단 문제를 해결하기 위해서 접근가능한 방법은 아래와 같다. 1. DFS2. BFS3. Heuristic Path Finding 1. DFS(깊이-우선 탐색)가장 간단하고 직관적이다. 스택 혹은 재귀를 이용하여 다음 탐색할 대상을 찾고 거의 한쪽방향의 끝이 나올떄까지 주변을 탐색하다가, 해가 없을 경우다시 ..
[알고리즘] 시간복잡도(Time Complexity)
이전 포스팅에서 알고리즘에 대한 개념을 설명했다. 그 중, 시간복잡도라는 개념이 나왔는데 밑의 그림을 예로 들었는데 이해가 쉬우리라 판단된다. 보이는 것처럼, "알고리즘"이 수행되는 시간이 시간복잡도이다. 비슷한 친구로 "공간복잡도" 라는 개념도 있는데, 반대로 "메모리"를 얼마나 사용하는지에 대한 용량의 개념이다. 데이터를 저장할 수 있는 메모리와 저장매체의 발전으로 인하여 메모리에 대한 개념 또한 그렇게 큰 범주가 되지 못하고 있다. 예컨데, 예전 프로그래밍에서 배열이나 동적할당을 최소화 하고 컴파일을 최소화하며.. 등등 메모리가 얼마 없던 시절의 최적화 하기 위한 행동들은 지금은 하지 않아도 된다. 다만, 최적화의 범주에서 볼 때 좋은 행동이라고 볼 수 있다. 시간복잡도의 그래프가 또 빠질 수 없는..
[알고리즘] 알고리즘 종류 및 시간복잡도 정리
알고리즘(Algorithm) 이란? "문제를 해결하는 방법" 이다. 특히, 컴퓨터에서 알고리즘이란 거의 안 쓰이는 곳이 없을 정도로 널리 이용되고 있다. 어떠한 Input 데이터가 주어지면 이것을 사용하기 편하게 문제를 해결한 형태의 Output을 만든다. 여기서 계속 문제를 해결한다고 하는데, 컴퓨터에서 알고리즘을 사용하는 이유는 대개 다음과 같은 이유로 사용하게 된다. 자료구조 - 정렬, 탐색, 트리, 힙트리구조 - DFS, BFS그래프 - 최단거리정수론, 난수발생, 해석기하, 그래픽 등.대부분의 경우 "자료구조"와 관련된 알고리즘이 직접적으로 사용할 일이 많아서 주로 쓰게 된다. 간단하게 하나 하나 정리해보면 1. 자료구조(Data Structure) "정렬"에 관련된 알고리즘이 가득하다. 데이터를..
[JAVA] HTTP 페이지 읽기
HTTP가 무엇인지에 대한 포스팅에 이어 JAVA에서 해당 HTTP 연결을 수립하는 것과 동시에 페이지를 읽어오는 방법에 대한 코드이다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class Http { public static void main(String[] args) throws MalformedURLException{ URL url = new URL("http://www.tistory.com");..
[C] 컴파일러 메모리 배치표
1) Text 영역Read-Only변수가 저장되는 곳. 프로그래머 작성하는 코드가 이 영역에 포함된다. 2) Data 영역메모리 접근 공간으로 사용 가능하고, 프로그램 실행 도중 자유롭게 수정 및 변경이 가능하다. 3) BSS 영역메모리상 공간만 확보 후, 실제로 초기화를 시키지 않는다. 즉, 런타임 이후에 메모리영역이 확보된다. 지역변수 : Stack전역변수 : BSS(초기값 없는 전역변수) / DATA(초기값 있는 전역변수)