You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

10년전 C++로 개발을 시작했을때는 내가 필요한것을 모두 작성해야 했었다.

현재는 내가 필요한것이 어딘가에 오픈소스이든 상용소스인든지 어딘가에 존재한다.


아래 코드는, 모두 작성해야 했을 시점에 코드 샘플이다.

이때는 바이블처럼 메모리누수없는 성능좋은 자료구조를 개발자들이 구현가능했어야 하는 시점이다.

서비스 로직보다. 자신이 작성한 자료구조가 얼마나 더 빠른고 안전한지에대해 더 열정을 퍼 붓던 시절이다.

#include <iostream>

struct Node{

    Node* prev;
    Node* next;

    void* data;
};

struct List{
    Node* head;
};

List* createList(){

    Node* head = new Node;
    head->prev = head;
    head->next = head;
    head->data = 0;

    List* list = new List;
    list->head = head;

    return list;
}

void insertNodeAfter(Node* node, void* data){
    
    Node* before = node;
    Node* after = node->next;

    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = after;
    newNode->prev = before;

    after->prev = newNode;
    before->next = newNode;
}

void removeNode(Node* node, bool deleteData){

    Node* before = node->prev;
    Node* after = node->next;

    before->next = after;
    after->prev = before;

    if (deleteData)
        delete node->data;
    delete node;
}
............................................ 이하생략 이만큼의 코드로도 리스트가 제대로 작동하지않는다.


그리고 몇년이 흘러 stl이 등장하고 - stlport라는 c++비공식 라이브러리였으며 표준에 채택되기 까지는 더 많은 시간이 필요했음

자주 사용되는 자료구조를 구현이아닌 이용을 할수 있는  신기방기한 녀석이 등장하였다.

우수한 개발자들의 역량이 자료구조 설계에 있었기때문에 Stl을 반기지 안했으며 쓸데없는 성능 벤치마크까지 하였으나

이 녀석의 등장으로 곧 템플릿+제네릭 프로그램이 유행을하였으며 프라이빗한 자료구조는 몽땅 대체되기 시작하였다.

#include <algorithm>
#include <iostream>
#include <list>
 
int main()
{
    // Create a list containing integers
    std::list<int> l = { 7, 5, 16, 8 };
 
    // Add an integer to the front of the list
    l.push_front(25);
    // Add an integer to the back of the list
    l.push_back(13);
 
    // Insert an integer before 16 by searching
    auto it = std::find(l.begin(), l.end(), 16);
    if (it != l.end()) {
        l.insert(it, 42);
    }
 
    // Iterate and print values of the list
    for (int n : l) {
        std::cout << n << '\n';
    }
}


이제는 람다 + 함수형과 결합을 하여 불변하지 않는 리스트 객체를 이용하여

집계 통계등을 신기방기한 방식으로 간단한 코드로 표현이 가능해졌다.

아래코드는 C#이며, JAVA 8 Stream에서도 비슷하게 작성할수가 있다.

List<Person> persons = new List<Person>()
{
    new Person { PersonId = 1, car = "Ferrari" },
    new Person { PersonId = 1, car = "BMW" },
    new Person { PersonId = 2, car = "Audi"}
};


List<Result> results2 = persons
    .GroupBy(p => p.PersonId, 
             (k, c) => new Result()
                     {
                         PersonId = k,
                         Cars = c.Select(cs => cs.car).ToList()
                     }
            ).ToList();

여기서 자바/닷넷  혹은 최근 핫한 스칼라등에서 위와같은 컨셉이 자신이 속한 언어 스펙에서 먼저 나왔고

C++의 자료구조 수업만 듣고 위와같이 사용할수 없는것으로 오해를 한다.

템플릿/람다/제네릭/함수형 그 컨셉이 메니지드 언어에 존재하지도 았을때 -예를 들면 자바 4혹은 닷넷 프레임웍 2.0 이하

이미 오래전 C++에서 시도 되었고  Boost(https://www.boost.org/)로 집약이 되었다.


하지만  Boost는 여전히 셋팅하기 어렵고 C++의 의존성과 하나의 어플리케이션이 처리하는 메모리를 잘관리하는것은

여전히 아주 어려운 일이다. 오랜동안 유지한 팀이 오랫동안 노력해야만 얻을수 있고 그만큼 성능및 퍼포먼스가 나올수 있는 부분이다.


최근에는 자료구조가아닌 마이크로 웹 서비스를 위한 조금더 큰 덩치의 어플리케이션 구성에 고민을 하고 있으며

그러한 관점에서 네이티브 언어인 C++에서 마땅히 쉽게 쓰거나, 보편적(주위회사나 사람들이 많이 사용하는) 인 방식이

없기때문에 메니져드 언어 ( 스프링이나, ASP.net을 활용하기위해) 로 전향을 하였으며


다음 주제에 대해 지속적인 연구 활동을 하고 있다.

Spring Cloud MicroService






  • No labels