3월, 2017의 게시물 표시

[Effective Modern C++] Chapter 3. 현대적 C++에 적응하기 [항목 7~17]

Chapter 3. 현대적 C++에 적응하기 항목 7. 객체 생성 시 괄호(())와 중괄호({})를 구분하라. 내 경험과 개인적인 의견에 따르면,,, 객체 생성 시 왠만하면 괄호를 사용하고, 클래스 내에서 멤버 변수의 기본 값을 설정할 때와 std::initializer_list 를 매개변수로 받는 생성자를 호출 할 때에만 중괄호 초기치를 사용하는 것이 좋다. 이러면 별 문제가 없다. 중괄호 초기치의 장점은 아래와 같다. 1. 가장 광범위하게 적용할 수 있는 초기화 구문이다. 2. 좁히기 변환을 방지할 수 있다. 3. C++의 most vexing parse에서 부터 자유롭다. ("선언으로 해석 할 수 있는 것은 항상 선언으로 해석해야 한다.") 일단 1번 경우와 2번의 장점으로 인해 클래스 내에서 멤버 변수의 기본 값을 설정할 때에는 중괄호 초기치를 사용하는 것이 좋다. 그리고 2번 장점의 경우, 대부분 auto의 올바른 사용으로 인해 장점이 무색해진다. 어차피 auto 를 사용하면 암시적인 좁히기 변환이 불가능하기 때문이다. 오히려 auto와 중괄호 초기치의 결합은 type deduction에 있어서 혼란을 가져올 수 있기 때문에 좋지 않다. 따라서 chapter 2의 교훈에 따라 auto를 적극적으로 그리고 잘 활용한다면, 일반적으로 중괄호 초기치보다 괄호를 쓰는 것이 훨씬 좋다. 그러면 3번의 장점을 봐보자. 3번 부분은 ReturnValue obj(); 같은 구문의 경우 이 것이 함수 선언으로 해석되는 것인데, 중괄호 초기치를 사용하면 그럴 일이 없기 때문에 좋다는 것이다... 글쌔... 그냥 ReturnValue obj;와 같이 사용하는 게 낫지 않을 까 싶다. 이제 한번 템플릿 안에서 객체를 생성할 때는 괄호와 중괄호 중 어떤 걸 사용할 지 생각해보자. 내 생각에는 템플릿에서는 더더욱 괄호를 쓰는 게 옳다. 템플릿 매개변수로 어떤 타입이 올지 모르는데 만약 그 타입의 생성자 중에 매개변수로 std::init

[Effective Modern C++] Chapter 2. auto [항목 5~6]

Chapter 2. auto 항목 5. 명시적 형식 선언보다는 auto를 선호하라. 진짜 auto는 상당히 좋다. 그 근거를 대자면 여러가지가 있다. 일단, 거의 반드시 auto를 사용해야만 하는 경우도 있다. (클로저의 형식같이 컴파일러만 알고있는 타입의 경우) 그리고 형식 불일치로 인한 효율적, 이식성문제가 발생하지 않는다. std::size_t getSize() { ... } int size = getSize(); 간단한 예시로서 위 코드 같은 경우, 32bit system에서 컴파일했을 때는 문제가 없지만 64bit system에서 컴파일했을 때는 문제가 있을 수 있다. (예를 들어, windows 64bit의 경우 LLP64를 채택하기 때문에 문제가 생긴다.) 그 외에도 책의 다른 예제들에서 볼 수 있듯이 명시적 형식 선언은 이식성과 효율성 측면에서 문제가 생길 수 있는 여지가 많다. 그러나 auto를 사용하면 이런 문제들이 발생하지 않는다. 또 심미적(?)인 측면에서도 auto를 쓰는 게 기다랗고 복잡한 타입이름을 늘어놓는 것 보다 훨씬 좋다. 결론적으로, 굳이 명시적 형식 선언을 해야 할 필요성을 찾지 못한다면 auto를 사용하는 것이 옳다. 그러나 가독성 측면에서 auto를 사용하면 타입이 정확하게 드러나지 않기 때문에 코드를 읽기 힘들다는 반론도 존재한다. 하지만 내 생각에는 어차피 거의 항상 IDE의 도움을 받게 되기 때문에 큰 문제는 없다고 본다. 오히려 장황하게 늘어져 있는 명시적 타입이 괜시리 눈과 머리를 피로하게 만들어 가독성이 떨어진다. [기억해 둘 사항들]  - auto 변수는 반드시 초기화해야 하며, 이식성 또는 효율성 문제를 유발할 수 있는 형식 불일치가 발생하는 경우가 거의 없으며, 대체로 변수의 형식을 명시적으로 지정할 때보다 타자량도 더 적다.  - auto로 형식을 지정한 변수는 항목 2와 항목 6에서 설명한 문제점들을 겪을 수 있다. 항목 6. auto가 원치 않은 형식으로 연역될

[Effective Modern C++] Chapter 1. 형식 연역 (Type Deduction) [항목 1~4]

