C++

    링커

    # 링커 https://jhnyang.tistory.com/40?category=815411 • 프로그램은 여러 파일로 이루어진다. 링커가 없으면 한파일에 모든 프로그램소스를 담아야할 것이다. • 링커는 라이브러리 전체를 로드하지 않고, 필요한 부분만 로드한다. • 링커는 목적파일을 모아 실행파일로 만든다. 즉, “대부분의 컴파일러에서, 각각의 목적 파일은 하나의 입력 소스 코드 파일의 컴파일 결과이다. 한 프로그램이 여러 개의 목적 파일로 구성될 때, 링커는 이 파일들을 하나의 통합된 실행 가능한 프로그램으로 합치고 이때 생겨나는 기호들을 해결한다 (resolve).” resolve라는건, 링커가 기호를 해석하는 행위를 말하는 듯. # 목적파일(object file) • c++, java 스크립트를 컴..

    STL - queue

    STL - queue

    큐는 선입선출을 원칙으로 하는 자료구조다. 때문에 보통 순서대로 처리해야하는 로직에서 사용한다. 예를들어 HTTP 요청을 하고 응답을 받기까지 꽤나 시간이 걸리는데, 그 응답을 즉각즉각 화면에 표시해야한다면 큐를 사용해볼 수 있다. 즉, 데이터를 화면에 보여주기 전에 미리 여러개의 데이터를 요청하고, 응답을 받는대로 큐에 넣는다. 화면에 데이터를 표시해야할 때가되면 큐에서 데이터를 꺼내서 표시한다. 이렇게하면 응답이 온 순서대로, 지연시간없이 화면에 데이터를 표시할 수 있다. 또다른 예는 자바스크립트 런타임의 이벤트루프에서 찾아볼 수 있다. 자바스크립트 런타임의 이벤트루프 자바스크립트는 싱글스레드 환경에서 돌지만, 비동기식으로 동작한다. 그게 가능한 이유는 이벤트루프를 돌면서 함수를 실행할 시점을 체크하..

    STL - map

    표준 연관 컨테이너 (비선형적) 트리구조이다. map은 key와 value를 한 쌍으로 가진다. map myMap; 인덱스를 통해 접근이 가능하다. myMap[1] 원소 삽입 map은 원소삽입시 key와 value를 직접적으로 전달 할 수 없고, pair라는 객체를 전달해야한다. 방법1 - myMap.insert(pair(3,5)) 방법2 - myMap.insert(make_pair(3,5)) 방법3 -myMap.insert(map::value_type(3,5)) // key는 저절로 const가 됨 방법4 - myMap[1] = 100; // 1이라는 키가 없을 경우 생성하고, 있을경우 value를 '수정'한다. -> 맵의 키를 탐색하기 때문에 시간이 오래걸린다. '수정'하기 때문에 예상치 못한 동작을..

    STL - list

    리스트는 STL의 표준 시퀀스 컨테이너이다. 선형적 자료구조이며, 노드기반으로 구현되어있다.(이중연결리스트로 구현되어있다) list는 벡터와 사용법이 유사하다. 다만, 뒤에서 삽입삭제가 가능한 벡터와는 달리, 앞에서도 연산이 가능하다. 노드기반이기 때문에 배열기반의 컨테이너에 비해 탐색이 불리하고, 삽입과 삭제에 유리하다 (시간적으로) list는 노드기반이기때문에 인덱스를 통한 임의접근이 불가능하다. 즉, list[3] 이런 접근이 불가능하다. 그러므로 이터레이터에 대해 +=과 같은 연산이 불가능하다. 임의 접근 반복자 배열 기반 컨테이너들이 가지는 반복자 ex) ++, --, [], +=, -= 2. 양방향 반복자 노드 기반 컨테이너들이 가지는 반복자 ex) ++, -- iter + 3 // 불가. 이..

    STL - iterator

    컨테이너마다 내부 구조가 다른데, 이 컨테이너들을 하나의 연산으로 묶어서 순회할 수 있게 하는 것이 반복자다. 반복자의 종류 임의 접근 반복자, 양방향 반복자, 순방향 반복자, 입력 반복자, 출력 반복자 1. 임의 접근 반복자 배열 기반 컨테이너들이 가지는 반복자 ex) ++, --, [], +=, -= 2. 양방향 반복자 노드 기반 컨테이너들이 가지는 반복자 ex) ++, -- 이해를 돕기 위해 필자가 직접 구현해본 이중연결리스트로 구현한 리스트를 보자. template class MyList { private: template struct NODE { T m_data; NODE* m_tNxt; NODE* m_tBfr; NODE() :m_tNxt(nullptr), m_tBfr(nullptr){} }; ..

    STL - vector

    동적배열로 구현된 컨테이너다. 뒤에서부터 삽입, 삭제가 가능하다. 앞쪽에서의 삽입, 삭제는 못한다. 따라서 뒤쪽이 열려있다고 할 수 있다. 중간 삽입 (insert) vector.insert(이터레이터 위치, 값); 이런식으로 사용한다. 이터레이터 위치는 iter.begin() + 3 처럼 쓴다. 즉, 4번째 원소이자 arr[3], iter_begin[3] 과 같은 의미 *주의사항 벡터는 동적배열이므로 그 크기가 바뀐다. 만약 이터레이터의 위치 값을 변수에 담아두고 사용했을때 vector::iterator iter_begin = vecInt.begin(); vector::iterator iter_end = vecInt.end(); begin과 end가 유효하지 않은 위치가 될 수 있다. 왜냐하면 이터레이..

    STL

    STL의 장점 1. 효율성 클래스 탬플릿이기 때문에 사용시 자료형에 따라 컨테이너가 맞춰지므로 간편하다. 2. 일반화 가능 각기 다른 삽입, 삭제, 탐색 알고리즘을 가진 컨테이너들을 이터레이터를 통해 한데 묶을 수 있다. 즉, 이터레이터를 통하면 각기 다른 컨테이너들을 일관된 연산을 통해 이용 할 수 있다. 3. 이식성 표준이기 때문에 대부분의 컴파일러가 호환한다. 4. 확장성 소스코드가 공개되어 있기 때문에 사용자가 커스터마이징 할 수 있다. STL의 단점 1. 클래스 탬플릿이기 때문에 코드가 비대해질 수 있다. 2. 내부 구현을 모르면 일반 배열에 비해 가독성이 떨어진다.

    탬플릿

    함수 탬플릿 인자로 들어오는 변수타입이나 지역변수타입, 리턴타입을 특정할 수 없을때, 혹은 특정하고 싶지 않을때 쓰인다. typename을 통해 타입을 추상적으로 지정하여 작성한 함수의 형틀이라고 볼 수 있다. (함수 템플릿은 어디까지나 함수를 만들기 위한 형틀에 지나지 않으며 그 자체가 함수인 것은 아니다.) (컴파일러는 함수 템플릿 정의문으로부터 앞으로 만들어질 함수의 모양만 기억하며 실제 함수가 호출될 때 타입에 맞는 함수를 작성한다.) 예를들어 더하기 연산을 하는 함수를 작성하고 싶은데 int, float, double등 모든 자료형에 대응하려면 각 자료형마다 함수를 작성해야한다. 만약 모든 자료형을 받는 함수를 만들면 이 불편함을 해결할 수 있을 것이다. 그 때 쓰이는 것이 함수 탬플릿이다. 하..