728x90

728x90
728x90

점유율

 

활용분야

728x90
728x90

전통C++

specifics

string, 참조, 클래스, 연산자 오버로딩, 상속

 

 

모던 C++ (C++98/03)

specifics

bool 형, 벡터, 맵, 셋, 반복자, 알고리듬, 템플릿

 

features

-자바를 따라 가기 위한 잔재와 같은

-성능에 문제가 생기는 것들이 많아 외면을 받기도 함

 

 

최신 C++(C++11/14/17 3년 단위로 나오고 있음)

specifics

비정렬 맵 및 비정렬 셋, 

defualt/delete/final/override

키워드,람다,유니크,

포인터,공유포인터

 

features

성능에 문제 없게 하기 위해 노력 함

728x90
728x90

주요 인터페이스 개념

생상자에 true/false 값으로 Set/Reset 여부를 지정할 수 있음

Set : 차단기를 올린다. 차가 지나 갈수 있음. (스레드 진행)

WaitOne : 차단기가 열리기까지 기다린다. 열려 있으면 차가 지나가고 아니라면 기다린다.

Reset : 차단기를 내린다. 이후 차는 다시 차단기가 올라가기(Set)까지 지나 갈 수 없다.

 

ManualResetEvent Vs AutoResetEvent

AutoResetEvent는 WaitOne 호출되고 바로 Reset 호출된다

반면, ManulResetEvent는 WaitOne 이후에 명시적으로 Reset을 호출해야 한다.

 

테스트 코드

 class Program
    {
        static ManualResetEvent event1 = new ManualResetEvent(true);

        static void Main(string[] args)
        {

            Timer timer = new Timer();

            timer.Interval = 1000;
            timer.Elapsed += Timer_Elapsed;
            timer.Start();

            while(true)
            {

            }
        }

        private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            event1.WaitOne();
            event1.Reset();

            //Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
            DateTime now = DateTime.Now;

            Random ran = new Random();
            Thread.Sleep(ran.Next(0, 10000));

            Console.WriteLine(now);

            event1.Set();
        }
    }

 

728x90
728x90

노드기반 균형 이진 트리

key, value 형태로 이루어짐

728x90
728x90

- 표준 C++ 라이브러리 (Standard Template Library)

- 프로그램에 필요한 자료구조와 알고리즘을 Template로 제공하는 라이브러리

 

구성요소

Container

- 객체를 저장하는 객체, 자료구조라고도 한다. 클래스 탬플릿으로 구현되어 있다.

- Container는 크게 Sequence, Associative로 나뉜다.

- Sequence Container : Array, Vector, list, deque

- Associative Container : set, multiset, map, multimap

 

Iterator

- 포인터와 비슷한 개념으로 컨테이너의 원소를 가리키고, 가리키는 원소에 접근하여 다음 원소를 가리키는 기능, 원소를 순회하는 등의 역할을 한다.

 

Algorithm

- 정렬, 삭제, 검색, 연산 등을 해결하는 기능

 

Function Object

- 함수처럭 동작하는 객체로 연산자 오버로딩한 객체

- 컨테이너와 알고리즘 등에 클라이언트 정책을 반영?하게 한다.

 

Container Adaptor

- 구성요소의 인터페이스를 변경해 새로운 인터페이스를 갖는 구성요소로 변경한다.

- 종류 : stack, queue, priority_queue

 

Allocator

- 컨테이너의 메모리 할당 정책을 캡슐화한 클래스 객체로 모든 컨테이너는 자신만의 할당자를 갖고 있다.

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

암시적 캐스팅

 

명시적 캐스팅

C스타일 캐스팅은 명확하지 못함.

1. static_cast :: 컴파일시 실수를 잡아줌. 값을 변경해준다. 값 또는 부모-자식관계의 포인터에 쓰임.

2. const_cast :: 형을 바꿀 수 없음. const또는  volatile 애트리뷰트를 제거할 떄 사용

3. dynamic_cast :: 매우 안전하지만 RTTI를 켜놔야 작동함. 켜놓지 않으면 static_const와 동일하게 작동한다. (좋은 기능이지만 성능을 중요시하는 경우에는 쓰기 어렵다.)

