본문 바로가기

개발100

[C++]STL Container 조합하기 STL 에서 하나의 Container를 선택하는 방법은 간단합니다. vector – 맨 뒤에만 추가할 경우 순차 검색에 유리 dequeue – 앞 뒤로 추가할 경우 및 순차 검색에 유리 map – 검색이 필요할 경우 유리 list – 데이터의 삽입과 삭제가 빈번할 경우 유리 … 와 같은 식으로 간단하게 선택할 수 있습니다. 하지만, 가끔가다 보면 위에 Container 의 특징을 하나 이상 만족해야 할 경우가 있습니다. 특히 검색도 빨라야 하면서, 초기에 주어진 순서를 그대로 유지해야 하는 경우가 그렇습니다.간단하게 생각하면 map 와 vector 를 같이 사용하면 되지 않나 싶은데요 몇 가지 고려해야 할 경우가 있습니다. 우선 설명을 더 진행하기 전에 예제에서 사용할 간단한 더미 구조체를 하나 선언하겠.. 2007. 11. 12.
프로그래밍 이야기- 코드 리뷰 다른 사람이 작성한 소스 코드를 여러 사람이 함께 분석하는 과정을 일컫는 말로 코드 인스펙션(Inspection), 코드 리뷰, 코드 읽기 등 다양한 이름으로 불리어지는데(이름마다 조금씩 방식이 틀리더군요) 개인적으로는 CODE COMPLETE 2 에 나오는 “코드 읽기” 가 저에게 가장 잘 맞는 것 같습니다. 처음에는 저희 회사에 도입된 개발 방법론에 따라 코드 인스펙션을 진행했습니다. 코드 인스펙션은 레코더(회의기록을 남기는 사람) 과 한 명 이상의 인스펙터(소스를 읽고 지적을 해 주는 사람), 코더(소스를 짠 사람) 등 여러 사람들이 한자리에 모여 회의를 진행하는 방식입니다. 회의도 한번만 하는 게 아니라 사전에 코드를 전달해 주기 위해 한번 모이고, 각자 소스를 보고 문제점을 A4 용지에 중요도에.. 2007. 11. 9.
티스토리 블로그 댓글 알리미 티라이브 버전 0.2 새로운 버전이 나왔습니다. 업데이트 바랍니다. 2011/01/11 - [프로그램] - 티스토리 블로그 댓글 알리미 티라이브 버전 0.5 티라이브란 티스토리 블로거가, 자신의 블로그를 방문하지 않아도 방문자 수와 최신 댓글/트랙백/방명록을 확인할 수 있는 프로그램입니다. 티라이브 버전 0.2 의 주요 개선 내용 트레이아이콘으로 전환 다른 블로그에 남긴 댓글에 대한 알림 기능 툴팁으로 간단한 최근 댓글 정보 표시 기능 각 기능에 대한 주요 업데이트 내용입니다. 트레이아이콘으로 전환기능 티라이브가 작은 창만 유지하기는 하지만, 가끔씩 작업에 방해가 된다 싶으면 트레이아이콘으로 옮겨두고 싶은 경우가 있었습니다. 금번 작업하면서 이 부분에 대한 작업을 진행했습니다. 화면과 같이 티라이브 메인 창에서 우측 마우스 .. 2007. 11. 7.
티스토리 블로그 댓글 알리미 티라이브 버전 0.1d 새로운 버전이 나왔습니다. 최신 버전을 확인하세요2008/09/05 - [프로그램] - 티스토리 블로그 댓글 알리미 티라이브 버전 0.3 어제에 이어 티스토리 블로그 댓글 알리미 티라이브에 마이너한 몇가지 업그레이드가 있었습니다. 티라이브가 화면 구석에 위치할 때 (특히 우측이나 바닥에 위치할 때) 댓글 리스트가 화면 바깥으로 가려지는 문제를 수정했습니다. 가려질 경우에는 댓글 리스트가 화면에 잘 보여지도록 위치만 살짝 바꿨습니다. 자동 로그인 기능을 지원합니다. 접속 후 마우스 우측 클릭으로 기타설정 메뉴를 선택하고, “비밀번호 저장”을 선택하면 다음 번 접속 시부터는 자동으로 로그인 하도록 개선되었습니다. 티라이브를 더블 클릭하면 티스토리의 본인 블로그가 실행되도록 했습니다. 신규 댓글(또는 트랙백,.. 2007. 10. 31.
티스토리 블로그 댓글 알리미 티라이브 버전 0.1c 새로운 버전이 나왔습니다. 최신 버전을 확인하세요2008/09/05 - [프로그램] - 티스토리 블로그 댓글 알리미 티라이브 버전 0.3 얼마 전 공개했던 티스토리 블로그 댓글 알리미를 일부 수정했습니다. 수정 및 개선된 내용은 아래와 같습니다. 새로운 댓글/트랙백/방명록이 도착했을 때 트레이 아이콘 영역에 아래와 같이 댓글 알림 표시를 하도록 했습니다. 방문자 수 영역에 표시되던 "Today" 텍스트를 대신하여 티스토리 아이콘으로 교체했습니다. 아이콘은 funny4u님이 공개해 주신 티스토리 아이콘을 비트맵으로 변환해서 사용했습니다. 프로그램의 비정상종료를 막기 위해 에러 처리 코드를 추가했습니다. (이번 수정으로 얼마 전 작은인장님이 트랙백으로 알려주신 문제도 해결 되리라 봅니다. 문제를 알려주셔서 .. 2007. 10. 30.
간단한 프로그램에 벌써 3번째 비정상종료 발견 --; 며칠 전에 배포한 티스토리용 댓글 알리미용 프로그램 2007/10/23 - [프로그램] - 티스토리 라이브 Ver. 0.1b 에서 벌써 3번째 비정상적으로 종료되는 문제를 발견해서 패치 했습니다. 너무 오랫동안 강호(프로그램 세계)를 떠나있었다고 위안을 삼고는 있지만, 요 작은 프로그램을 만들면서 비정상 종료와 같은 큰 문제를 3개나 일으키다니 유구무언입니다. 후배들의 코드를 맨날 코드 리뷰 한답시고, 문제를 찾는 제가 오히려 문제를 만드는 사람이란 것도 아이러니 하네요. 코딩 안 하는 게 회사를 돕는 일이겠습니다 ^^; 코딩 할 때 항상 같은 문제를 또 일으키는 경우가 많은데, 그럴 때를 대비해서라도 이번에 발생한 3가지 비정상 종료의 원인이 된 코드를 적어 보려고 합니다. 1. STL::string .. 2007. 10. 26.
티스토리 라이브 Ver. 0.1b 새로운 버전이 나왔습니다. 최신 버전을 확인하세요2008/09/05 - [프로그램] - 티스토리 블로그 댓글 알리미 티라이브 버전 0.3 티스토리 라이브 Ver. 0.1(TLive)을 공개합니다. 티스토리 라이브는 티스토리 블로그에 있는 다음 정보를 가져와 화면에 표시하는 기능을 가집니다. 오늘 방문자수 최근 댓글 목록 최근 트랙백 목록 최근 방명록 목록 티스토리 라이브 사용 설명 1. 로그인화면 우선 프로그램을 내려 받아 실행하시면 블로그의 개인정보를 물어 보는 창이 뜹니다. 아래와 같이 정보를 채워주세요 블로그 주소: 티스토리 계정 주소입니다. 아이디: 티스토리 로그인을 위한 사용자 이메일 주소입니다. 비밀번호: 티스토리 비밀번호 조회 주기(초 단위): 특정 시간 주기로 웹 페이지를 조회합니다. 최소.. 2007. 10. 23.
1분 회의 - 팀과 관리자를 위한 필수 선택 얼마 전부터 저희 팀은 매일 1분 회의를 하고 있습니다. 1분 회의는 요즘 들어 읽고 있는 “Ship It! 성공적인 소프트웨어 개발 프로젝트를 위한 실용가이드”를 읽고 나름 실천하기 위해 만든 회의 이름입니다. 1분 회의는 말 그대로 회의 참석자가 한번에 1분의 시간만 사용해야 하는데요, 전일 작업 한 내용과 오늘 할 일을 아주 간단하게 1분 정도의 시간을 들여 구술하는 회의입니다. 저희 팀은 지난 주 목요일부터 매일 아침 8시 ~ 9시 사이에 적당한 시간을 정해 1분 회의를 하고 있습니다. 회의에 참석하는 저희 팀원들은 조금 고달프겠지만, 관리자인 저로서는 기대 이상의 효과를 얻고 있습니다. 제가 회의에서 얻는 장점들은 다음과 같이 아주 많습니다. 1 분이라는 아주 짧은 시간이지만 팀원들이 현재 하고.. 2007. 10. 17.
[C/C++]유용한 #pragma directive ※ 주의 : 아래에서 기술하는 내용은 Visual C++ 컴파일러에서만 확인된 내용입니다. 지난번 #define 팁 에 이어 이번에는 필수는 아니지만 사용할 경우 아주 편리한 #pragma 지시자를 간단하게 소개하려고 합니다. 1. 헤더 파일을 한번만 읽어 들이기 아마도 이 경우가 #pragma를 가장 널리 사용하게 된 이유 중에 하나라고 생각되는데요 저도 언제나 헤더 파일을 새로 코딩 할 때 이 한 줄을 먼저 적게 됩니다. (아주 짧고 멋집니다) #pragma once #pragma once 가 없을 당시에는 아래와 같이 헤더 파일 내용을 #ifndef ~ #endif 문장을 사용해서 복잡하게 써주어야 했습니다. (요 복잡한 게 한 줄로 줄었으니 사용하지 않을 수 없죠^^) #ifndef _MY_HEA.. 2007. 9. 5.
프로그래밍 이야기 - DRY 원칙을 지키고 있습니까? 지난주 금요일 거래소에서 제도 변경관련 공문이 왔습니다. 증권회사이다 보니 시일에 맞게 제도변경을 해서 고객에게 완벽한 프로그램을 적용시키는 것이 제가 가진 숙제인데요.이번 변경건과 관련 프로그램 변경범위를 파악하는 작업을 오전부터 하게 되었습니다. 수정 사항은 그리 복잡하지 않고 단순 노가다 성으로 한가지 TYPE 이 세분화 되어 4가지 TYPE 으로 처리되어야 하는 게 다였습니다. 언제나처럼 수정해야 할 범위를 찾아 Visual Studio .NET 2005에서 Find in Files 를 10여분 돌리고 분석해 본 결과 약 10개 정도의 모듈에서 20여 개 이상의 소스를 수정해야 한다는 걸 알았습니다. 문제는, 10여 개 모듈에 동일한 지식이 고스란히 복사되어 존재한다는 것입니다. 누군가 최초 코드.. 2007. 8. 28.
디버그 이야기 - 비정상종료 버그를 찾는 작업인 디버그에는 그 종류가 수도 없이 많지만, 오늘 글의 주제는 버그 중에 가장 비극적인 결말을 가져오는 프로그램 비정상종료에 대해 써보려고 합니다. 사용하던 프로그램이 비정상종료 되었을 때의 아픔을 겪어 보신 적 있으신가요?열심히 몇 시간을 투자해 만든 문서가 프로그램 비정상 종료 한번으로 날아 간 경험 등은 누구나 한번쯤 갖고 계실 것입니다. ‘최고의 개발자’ 들이 만들었다는 마이크로소프트의 제품들마저도 이러한 비정상종료 문제를 완벽하게 해결하지 못하는데 저 같은 하수가 개발하는 프로그램이야 오죽할까요. IE7 보다 더 안정적이라고 평가 받은 불여우도 자주 죽습니다 --;프로그램 비정상종료로 하도 고생을 많이 하다 보니 어느 정도 내공이 쌓여서 그간 쌓은 내공 중 천기누설이 아닌 일반적.. 2007. 8. 21.
개발자를 위한 개발자에 의한 문서 만들기 얼마전 화면을 하나 개발할 일이 있어 간만에 코딩을 한 적이 있습니다. (코딩은 언제나 즐겁습니다 ^^)요즘은 거의 코딩을 하지 않고 살기 때문에 코딩이 무뎌졌을 거라 걱정했었는데, 다행히 생각한 것 만큼 그리 힘들지 않더군요.문제는 회사 내 우리 팀(클라이언트 화면 개발팀)이 만든 각종 컨트롤을 다루면서 생겼습니다.화면에서 다루어야 하는 각종 컨트롤들이 있는데 이 컨트롤을 다루는 방법에 대한 문서화가 전혀 안되어져 있어서 실제 핵심이 되는 알고리즘을 만드는 시간보다 컨트롤에 대한 사용방법을 찾느라 대부분의 시간을 허비했습니다.(뭐 원래 윈도우 프로그램 개발하는 데 UI 개발에 걸리는 시간이 훨씬 많은 편이라는 건 인정합니다만..)회사에서 자체적으로 만든 콤보 컨트롤, 달력컨트롤, 라디오 컨트롤, 리스트.. 2007. 7. 22.
[C++]인터페이스를 이용하여 상호참조와 종속성을 최소화하는 방법 이번 글의 주제는 C++ 에서 호출하는 클래스(CCaller) 와 호출 받는 클래스(CCallee) 가 있을 경우 호출 받는 클래스(CCallee)에서 이벤트가 발생 등의 이유로 호출하는 클래스(CCaller)의 어떤 함수를 호출하고자 할 경우 사용할 수 있는 안전한 방법에 대해 얘기하고자 합니다. 일반적인 함수호출은 아래 그림과 같습니다. 오늘 설명 드리고자 하는 내용은 반대로 CCallee 클래스에서 CCaller 클래스의 Method를 종속성을 해하지 않고 호출하는 방법을 알아 보려고 합니다. 설명을 진행하기 위해 간단하게 CCaller 와 CCallee 를 만들었습니다. CCaller 는 CallSerice() 멤버 함수에서 CCallee 의 인스턴스를 만들고 CCallee::DoSomething.. 2007. 7. 15.
[C/C++]#define 매크로 팁 C/C++ 에서 #define 을 사용을 가급적 자제하도록 권고되고 있지만, 잘 사용할 경우 많은 코딩상의 이득을 볼 수 있습니다. #define을 활용하는 예를 몇 가지 설명하려고 합니다. 우선 팁을 설명하기 전에 간단하게 ‘##’ 과 “#’ 에 대해 살펴보고 가겠습니다. (샘플소스는 MSDN 에서 가져왔습니다) 1. ‘##’ - Token-Pasting Operator (##): 분리되어 있는 2개의 토큰을 하나로 뭉쳐주는 역할을 합니다. #define paster( n ) printf( "token" #n " = %d", token##n ) 라고 할 때 아래와 같은 코딩은 int token9 = 9; paster( 9 ); // token##n -> token 과실제인수9 를합쳐token9 가됨 다.. 2007. 6. 29.
파일을 숨기는 방법 - ezRename 개발목적 ezRename 은 하나이상의 파일을 전혀 다른 의미의 파일명과 확장자로 변경하는 프로그램입니다. 프로그램 용도 개발하게 된 동기는 야동(파일)을 감쪽같이 숨기는 방법 이란 글을 올블로그에서 접하고 만들었습니다. 파일을 숨기기 위해 다른 용도의 파일인 것처럼 숨기는 팁에 관련된 글인데, 글을 읽다 보니 예전에 저도 이와 비슷한 경우가 있어(야동은 아님 ^^) 요걸 프로그램으로 만들면 어떨까 생각하게 되었습니다. 글을 보신 분이라면 쉽게 용도를 파악하실 수 있을 듯 한데요.. 꼭 야동 파일이 아니더라도 다른 사람들에게 특정 파일이나 폴더를 숨기고자 하실 경우 사용하시면 됩니다. 프로그램 사용법 사용법은 간단합니다. ezRename 은 2개의 탭을 가지고 있습니다. 첫 번째 탭은, 이름을 변경하고자.. 2007. 6. 27.
안전하고, 좋은 냄새가 나는 C++ 코드 만들기 C++ 을 배운지 꽤 오래 되었지만, 아직도 코드 리뷰를 통해 다른 개발자들의 코드를 볼 때면 한숨이 나오는 경우가 많습니다. 이런 경우가 반복되다 보니, 예전에 몇 가지 코딩 규칙 비슷하게 만들어놓은 자료가 있어 포스팅해 봅니다. 자료가 만들다 말아 내용이 중구난방이네요.. 앞으로도 계속 내용 보강해 나가겠습니다. ▤ 포인트 핸들 및 윈도우 핸들 체크 - 가급적 STL 컨테이너를 사용해서 아예 포인터를 사용하지 않는 것이 정신건강에 이롭다. (STL 자체적으로 메모리 생성 및 소멸)- (윈도우 프로그램의 경우)윈도우 API 호출 직전 항상 윈도우 핸들이 정상인지 IsWindow 와 같은 함수로 검사한다. ▤ DRY(Don't Repeat Your Code)원칙- 동일한 코드를 공용 루틴(함수)으로 개발.. 2007. 5. 30.
C++ 성능이야기 – MFC CString 인자로 사용하기 MFC로 어플리케이션을 만들 경우 CString 에 대한 의존도가 상당히 높습니다. 하지만 CString 을 남용함으로써 성능 저하를 일으키는 경우가 많은데 오늘은 그 중 CString 문자열을 함수로 전달할 때 발생하는 성능관련 이슈를 확인하려고 합니다 1. 테스트의 목적 문자열 함수 처리에 많이 사용되는 CString 을 다른 함수로 전달 할 경우 가장 좋은 성능을 가진 함수 인자 선언 TYPE 을 찾기 위함. 2. 테스트 환경 1) 컴파일러 - VISUAL STUDIO .NET 2005 2) PC 사양 - Pentium® D CPU 3.19GHz, 2GB RAM 3. 테스트 코드 – 인자로 들어온 텍스트를 DUMMY CString 할당하고 간단한 자연수 연산을 한 뒤 리턴 하는 함수 // 인자로CS.. 2007. 4. 27.
Adobe Flex2 처음 맛보기 - Flex 로 만든 계산기 Flex 2 관련 책(“예제로 배우는 Adobe 플렉스2”) 을 구입해서 지하철을 오가며 본지 2주 만에 처음으로 Flex Builder2를 설치해서 간단하게 만들어 본 프로그램입니다. 게으름으로 인해 아직 책을 반도 보지 못한 상태라 Flex2 의 다양한 기능이나 Action Script를 제대로 이해하지 못하고 있지만, 잠시 코딩 해 본 바로는 - Flex Builder2 는 제대로 된 통합 개발환경을 제공합니다. 각종 View 들과 Perspective 들을 개발자가 손쉽게 화면을 디자인할 수 있게 해 주고, 손쉬운 저장 및 실행, 디버깅 기능까지…… 아직 버전2임에도 상당히 높은 수준의 기능을 두루 갖추고 있습니다. - Action Script 는 C++ 과 너무나 문법적인 면이 닮아서 C/C++.. 2007. 4. 14.
STL iteraotor 사용 예제 1. vector, deque, list 에서의 erase 사용 예: erase() 할 경우 erase 의 리턴값에 pos 이 있으므로 이 값을 기준으로 다음 pos 을 구하면 됩니다 deque::iterator pos = begin(); while (pos != end()) { if (pos->m_nKey == nID) { pos = erase(pos); } else pos++; } 2. set, map 에서의 erase 방법 map 의 erase 는 vector 에서 처럼 pos 를 리턴하지 않기 때문에 아래처럼 좀 복잡한 방법을 써야 합니다. for (pos = map.begin(); pos != map.end(); ) { if (pos->second == value) map.erase(pos++).. 2007. 3. 26.
MFC, STL 간단 사용팁 MFC, STL 간단 사용팁1. 어플리케이션위치관련 가)최소화 여부판단 if (IsIconic()) { ... } 나) 종료시 프로그램 위치기억하기 void CYourApp::OnDestroy() { __super::OnDestroy(); // Some Code // ... WINDOWPLACEMENT wr; wr.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(&wr); // wr.rcNormalPosition 를파일에기록 } 다) 시작시이전화면 위치로실행하기 int CYourApp::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (__super::OnCreate(lpCreateStruct) == -1) return -1;.. 2007. 3. 23.