Skip to main content

Posts

Complete Electronics Self-Teaching Guide

http://www.amazon.com/dp/1118217322 저의 눈높이에 딱 맞는 책이네요. 전기 전자 회로 잘 모르고 Arduino 시작하는 분들에게 추천합니다.

The Arduino Starter Kit

http://arduino.cc/en/Main/ArduinoStarterKit Arduino로 뭘 좀 해볼까해서 구입한 스타터 킷인데 쓸만합니다. 저처럼 전기회로 잘 모르지만 Arduino 시작하는 분들에게 추천. 아직은 킷에 들어있는 매뉴얼 따라하고 있습니다. 집에 있는 레고 마인드스톰이랑 잘 붙여서 이런거 만들어보는게 현재 목표. http://blog.arduino.cc/2008/10/08/arduway-and-arduino2lego/

오리지널 레고 마인드스톰 부활 프로젝트

아... 이 사이트 너무 놀리는거 같아서 스킨 새 단장하고 글 하나. 참 스킨은 www.plaintxt.org  비슷하게 만들어 봤습니다. 약 12년전에 산 레고 마인드스톰이 있어서 애들한테 어떻게 굴러가게 만드는지 보여주려고 하니 여러가지가 걸리더군요. 일단 박스에 딸려온 소프트웨어는 Windows7에선 안 돌아가고 집에 있는 랩탑엔 씨리얼포트가 없고... 씨리얼포트... 정말 오랫만에 들어보는군요. 예전에 한번 써봤던 NQC 로 코딩은 하면 될것 같은데 씨리얼포트는 달리 방법이 없어서 일단 아마존에서 어댑터 를 하나 구입했습니다. 어댑터 도착 후 테스트해보니 씨리얼포트는 정상적으로 인식하더군요. 감동... ㅜㅜ   Brix Command Center (BCC) 라는 GUI도 있어서 설치해서 사용해보니 한 2%정도 편해지더군요. 이렇게되니 얼마전 쌍둥이들이 잃어버린 터치센서 하나가 무척 아쉬워지네요. 애들은 레고 시티 시리즈를 주로 가지고 노는데 나중에 자동문이나 회전목마같은거나 만들어줘야겠네요.

Blogger.com으로 이전했습니다.

근 1년반만에 쓰는 포스팅인데 블로그 이전 메일이군요. ㅎㅎ 워드프레스 호스팅을 사용하고 있었는데 바꿨습니다. 사용한 방법은 워드프레스 관리 페이지에서 export 메뉴로 xml 파일 다운로드 이미지 파일의 링크들을 찾아 피카사 앨범에 업로드 (이미지 파일은 10개 이하라 일일이 손으로 피카사 앨범으로 옮겨주었습니다.) 1번에서 백업했던 xml 파일에서 이미지 파일 링크들을 피카사 링크로 변경 http://wordpress2blogger.appspot.com/  를 사용하여 블로거 export 파일로 변경 블로거 관리 페이지에서 import 끝. 이미지 외 일반 파일들은 모두 무시하였습니다. ㅎㅎ

arraysizeof macro

다음 macro는 array의 length를 구하는 것인데 해석이 되시나요? template <typename T, size_t N> char (&Helper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(Helper(array))) ... 안되신 분들을 위한 설명입니다. ;) 위 코드는 다음 두가지 사실만 알고 있다면 (비교적) 쉽게 이해됩니다. sizeof는 function call syntax에 대해서도 동작하며 그 function의 return type에 대해 동작한다. int foo() { return int(); } ... sizeof(foo()) == sizeof(int) array type의 reference를 리턴하는 method의 signature는 다음과 같다. char (&bar)[10]() { ... } 이를 바탕으로 arraysizeof를 만들려면 char(&)[N]을 리턴하는 method를 만들면 되죠. 여기서 N은 array의 length. template <typename T, size_t N> char (&Helper(T (&array)[N]))[N] { ... } 위 함수는 T(&)[N]을 parameter로 받아 char(&)[N]을 리턴합니다. 물론 T(&)[N] parameter는 이 template method의 implicit instantiation이 동작하도록 하기 위해 필요합니다. 마지막으로 sizeof는 method body가 필요없으므로... template <typename T, size_t N> char (&Helper(T (&array)[N]))[N]; 끝. 참고로 이런 코드가 필요한 이유는 널리 쓰이는 "sizeof(array) / sizeof(*array)" macro가 다음과 같은 경우 compile error없이 오동작하기...