4. reinterpret_cast(가장 위험한 캐스팅)

 

 

캐스팅 규칙

 안전한것 -> 위험한것

 1. 기본적으로 static_cast

 2. reinterpret_cast :: 포인터와 비포인터사이의 변환. 서로 연관이 없는 포인터 사이의 변환은 그 데이터형이 맞다고 정말 확신할 때만 할 것

 3. const_cast :: 내가 변경권한이 없는 외부 라이브러리를 호춯할 때만 const_cast를 쓸 것

 

인라인함수

코드의 가독성과 성능을 둘다 잡는?

 

일반적인 함수호출 단계는 CPU캐시에 최적이 아닐수도 있다.

 

매크로와 비슷하나 매크로는 사전처리기에서 처리되는 반면 인라인함수는 컴파일도중 체크된다.

 

매크로는 디버깅하기 힘듦(콜스택에 함수이름 안보임, break point 설정 불가, scope준수(글로벌임) 안됨 등). 정말 매크로를 쓸 이유가 있지 않는 한 인라인 함수를 쓰자!

 

인라인은 항상 적용되는게 아니다! 인라인함수 구현체는 헤더에 있어야 한다.

 

간단한 함수에 적합.

 

실행파일의 크기가 증가하기가 쉬움 (실행파일이 작을수록 오히려 cpu캐시하고 잘 작동될 수도 있다.)

 

결론 : 인라인함수를 사용하여 함수호출의 오버헤드를 줄이고 코드 가독성을 높일 수 있으나, 오히려 실행파일의 크기를 증가시켜 속도가 느려질 수도 있다. 때문에 간단한 함수에 적당히 사용하는게 좋을것 같다.

 

static

-extern

-함수속정적변수 :: 함수 범위 밖에서는 접근 불가능

-정적멤버변수

-베스트프랙티스 :: 1. 함수안에 정적변수를 넣지 말것. 대신 클래스안에 (oop관점에서) 2.전역변수 대신 정적멤버변수 쓸것(범위scope 제한을 하기 위해)

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

상속

부모클래스 접근한정자 지정을 할 수 있다.

 

암시적 부모생성자호출

암시적 부모 생성자를 호출할 때는 기본 생성자를 호출한다. 따라서 부모에 기본생성자가 존재하지 않는다면 컴파일 에러가 발생한다.

소멸자는 하나밖에 존재하지 않으므로 자동으로 자식 소멸자 호출후 부모 소멸자가 호출된다.

 

함수도 메모리에 존재한다

 

정적바인딩, 동적바인딩

java는 기본적으로 부모 클래스는 가상함수이기 때문에 실체에 따라서 메소드를 호출하는 반면

c++은 virtual 키워드로 가상함수를 만들어 놓지 않으면 무늬에 따라서 호출된다.

java는 기본적으로 가상함수인걸 막기 위해선 final 키워드를 사용해야한다.(조금이라도빨라짐)

c++에서 virtual 키워드를 생략하면 정말 큰일 날 수 있다.

 

가상테이블(점프테이블,룩업테이블)

면접문제로좋음

 

가상소멸자

부모 클래스 소멸자를 virtual로 지정하지 않아서 자식 객체를 지울때 정상적으로 자식 객체의 소멸자가 실행되지 않아 메모리 누수가 발생할 위험이 있다.

부모 소멸자가 virtual이면 자식도 virtual이 되지만 습관적으로 부모 자식 둘다 virtual을 넣어두자. 누군가 또 자식을 상식 받게될 수도 있으니..

모든 클래스마다 가상 소멸자를 추가할것!!! 가상함수는 느리지만 혹시 모를 메모리 누수보다 낫다.

 

다중상속

c++만 유일하게 지원한다. 다중상속일 지원하기 떄문에 super키워드를 사용할 수 없다.

 

다중 상속 대신 인터페이스를 사용해라 (자바처럼)

 

추상클래스

순수 가상함수를 가지고 있는 클래스. 개체를 만들 수 없음

 

인터페이스

c++는 인터페이스를 지원하지 않음. 그래서 순수 추상클래스를 이용하여 흉내가능하다.

 

728x90

+ Recent posts