본문 바로가기

C++ Coding Standards

(59)
항목 84 : 직접 작성한 루프보다는 알고리즘을 활용하라. ( Prefer algorithm calls to handwritten loops. ) { STL에서 전체의 요소에 특정 작업을 하고 싶을 때, 루프로 for문을 많이 사용한다. 이것을 알기에 좀더 편하게 사용 할 수 있는 알고리즘인 for_each가 있다. for_each는 루프를 대신해서 사용 할수 있으며, 보다 독립적인 구조를 유지 할 수 있게 해 준다. 그래서인지 for_each 를 사용했던 사람은 for 문보다 for_each를 더 많이 사용 한다. for_each를 사용 할 때는 함수 객체를 붙여 줄 수 있는데, 간단한 것이라면 boost 의 Lambda 를 사용하면 더 편해진다. 무슨 말이 필요 할까, 그냥 내가 만들어본 예제코드를 보자. #include #include #include #include // ikpil.com int main( void ) { //using na..
항목 82 : 용량의 축소와 요소의 제거에 있어 적절한 방법을 사용하라. ( Use the accepted idioms to really shrink capacity and really erase elements. ) { 컨테이너의 용량의 축소나 "swap 트립"으로 할 수 있다. swap 트립은 다음과 같다. #include #include class Babo { public: ~Babo() { std::cout
항목 81 : 추가 작업에 있어 범위를 지정한 방식을 활용하라. (Prefer range operations to single-element operations. ) { 책의 내용을 옮기자면, "바람이 적절히 불 때에는 노를 저을 필요가 없다.(라틴 속담)" 이것과 같이 봐야 할 것은 algorithm 이 있는데, 이것과 같이 알아 보는게 좋다. ^^ }
항목 78 : C++ API가 아닌 다른 것들과의 데이터 교환을 위해서는 vector(그리고 string::c_str)를 활용하라. ( Use vector (and string::c_str) to exchange data with non-C++ APIs. ) { 왜냐하면 메모리 구조가 연속적으로 유지되기 때문이다. 컨테이너 요소의 첫번째 메모리 주소만 알면, 그 뒤의 메모리 접근에 있어서, 별다른 과정을 거치지 않아도 된다. 주의 해야 할 것은 반복자를 포인터로 보지는 말라는 것이다. 물론 포인터 형태로 되어 있지만, 보다 개념적으로 완성된 상태로 보는게 더 이롭다 라고 책에 적혀있네 }
항목 76 : 표준적으로 vector를 사용하고, 그렇지 않다면 적절한 컨테이너를 선택하라. ( Use vector by default. Otherwise, choose an appropriate container. ) { 올바른 컨테이너를 선택해서 쓰라는 의미로 이해 하면 된다. http://rhansla.tistory.com/106 }
항목 67 : 계획적이지 않고 일반적이지 않은 코드는 작성하지 말라. ( Don’t write unintentionally nongeneric code. ) { 작성해도 되긴 된다. : ) 단지 좀 더 재사용 가능한 코드를 만들기 위해 노력을 하자는 의미로 이해하면 될 듯 싶다. 몇가지만 요약해 줄 수 있는가? 1. 반복자의 비교는 != 로 한다. 2. 인덱스를 사용한 접근보다 반복을 사용 하라.(물론 예외는 있다.) 3. size() == 0 대신 empty()를 사용 하라. 4. 계층 구조상 최 상단의 추상화된 함수를 사용 하라. 5. const를 활용하라. 예외는 있으므로, 처음에 말했던 재사용 가능한 코드를 만들기 위해서 노력해야 한다라고 이해해도 좋을 듯 싶다. }
항목 64 : 정적, 동적인 다형성을 절적히 혼합하라. ( Blend static and dynamic polymorphism judiciously. ) { 동적인 다형성 : Polymorphism 은 무엇인가? 클래스의 상속을 통해서 하나의 타입에 서로 다른 타입을 넣어 서로 다른 타입처럼 인식되는 것을 뜻한다. 정적인 다형성 : Polymorphism 은 무엇인가? 정적인 다형성은 타입의 이름은 같지만 옵션( < > 같은것)을 주어 같은 이름이지만 옵션에 따라 다른 타입으로 인식되는 것을 뜻한다. 두개 다 다형성인데 무엇이 다른가? 동적 다형성은 런타임에 인식되는 것이고, 정적 다형성은 컴파일 타임에 이루어 지는 것이다. 그러므로 용도가 다르다. 동적 다형성의 용도는 무엇인가? 런타임에 행동을 바꿀 수 있다. 대신 정적 다형성 보다 느리다. 정적 다형성의 용도는 무엇인가? 컴파일 타임에 흐름을 같으나 행동이 행동을 바꿀 수 있다. 대신 동적 다형성 보..
항목 63 : 모듈의 인터페이스 내에는 충분한 이식성을 갖춘 타입을 사용하라. ( Use sufficiently portable types in a module’s interface. ) { 인터페이스는 무엇인가? 환경이란 뜻인데, 컴퓨터 세계에서의 인터페이스는 "무엇을 사용하기 위해서 필요한 조건"이다. 그렇다면 모듈의 인터페이스란 무엇인가? 모듈을 사용하기 위한 필요한 조건이란 말이다. 여기서 말하는 모듈이란 플랫폼(컴파일러, 운영체제, 특정 하드웨어 등등)에서 사용 되는 라이브러리이다. 이러한 모듈의 인터페이스 내에 충분한 이식성을 갖춘 타입 : TYPE 을 왜 사용 해야 하는가? 라이브러리니까 ㅋ, 충분한 이식성을 갖춘 타입은 무엇이 있는가? C++ 에선 표준 타입들이 있겠다. 하지만 간혹 함수 호출 규약이나 표준 타입의 크기등 메모리 사용량이나, 메모리 사용방법에 대해서 다른 경우 안되는 경우가 있다. 이럴 때는 해당 플랫폼에서 재컴파일만 하면 된다. }