이미지
Chapter 1. 형식 연역 (Type Deduction) 항목 1. 템플릿 형식 연역 규칙을 숙지하라. 아래에 적어놓은 코드를 보면 C++11/14에서의 Template Type Deduction 규칙을 파악할 수 있을 것이다. 대부분 직관과 거의 잘 맞아떨어진다. 그래도 주의 할 점 몇가지를 살펴보면, 일단 첫번째는 함수와 배열의 decay 부분이다. 일반적으로 C에서 배열은 포인터로 붕괴되고, 함수도 포인터로 붕괴된다. C++에서도 이는 마찬가지인데, 주의할 점이 참조(&) 가 사용될 때는 붕괴가 되지 않는다. 따라서 template type deduction에 있어서도 ParamType이 &일 경우에는 배열과 함수가 decay되지 않는다. 그리고 두번째로는 보편 참조(universal reference) 이다. 구체적인 것들은 아래 코드를 열심히 보면 이해가 될 것이다. #include <utility> template <typename T> void func_ref(/*ParamType*/ T &) {} template <typename T> void func_ptr(/*ParamType*/ T *) {} template <typename T> void func_unv_ref(/*ParamType*/ T &&) {} template <typename T> void func_val(/*ParamType*/ T) {} template <typename T, std::size_t N> void func_arr_ref(/*ParamType*/ T (&)[N]) {} int main() { /**********************************************/ const volatile int a = 3; func_ref(a); // T -> const volatile int

[Effective Modern C++]

http://book.naver.com/bookdb/book_detail.nhn?bid=9566417 Effective Modern C++ 에 대해서 블로그에 정리해보고자 한다. 책은 이미 다 읽은 상태이고, 대부분 실전에 적용을 해보았기 때문에 좀 더 알찬 포스팅이 가능하지 않을까 싶다. 포스팅은 작년에 Effective C++을 포스팅했을 때와 비슷한 형태로 갈꺼 같다. Effective 시리즈 자체가 핵심 요약본 같은 느낌이라서 책을 단순 요약하는 것은 솔직히 쓸데없다고 생각하기 때문에,,, 책 내용과 더불어 내 개인적인 궁금증 및 실험, 그리고 내 개인적인 견해들이 많이 들어갈 꺼 같다. 못해도 일주일에 1챕터는 포스팅하도록 하겠다. <포스팅 리스트> Chapter 1. 형식 연역 (Type Deduction) [항목 1~4] Chapter 2. auto [항목 5~6] Chapter 3. 현대적 C++에 적응하기 [항목 7~17] Chapter 4. 똑똑한 포인터 (Smart Pointer) [항목 18~22] Chapter 5. 오른값 참조, 이동 의미론, 완벽 전달 [항목 23~30] Chapter 6. 람다 표현식 [항목 31~34] Chapter 7. 동시성 API [항목 35~40] Chapter 8. 다듬기 [항목 41~42] 포스팅에 사용한 코드들은 모두 Github에 올릴 것이다. ( https://github.com/taeguk/Effective-Cpp-Series ) 단, 포스팅에 사용한 것과 약간 차이가 있을 수 있다.

6주간의 인턴 끝.

기간 : 1월 16일 - 2월 28일 (순수 6주) 회사 : http://www.sualab.com Deep learning based industrial image analysis toolkit의 알파버전을 개발했다. (시장에서의 선점 기업은 https://www.vidi-systems.com/ 이다.) 구체적으로 내가 무엇을 했는 지는 https://www.linkedin.com/in/taeguk/ 에 적어놓았다. 회사는 되게 좋다. 우리나라에 이 만한 회사 몇 없을 것이다. 회사가 궁금한 사람은 아래 방송을 보는 것도 좋을 것이다. http://sbscnbc.sbs.co.kr/read.jsp?pmArticleId=10000849000 그리고,, 인턴하면서 느낌점 -> 도메인에 대한 지식과 요구사항 분석은 매우 중요하다.   아무리 C++을 잘하고 소프트웨어 설계를 잘하는 사람이더라도 만약 비지니스 도메인을 파악하지 못한채로 개발을 시작하면, 아무 쓸데없는 결과물이 나올 것이다. 설계를 잘한다는 것은, 고급적인 디자인 패턴이나 어려운 언어 스킬들을 많이 쓴다고 되는 것이 아니다. 기술은 2순위이고, 1순위는 '요구사항'을 정확하게 분석하는 것이다. 요구사항이 정확하게 분석되고나서 기술은 그 뒤를 받쳐주는 것이다. 이번에 가장 뼈져리게 느낀 것이다. 고객들이 어떠한 것들을 요구하는지, 무엇이 중요하고 우선순위인 것인지 파악하고 구체화하는 게 가장 먼저 그리고 충분한 시간을 들여서 해야할 일이다. 요구사항과 도메인에 대한 분석이 충분히 선행되고 나서 소프트웨어적인 설계, 즉 클래스를 어떻게 설계할 것이고 어떤 기술들을 사용할 것이고 하는 것들이 고려되야 한다. 아무도 필요로 하지 않는 기능을 아무리 잘 만들어봐야 전혀 쓸모가 없다.   그리고 소프트웨어를 설계할 때 크게 3가지 점에서 trade-off할 일이 많다. 개발시간 / 유지보수 / 성능 이다. 빨리 개발하고, 유지보수하기 좋은 코드를 짜고, 성능을