본문 바로가기

프로그래밍/C++

(37)
코드의 재사용성 항상 '한 번 만들고 여러 번 사용한다' 는 사고방식을 가져야 한다 그 이유로는 코드가 단 하나의 프로그램에서만 이용되는 경우는 드물다재사용성 높은 디자인을 하면 시간과 돈을 절약할 수 있다작성되는 코드는 항상 팀 내 다른 프로그래머가 이용할 수 있어야 한다재사용성이 낮으면 중복 코드가 발생하게 되고 유지보수비용이 높아진다재사용성이 높은 디자인은 나 자신의 업무에 가장 먼저 도움이 된다 재사용성이 높은 코드를 디자인하는 방법 다른 분야의 어플리케이션이나 다른 사용 시나리오에서도 무리 없이 적용할 수 있도록 충분히 일반화되어 있어야 한다재사용성이 높은 코드는 언제나 사용하기 쉬워야 한다 재사용성이 높은 코드를 디자인할 때 가장 중요한 것은 '추상화' 이다.
STL컨테이너에 저장되어야할 항목과 반복자 STL 컨테이너: 데이터를 모아서 저장해둘 수 있는 제네릭 데이터구조항목 데이터를 값으로서 취급한다. 값 시맨틱을 적용하여 항목이 삽입될 때 항목을 복제해서 저장하고 외부에서 항목을 룩업할 때도 저장된 항목을 복제하여 넘겨준다. 디폴트 할당자와 비교자가 사용될 때, 컨테이너에 저장되는 항목이 가져야 할 상세 요건 1. 복제 생성자 : 원본과 같은 복제 항목을 만든다. 항목을 삽입하 때마다 매번 호출된다. 2. 이동 생성자 : 원본 항목의 내용물을 이동시킴으로써 새로운 항목을 만든다. 새로운 항목을 생성한 후 원본 항목이 소멸할 때 이용된다. 3. 대입 연산자 : 원본 항목의 복제를 통해 기존 항목의 내용물을 대체한다. 항목을 수정할 때마다 사용된다. 4. 이동 대입 연산자 : 원본 항목의 내용물을 다른 ..
객체지향과 클래스 객체지향 접근 방법: 실세계의 객체를 어떻게 모델링하는가? 객체지향 철학 1.. 객체 (Object) : 객체가 가지고 있는 정보(데이터) + 객체가 수행하는 기능(데이터 처리 함수) 2. 클래스 : 객체들을 구별한다. 공통된 속성과 연산을 갖는 객체의 집합 인스턴스 : 어떤 클래스에 속하지만 같은 클래스에 속한 다른 객체와 구별되는 특징이 있다 메세지 : 객체들 간에 상호작용을 하는데 사용되는 수단 3. 컴포넌트: 모여서 하나의 객체를 이루는 것 4. 프로퍼티 (Property): 어떤 객체를 설명하는 특징, 무엇이 이 객체를 다르게 하는가? 에 대한 답을 준다 5. 행동: 이 객체는 무엇을 하는가? / 이 객체를 이용하면 무엇을 할 수 있는가? 에 대한 답을 준다 6. 통합 (Collection): ..
보기 좋은 코드의 중요성과 코드의 디자인 보기 좋은 코드의 중요성 구성요소1. 문서2. 분할3. 네이밍4. 언어의 사용 형태5. 포매팅 코드의 문서화 주석을 작성해야 하는 이유: 사용자가 그 코드와 어떻게 연동할 수 있는지 설명하기 위해서 공개 메소드에 주석을 제공하면1. 코드로는 표현하기 어려운 내용을 자연 언어로 기술할 수 있다2. 그 메소드의 사용 방법을 담을 수 있다 메타정보를 제공하는 주석: 코드의 개별적인 기능을 설명하기 보다 코드가 생성된 배경에 대해 설명한다 리팩토링 : 코드를 재구성하는 것 추상화를 더욱 강화하는 방법1. 필드(멤버 변수)를 캡슐화한다 : 필드를 private 블록에 두고 접근은 게터와 세터를 이용 2. 타입을 일반화한다 : 좀 더 일반적, 범용적 타입을 이용햇 많은 코드에서 활용할 수 있게 한다 코드를 좀 더 ..
auto, decltype, 문자열 DirectX11을 공부하는 것도 중요하지만 C++ 기초를 다지는 것도 중요하다고 생각한다.문법을 안다고는 하지만 하나하나 세세하게 살펴보고 이해도를 높이는 것이 중요하다는 생각이 들었다.그래서 전문가를 위한 C++ 책도 가끔 가다 보고 있다. 타입 추론 auto, decltype auto 키워드1. 어떤 변수의 타입을 컴파일 타임에 자동적으로 연역해내는 것 ex) auto x = 123; // x는 int 타입이 된다 2. 새로운 함수 정의 문법 3. 자동 함수 리턴 타입 4. 제네릭 람다 표현식 decltype 키워드: 표현식을 인자로 받아서 그 표현식의 결과 타입이 무엇인지 알아낸다 ex) int x = 123; decltype(x) y =456; 동적 메모리: 컴파일 타임에 크기를 정할 수 없는 ..
Lambda (람다) auto Lambda = [캡처_블록](파라미터_목록)mutable 익셉션_목록 속성_지정 -> 리턴_타입{함수_바디}; 캡처 블록 : 람다 함수 안에서 참조할 바깥 변수들을 지정한다. 지정한 변수들은 람다 함수의 스코프 안으로 들어와서 함수 바디에서 접근할 수 있게 된다.파라미터 목록 (생략 가능) : 표현식에서 넘겨받을 파라미터 목록을 정의한다.생략하려면 mutable, 익셉션 목록, 리턴 타입을 지정하지 않아야 한다.mutable (생략 가능) : 람다 함수의 const 속성을 지워서 캡처받은 변수를 수정할 수 있게 한다.익셉션 목록 (생략 가능) : 람다 표현식의 바디 본체 안에서 throw 할 수 있는 익셉션 종류를 지정한다.속성 지정 (생략 가능) : 람다 표현식의 속성을 지정한다.리턴 타입 ..
가상 메모리 (Virtual Memory) 내용이 정말 쉽게쉽게 설명되어 있어서 어느정도 이해가 쉬운 거 같다 코드적인 부분은 자세히 보지 않아서 나중에 한번 더 볼 때는 코드도 따라쳐가면서 봐야겠다 가상 메모리 컨트롤 Reserve는 예약, Commit는 할당, Free는 할당되지 않았음을 의미한다 페이지의 개수 = 가상 메모리의 크기 / 페이지 하나당 크기 페이지 개수는 가상 메모리의 크기에 비례한다 Free->Commit로 변경하는 것은 malloc 함수 호출을 통해 페이지 크기만큼 할당하면 된다 Reserve상태는 Free와 Commit의 중간 상태이다 메모리를 할당하기 전1.메모리 할당의 시작 주소2.할당할 메모리의 크기을 생각해야한다 가상 메모리 시스템은 페이지 단위로 관리된다. 페이지의 중간 위치에서부터 할당을 시작할 수 없으며, 페..
동기화 (Synchronization) 스레드 동기화: 스레드의 실행순서를 정의하고, 이 순서에 따르도록 하는 것. 메모리 접근 에 있어서 동시접근을 막는 것도 해당함. 유저모드 동기화 (User Mode Synchronize): 동기화가 진행되는 과정에서 커널의 힘을 빌리지 않는 동기화 기법. 동기화 를 위해서 커널 모드로의 전환이 불필요하기 때문에 성능상에 이점이 있다. 커널모드 동기화 (Kernel Mode Synchronize): 커널에서 제공하는 동기화 기능을 활용하는 방법. 동기화에 관련된 함수가 호출될 때마다 커널 모드로의 변경이 필요하고, 이는 성능의 저하로 이어진다 임계영역 (Critical Section): 문제의 원인이 될 수 있는 코드의 블록. 배타적 접근이 요구되는 공유 리소 스에 접근하는 코드 블록 뮤텍스 (Mutex..