Java generic in return context

아래 코드를 보시고 1, 2번 라인중에 어디서 에러가 날 지를 찾아보세요. interface B { void doB(); } class D implements B { public void doB() {} } interface H { B getB(); } class HImpl implements H { public B getB() { return new D(); // 1) } } ... H h = new HImpl(); D d = h.getB(); // 2) 네, 2번 라인입니다. 그럼 다음 코드는? interface B1 { void doB1(); } interface B2 { void doB2(); } class D implements B1, B2 { public void doB1() {} public void doB2() {} } interface H { <T extends B1 & B2> T getB(); } class HImpl implements H { public <T extends B1 & B2> T getB() { return new D(); // 1) } } ... H h = new HImpl(); D d = h.getB(); // 2) 네, 1번입니다. 잘 이해가 되질 않아 사내 메일링 리스트에 물어보니 I think you're seeing and interpreting it as "this method can return anything that implements both interfaces". What it's actually saying is "the caller is going to tell you a specific class that implements both interfaces, and you must return one of those" . 이랍니다. 즉 T 타입이 아직 결정되지 않은 상태라 D와 T는 compati...

Access level of methods in package-private class

Java에서 (C++도 마찬가지지만) 권장되는 access level 사용법은 다음과 같습니다. Use the most restrictive access level that makes sense for a particular member. 쉽게 얘기해서 private으로 충분하면 private을 쓰고 다음으로 package-private, protected, public 순으로 쓰라는 얘기. 그런데 C++와는 달리 Java는 class에도 public과 package-private 두 종류의 access level이 있습니다. 이 중 public class의 method들은 위의 권장 사항을 따르면 될 듯 한데 package-private class일 경우는 어떨까요? Package-private class에서는 실제 사용될 수 있는 조건으로 봤을 때 method들이 public이건 protected건 모두 package-private과 같은 조건을 가집니다. 즉, 아무리 method의 access level을 public이나 protected로 해봐야 다른 package에선 이 method를 사용할 수가 없습니다. 따라서 the most restrictive한 level을 사용하라는 위 권장 사항을 따르자면 package-private class의 method들은private이 아니라면 모두 package-private access level을 사용해야 합니다. 그런데 코딩을 하다보니 이 방법엔 한가지 문제가 있더군요. 가끔 package-private class를 public class로 만들어야 할 경우들이 생기는데 이때 method들이 모두 package-private이면 다른 package에서 사용할 수가 없습니다. 그래서 다시 method들의 access level을 조정해야 할 필요가 생기는데 이 시점은 이미 코드를 작성했을 때와 멀어서 자칫 잘못된 access level을 지정할 수 있게 됩니다. 그래서 생각한건데... package-priva...

A History of CLU

Checked exception 관련 글들을 찾아 보다가 읽게 된 문서입니다. CLU라는 프로그래밍 언어를 개발하게 된 배경과 과정에 대한 내용인데 정말 재밌네요. 참고로 문서가 좀 길어보이지만 한 1/3은 부록입니다. :) A History of CLU 거의 30~40년전 이야기인데 현재 사용하고 있는 언어들이 여기서 앞으로 많이 나간것 같아 보이지 않네요. As mentioned, the concept of data abstraction arose out of work on structured programming and modularity that was aimed at a new way of organizing programs. The resulting programming methodology is object-oriented . A keystone of the methodology is its focus on independence of modules . Achieving independence requires two things: encapsulation and specification . Specifications are needed to describe what the module is supposed to do in an implementation-independent way so that many different implementations are allowed. ( Code is not a satisfactory description since it doesn’t distinguish what is required from ways of achieving it . One of the striking aspects of much of the work on object-oriented programming has been its lack of understanding of the im...

Checked exception, 이거 써도 되나?

mkseo님 블로그 에 Best Practices for Exception Handling 에 관한 글이 올라왔는데 댓글을 읽고 쓰고 하다 궁금한게 생겼습니다. Checked exception, 이거 써도 되나? mkseo님이 링크를 걸어준  The Trouble with Checked Exceptions 과 Does Java need Checked Exceptions? , Java's checked exceptions were a mistake (and here's what I would like to do about it) 등의 글을 읽다 보니 현재까지의 결론은 "java의 checked exception실험은 실패다"정도인 것 같더군요. 몇가지 이유로는 원래 language designer의 의도와는 달리 많은 exception이 무시되고 있다. 원래 의도는 compile-time에 에러를 냄으로써 개발자들에게 이 예외를 지금 처리하거나 아니면 위로 전달해야 한다는 메시지를 보내는 것이었다. 하지만 예외를 전달하기 위해서는 method의 signature를 수정해야 한다. 개발자들로서는 이 상황을 벗어날 수 있는 가장 쉬운 방법을 찾게 되고, 이게 바로 catch 후 무시하는 것인데 대부분의 코드가 이런 식으로 작성되고 있다. catch (...) {} 원래 exception의 목적중 하나는 예외가 발생한 지점과 처리할 지점의 분리이다. 즉 low-level에서 발생했지만 거기서 처리가 불가능한 exception들을 위로 전달하여 처리하게 한다... 인데... checked exception은 그 사이에 있는 모든 코드가 이 exception에 대해 알아야만 하게 강제한다. 즉, 전달되는 과정이 투명하지 않다. Versionability - 어느 method가 A, B라는 checked exception만을 던진다고 선언되었다면 client code들은 이 예외만을 처리하거나 위로 전달하도록 작성된다. 나중에 이...

Responsive Design seminar - Kent Beck

http://agile.egloos.com/5087979 정말 오랫만에 세미나를 가서인지 첫 시간은... 잘 잤다. ㅜㅜ 다음은 기억에 남는 얘기들. Responsive to Constraints Feedback from system, people or customers. Step back 문제를 만났을 때 한발짝 뒤로 물러서서 바라봐라... 쉬운 예로 어떤 코드의 테스트를 작성하는데 구현하기가 너무 어렵다면 한발짝 뒤로 물러서서 애초에 코드의 설계가 잘못된건 아닌지 확인해봐야 한다. 켄트벡이 든 예는 회전문이었는데... 회전문의  throughput, latency, variance등의 조건을 모두 고려하여 설계하기는 불가능하다. 이때 한발짝 물러서서 왜 회전문이 개선되어야 하는지, 혹시 문밖에 있는 인기있는 커피점때문은 아닌지 보자... 만약 그렇다면 커피점을 문안으로 들여오자. 뭐 이런 얘기... 마침 같이 갔던 H씨가 코드가 바뀔때마다 깨지는 테스트때문에 고민하고 있었는데 한발짝 물러서서 꼭 테스트가 필요한지 확인해보고 지워버리라고 조언... ㅎㅎ Retrospect 자신이 하는 일을 돌아보자. 왜 이렇게 했는지... Goal Steady flow of features. Design - beneficially relating elements 설계란 element들간의 관계인데 서로에게 이롭게 만드는 것. Ambiguity 최선의 설계가 무엇인지 모호할 때는 그대로 놔두는 것도 필요. 그대로 놔두면 코드는 점점 망가지며 스스로 해결책을 드러낼 수 있다. Safe steps 위험하며 효율적인(빠른) 방법보다는 안전하며 덜 효율적인 방법을 선호. 물론 안전하며 덜 효율적인 방법을 빨리 사용할 수 있다. Values 아직 명확하진 않지만... 예를 들면 simplicity, feedback, community Patterns 대부분의 디자인 결정은 problem domain과 관계가...

argv[0]

main 함수의 인자인 argv 배열의 첫번째 항목에는 command line에서 입력된 첫번째 인자, 즉 수행되는 프로그램의 이름이 들어갑니다. ((int main(int argc, char* argv[]) )) 일반적으로 이 argv[0]는 잘 사용하지 않지요. 간혹 usage 출력에 사용되기는 합니다만... 그런데 예전에 Embedded Linux 교육을 받으면서 보니 이 argv[0] 항목을 사용한 BusyBox 라는 재밌는 프로젝트가 있더군요. Embedded 시스템들은 일반 시스템들보다 컴퓨팅 파워나 메모리 용량, 디스크 크기(플래시 메모리)에 있어서 제약이 많습니다. 그리고 하나의 a.out에는 그 프로그램이 실행해야 할 내용외에도 수 kb의 내용이 오버헤드로 포함됩니다. 이 오버헤드를 줄이게 되면 좀 더 작은 디스크나 플래시 메모리를 사용할 수 있게 되죠. 이 오버헤드를 줄이기 위해서 하나의 a.out에 다양한 프로그램의 기능을 집어넣은 것이 BusyBox입니다. 이렇게 만들어진 busybox라는 a.out은 다양한 이름으로 link가 됩니다. 제가 교육받으면서 만들었던 시스템의 /usr/bin 디렉토리에서 ls -l 한 결과를 예로 보면 다음과 같습니다. lrwxrwxrwx 1 507 507 17 Mar 28 2007 [ -> ../../bin/busybox lrwxrwxrwx 1 507 507 17 Mar 28 2007 ar -> ../../bin/busybox lrwxrwxrwx 1 507 507 17 Mar 28 2007 awk -> ../../bin/busybox lrwxrwxrwx 1 507 507 17 Mar 28 2007 basename -> ../../bin/busybox lrwxrwxrwx 1 507 507 17 Mar 28 200...

뉴욕의 프로그래머

뉴욕의 프로그래머라는 책을 읽었습니다. 이미 개발자들을 위한 재밌는 책들을 몇 권 쓰신 임백준씨의 책인데 기대보다는 좀... 장르가 애매해서일까요? 그래도 이런 책이 나왔다는 것 자체가 일단 좋은 일이라고 생각합니다. :-) 각 장의 처음에는 몇 개의 말들이 인용되고 있는데 그 중에서 다음 것들에 대해 생각해 보았습니다. 좋은 판단은 경험에서 나온다. 그리고 경험은 나쁜 판단에서 나온다. - 배리 르패트너 컴퓨터 사이언스를 가르치는 교육이 어떤 사람을 전문적인 프로그래머로 만들지 못하는 것은 붓질과 채색 방법을 가르치는 교육이 어떤 사람을 전문적인 화가로 만들지 못하는 것과 같다. - 에릭 레이먼드 첫번째 말에 따르면 좋은 판단, 그리고 그것보다 더 좋은 판단을 하기 위해서는 나쁜 판단을 계속 저질러봐야 한다는 얘기가 됩니다. 결국 모르는 것을 부끄러워하지 않고 지속적으로 배우고 공부해야 한다는 얘기인데... 말처럼 쉽지 않은 것 같습니다. 특히 부끄러워하지 않는 것이요. :-P 두번째 말은 다른 곳에서도 많이 들었던 것인데 책에서 읽고 이런 생각을 했습니다. 왜 붓질과 채색 방법을 가르치는 교육만 받은 사람은 전문적인 화가가 될 수 없는데 전자의 경우에는 전문적인 프로그래머가 될 수 있을까? ((물론 요새는 프로그래머라는 직업에 대한 인기가 별로 없어 진짜 어설프게 배운 프로그래머의 신규 유입은 거의 없어지지 않았나 싶습니다.)) 제가 생각한 차이점은 붓질과 채색 방법만을 배운 화가의 그림은 진짜 화가의 그림과 쉽게 수준이 비교가 되지만 컴퓨터 사이언스를 배운 프로그래머가 만든 프로그램은 전문가가 만든 것과 쉽게 비교가 되지 않는다는 점입니다. 물론 사용하면서 발생하는 문제들과 문제가 처리되는 방법, 유지보수 용이성등과 같이 세부적인 항목들을 꼼꼼히 검사하면 전문가가 만든것과 확연히 구분되겠지만 일단 기능이 동작하느냐는 관점에서 보면 큰 차이가 나지 않을 수 있죠. (( 이 댓글 과 비슷한 내용입니다.)) 더 큰 문제는 전문 화가의 경우에는 옆에 있는 무늬만...

6년 9개월

오늘이 6년 9개월동안 다녔던 회사에 출근하는 마지막 날입니다. 이제 이 자리에서 블로그에 글 쓰는 건 마지막이군요. 생각해보면 그렇게 길게 느껴졌던 국민학교 6년보다 여기서 더 오래 생활했네요. 일주일 쉬었다가 다음 회사로 출근합니다. 왠지 섭섭한 마음에 PC 반납하기 전에 한 줄 적어봤습니다. :-(

C++ of the Day #45 - SQLite3 C++ wrapper #3

이번엔 sqlite3++를 소개하는 마지막 시간으로 SQLite3의 extension 기능에 대한 부분을 살펴 보겠습니다. SQLite3는 사용자가 정의할 수 있는 function과 aggregate들을 통해 기본 기능을 확장할 수 있도록 하고 있습니다. ((이외에 collation sequence라는 확장 기능도 있습니다만 sqlite3++에서는 지원하지 않습니다. 아직까지는...)) 예를 들어 A라는 column의 정보를 가지고 B와 C의 데이터 중 선택할 수 있는 cond(A, B, C)라는 function을 사용자가 정의할 수 있다면 복잡한 SQL 구문 대신 다음과 같이 간단하게 사용할 수 있을 것입니다. SELECT cond(A, B, C) FROM ...; 그리고 특정 규칙을 적용한 filter를 사용하여 해당 filter에 의해 선택된 항목들의 개수만 세고 싶다면 다음과 같은 aggregate를 만들어 사용할 수도 있습니다. 아래 코드에서는 count_of가 사용자가 정의한 filter라고 가정합니다. SELECT count_of(A, B, C) FROM ...; 이처럼 function이나 aggregate는 SQLite3가 기본적으로 제공하지 않거나 SQL만으로 작성하기에는 복잡한 기능들을 사용자가 정의할 수 있도록 해줍니다. 그럼 sqlite3++을 사용하여 간단하게 이런 function이나 aggregate를 만들 수 있는 방법을 알아보겠습니다. 먼저 ext::function의 경우에는 function pointer나 functor, boost::binder 그리고 boost::lambda등을 function으로 등록하여 사용할 수 있습니다. 예를 들면 다음과 같습니다. int plus100(int val) { return val + 100; } // ... sqlite3pp::ext::function func(db); func.create ("plus100", &plus100); /...

C++ of the Day #44 - SQLite3 C++ wrapper #2

지난 번에 이어 구현중인 SQLite3 C++ wrapper에 대해 살펴보겠습니다. 먼저 이 wrapper의 이름을 sqlite3++로 결정했습니다. 물론 코드안에서와 같이 특수 문자를 사용할 수 없는 경우에는 sqlite3pp라는 이름을 사용합니다. 지난번 글의 내용에서 변경된 사항들에 대해 먼저 알아보죠. 먼저 몇몇 클래스와 함수들의 이름을 알기 쉽게 바꾸었습니다. 다음이 바뀐 이름들의 목록입니다. connection --> database connection::open --> database::connect connection::close --> database::disconnect command::step --> command::execute command::finalize --> command::finish 클래스 상속 관계도 수정이 되었으나 사용자들에게 보이는 변경 사항은 없습니다. 그리고 command::step() 함수의 성공시에 SQLITE_DONE(101)이 출력되던 것을 다른 함수들과의 일관성을 위해 command::execute() 함수는 SQLITE_OK(0)를 리턴하도록 수정하였습니다. 이제 sqlite3++에서 함수의 성공 여부는 리턴값이 0인지를 확인하면 됩니다. 다음으로 SQLite3에서 지원하는 busy_handler, commit_hook, rollback_hook, update_hook, authorizer_handler와 같은 callback 함수들을 등록하는 인터페이스를 database 클래스에 추가하였습니다. 사용하는 방법은 다음과 같이 몇가지가 있습니다. ((boost::function을 사용하여 다양한 타입으로 등록할 수 있도록 구현하였습니다.)) 먼저 일반 함수 포인터를 사용하는 방법입니다. int handle_authorize(int evcode, char const* p1, char const* p2, char const* dbname, char const* tvna...

C++ of the Day #43 - SQLite3 C++ wrapper #1

The Definitive Guide to SQLite 를 읽다가 공부 겸 해서 C++ wrapper를 만들어 보았습니다. 최대한 C++ 냄새(?)가 나도록 만들어 보았습니다. :-) ((SQLite는 복잡한 관리가 필요없이 사용가능한, 파일이나 메모리 기반의, 라이브러리로 제공되는, 약 250kb 용량의, 대부분의 SQL92문을 지원하는, open source RDB입니다.)) 이 wrapper를 사용하기 위해서는 (당연하게도!) sqlite3 와 (당연하게도?) boost 라이브러리가 필요합니다. 사용 예들을 살펴보는 것으로 설명을 대신합니다. 이번 글에서는 다음과 같은 contacts 테이블이 test.db에 존재한다고 가정합니다. CREATE TABLE contacts ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, phone TEXT NOT NULL, UNIQUE(name, phone) ); Command 먼저 test.db 파일을 사용하기 위해 다음과 같이 파일 이름을 주어 connection 객체를 생성합니다. 생성과 동시에 test.db와 연결이 이루어집니다. ((생성자외에 open() 함수를 사용할 수도 있습니다.)) sqlite3pp::connection conn("test.db"); 다음은 contacts 테이블에 정보를 추가하는 가장 간단한 방법입니다. connection 클래스에서 제공하는 execute 함수를 사용합니다. ((executef 함수를 사용하면 printf와 같은 문법을 사용하여 query문을 작성할 수 있습니다.)) conn.execute("INSERT INTO contacts (name, phone) VALUES ('user', '1234')"); 위와 동일한 작업을 parameterized query를 사용하여 할 수도 있습니다. ((step()함수가 실제 query문을 수행하는 함수입니다. ...

의사 결정의 함정들

검색2.0 발견의 진화 (Ambient Findability) 라는 책 내용중에서 의사 결정의 함정들이라는 내용입니다. 책의 주제와는 크게 상관없는 연구 결과 내용인데 너무 와 닿습니다. 고착 결정을 내릴 때 우리의 정신은 우리가 처음 찾아낸 정보의 영향을 많이 받는다. 처음 발견한 데이터와 첫인상에 의해 그 이후의 판단이 고착된다. 확인 우리는 무의식적으로 기존의 시각을 옹호하는 데이터를 찾아 선택적으로 검색하고 받아들이며, 그와 반대되는 증거는 피하려고 한다. ((괴짜경제학이라는 책에서도 줄기차게 나왔던 내용이죠.)) 각인 최근에 있었거나 극적인 사건에 더 영향을 받는다. 어떤 정보가 하나 혹은 여러 개의 출처에서 반복해서 등장할 경우 신념, 기억, 그리고 판단에까지 영향을 미칠 수 있다. 현상 유지 의사 결정시 현재 상태를 영속화할 수 있는 보수성, 관성, 대안들에 강하게 치우치는 경향이 있다. 다시 말해 아무 것도 하지 않을 이유를 찾는 것이다. 매몰 비용 (Sunk Cost) 의식적이든 아니든, 지나간 실수들을 인정하기 싫어서 과거의 선택을 정당화하는 쪽으로 결정을 내린다. 저는 특히 현상 유지 항목의 보수성, 관성등의 말이 무섭게 느껴지더군요. 나도 점점 이렇게 되어 가는건 아닐까 하고요. 언제 어디서든 마음을 열고 이런 함정들에 빠지지 않도록 조심해야겠습니다. 뛰고 있는데도 힘들지 않다면 그길은 내리막길인 것이다. 요새 웹 2.0과 관련된 책들을 찾아 읽고 있는데 그중에서 제일 재밌게 읽었던 책 두권 추천해드립니다. 공교롭게도 둘다 아시아 저자들이네요. (한국, 일본) 웹 진화론, 우메다 모치오 웹 2.0 경제학, 김국현 또 괜찮은 책 있으면 추천해주세요. :-) 읽은 책에는 웹 2.0 이노베이션, 검색2.0 발견의 진화, 검색으로 세상을 바꾼 구글 스토리, The Google Story - 구글 성공 신화의 비밀, 웹 2.0 시대의 기회 - 시맨틱 웹 등이 있습니다.

BookCover plugin test page

This post is for testing BookCover plugin . (( The previous test page has some comments from users.)) The 'Books Reading' section in the sidebar is also using this plugin. [ bookcover:1932394613] [bookcover:1932394613] [ bookcover:1590598385(Smart and Gets Things Done)] [bookcover:1590598385(Smart and Gets Things Done)] [ bookcover:1591841380(Wikinomics : How Mass Collaboration Changes Everything)] [bookcover:1591841380(Wikinomics : How Mass Collaboration Changes Everything)] [ bookcover:8995856408] [bookcover:8995856408] [ bookcover:8831793721] [bookcover:8831793721] [ bookcover:9788831793728] [bookcover:9788831793728]

C++ of the Day #42 - Use of std::bad_exception

이번 글은 Use of std::bad_exception 을 보고 작성하였습니다. 아래 프로그램의 실행 결과는 무엇일까요? void my_unexpected() { if (!uncaught_exception()) cerr throw; } void my_terminate() { cerr } void func() { cerr } void g() throw (int) { throw 1.0; // throws double } int main() { set_unexpected (my_unexpected); set_terminate (my_terminate); atexit (func); try { g(); } catch (int) { cerr } catch (bad_exception& e) { cerr } return 0; } 한 단계씩 살펴보도록 하겠습니다. 먼저 main() 함수의 처음 세 라인은 각각 unexpected, terminate 함수와 프로그램 종료시 호출될 함수를 등록하고 있습니다. 그리고 C++03에서 unexpected() 함수와 관련된 내용은 다음과 같습니다. exception-specification을 가진 함수에서 exception-specification에 리스트되어 있지 않은 예외를 던지면 호출된다. unexpected 함수안에서 exception-specification에 있는 예외를 던지면 해당 handler를 찾아 처리한다. unexpected 함수안에서 rethrow 하거나 exception-specification에 없는 예외를 던지면... exception-specification에 std::bad_exception이 있으면 던져진 예외는 std::bad_exception으로 치환되어 처리된다. exception-specification에 std::bad_exception이 없으면 terminate() 함수가 호출된다. 이제 main() 함...