[내일배움캠프 Day34] push_back과 emplace_back의 차이점
·
내일배움캠프/TIL
push_back()과 emplace_back() 둘 다 벡터의 뒤쪽에 원소를 추가합니다. 그런데 실제로 구현된 복사/이동 방식은 크게 다르며, 성능에서도 차이가 납니다. push_back()vs.push_back(s)는 문자열을 벡터로 복사합니다. 먼저, char *로 초기화된 새 문자열 객체가 암시적으로 생성됩니다. 그 다음 push_back()이 호출되는데, push_back()은 이동 생성자를 이용해 임시 문자열을 벡터로 복사합니다. 작업이 다 끝나면 임시 객체를 없앱니다.   emplace_back()vs.emplace_back(s)는 임시 문자열을 생성하지 않습니다. emplace_back()이 char *를 인수로 하여 직접 호출합니다. 그런 다음 이 char *로 초기화된 벡터에 저장할 문..
[내일배움캠프 Day32] 가상 함수 동작 원리
·
내일배움캠프/TIL
C++의 가상 함수 동작 원리가상 함수는 'vtable', 혹은 가상 테이블(virtual table)에 의존한다. 어떤 클래스의 함수가 virtual로 선언되어 있으면, 해당 클래스의 가상 함수 주소를 보관하는 vtable이 만들어진다. 컴파일러는 또한 해당 클래스의 vtable을 가리키는 vptr이라는 숨겨진 변수(hidden variable)를 해당 클래스에 추가한다.하위클래스가 상위 클래스의 가상 함수를 오버라이드(override)하지 않으면 하위 클래스의 vtable은 상위 클래스의 가상 함수 주소를 보관한다. 이 vtable을 사용하여 가상 함수가 호출될 때 어느 주소에 있는 함수가 호출되어야 하는지를 결정한다. c++의 동적 바인딩(dynamic binding)은 이 가상 테이블 메커니즘을 ..
[내일배움캠프 Day31] 순차 컨테이너
·
내일배움캠프/TIL
순차 컨테이너(sequential container)는 원소들이 선형으로 배열된 데이터 구조를 나타냅니다. 컨테이너헤더설명array표준 C 언어 스타일 배열vector활용도가 높은 기본 컨테이너list연결 리스트(linked list)deque양방향 큐(queue) 배열(std::array)array는 고정된 크기의 배열을 담는 컨테이너입니다. 인덱스를 이용해 원소에 빠르게 접근할 수 있다는 장점이 있습니다. 배열 컨테이너 선언#include using namespace std;array 객체_이름; array 컨테이너를 초기화하는 방법은 일반 배열과 같습니다. 또한 일반 배열처럼 [] 연산자로 각 원소에 접근할 수 있습니다. 배열의 유효 범위 밖의 인덱스로 접근을 시도하면 런타임 오류가 발생합니다.ar..
[내일배움캠프 Day18] 인라인 함수(inline function)
·
내일배움캠프/TIL
평소 getter/setter 함수는 인라인 함수로 구현했었는데 과제를 진행하는 도중 인라인 함수로 써도 괜찮을지 의문이 들어 찾아보게 되었습니다. 먼저 포르잔 C++ 바이블 책에서 인라인 함수에 대해 잘 명시가 되어있어 관련 내용을 정리했습니다. 함수 본문이 너무 짧으면, 함수를 실행하는 시간(매개변수 저장, 제어 이동, 매개변수 추출, 리턴값 저장 등)이 함수 내부의 코드를 실행하는 시간보다 오래 걸릴 수 있습니다. 프로그램의 성능을 위해서 컴파일러가 함수 호출 부분을 실제 코드로 대체해버리게 만들고 싶을 때는 함수를 인라인 함수로 선언합니다. 물론 컴파일러가 이를 무시할 수도 있으며 인라인 함수는 필요한 곳에서 사용할 수 있습니다. 암묵적 인라인 함수클래스 정의 내부에 함수를 정의하면, 해당 함수는..
[내일배움캠프 Day17] C++ 빌드 과정
·
내일배움캠프/TIL
소스 코드 작성, 전처리, 컴파일, 어셈블, 링크, 실행 순으로 수행됩니다. 먼저, 사용자가 작성한 소스코드의 #으로 시작하는 전처리기 구문을 처리합니다. 그 다음 고수준의 언어를 어셈블리 언어로 번역하는 작업을 합니다. 어셈블 단계에서는 어셈블리 파일을 오브젝트 파일로 만들고 오브젝트 파일을 합치고, 링크 단계에서 라이브러리와 연결해 주고 실행 가능한 파일을 생성해줍니다.  전처리 → 컴파일러 → 어셈블러 → 링커 컴퓨터는 0과 1로만 이루어져있기 때문에 컴퓨터가 이해할 수 있도록 만들어 주어야 합니다. 이런 과정을 빌드라고 합니다.전처리(preprocessing) : 코드의 주석을 제거, 헤더 파일을 삽입하고, 메크로를 치환하는 기능을 한다.컴파일(Compilation) : 어셈블리 코드로 변환한다...
[내일배움캠프 Day15] 디자인 패턴 - 구조 패턴
·
내일배움캠프/TIL
이어서  '포르잔 C++ 바이블' 책에 있는 디자인 패턴 내용 중 구조 패턴에 대해 정리하였습니다.  1. 구조 패턴의 개요적절한 자료형이 없는 상태에서 문제를 해결해야 하는 경우, 이미 존재하는 인터페이스와 구현을 결합해서 새로운 자료형을 만들어 문제를 해결합니다. 구조 패턴은 이런 경우 사용하는 방법으로 상속과 구성을 결합해 사용하는 방법을 정리한 것입니다. 2. 브리지 패턴브리지 패턴은 새로운 인터페이스를 만들 때, 이전 구현을 변경하지 않고 간단하게 구현할 수 있게 해줍니다. 새로운 인터페이스가 기존의 인터페이스를 구성으로 포함하고, 새로운 인터페이스 내부의 함수에서 기존의 인터페이스가 갖는 함수를 호출하는 것입니다. 3. 어댑터 패턴기존의 어떤 클래스를 사용해야 하는데 인터페이스가 우리가 원하는..
[내일배움캠프 Day14] 디자인 패턴 - 생성 패턴
·
내일배움캠프/TIL
내일배움캠프 3-1 강의에서 디자인 패턴 내용을 간단하게 배워 '포르잔 C++ 바이블' 책에 있는 디자인 패턴 내용 중 생성 패턴에 대해 정리하였습니다.   생성 패턴(creational pattern) : 전통적인 방법으로 인스턴스화하면 안 되는 상황에서, 어떤 형태로 객체를 인스턴스화해야 하는지에 대한 방법 1. 생성 패턴 구조객체 지향 프로그래밍은 원래 위 그림처럼 객체의 설계와 생성을 분리하는 것이 목적입니다. 그런데 클래스를 설계자가 설계한대로 사용자가 사용하지 않는 경우가 많이 발생했습니다. 그래서 객체의 생성과 관련된 모든 책임을 클래스의 사용자에게 맡기는 것이 좋지 않다는 의견이 나왔습니다.설계자와 사용자 사이에서 발생할 수 있는 이러한 객체의 생성과 관련된 문제를 해결할 수 있도록 여러 ..
[내일배움캠프 Day13] C++ 2주차 과제 진행
·
내일배움캠프/TIL
[3번 과제] 템플릿 및 STLSimpleVector.h#pragma once#include #include template class SimpleVector {private: T* data; int currentSize; int currentCapacity;public: // 기본 생성자 SimpleVector() : currentSize(0), currentCapacity(10) { data = new T[currentCapacity]; } // 용량 지정 생성자 SimpleVector(int capacity) : currentSize(0), currentCapacity(capacity) { data = new T[currentCapacity]; } // 복사 생성자 SimpleVector(con..
[내일배움캠프 Day12] 반복자와 포인터
·
내일배움캠프/TIL
반복자에 대해 ' 포르잔 C++ 바이블' 책을 통해 기본적인 내용을 정리했습니다.https://dev0404.tistory.com/31 [C++] 반복자(iterator)1. 반복자 구조반복자(iterator)는 포인터를 추상화한 것입니다. 포인터는 C++이 제공하는 문법이므로 추가적인 제한을 걸거나 기능을 추가할 수 없지만 반복자라는 객체로 포인터를 추상화하면,dev0404.tistory.com추가로 ' 266가지 문제로 정복하는 코딩 인터뷰 in C++' 책의 반복자에 대한 내용을 정리하겠습니다. 예시는 제가 짠 코드로 틀린 내용이 있을 수도 있습니다.  반복자와 포인터의 유사점과 차이점을 설명하라해법 : 둘 다 값을 얻기 위해 역참조할 수 있다는 점에서 비슷하다. 차이점은 다음과 같다1. 포인터는 ..
[C++] 반복자(iterator)
·
C++
1. 반복자 구조반복자(iterator)는 포인터를 추상화한 것입니다. 포인터는 C++이 제공하는 문법이므로 추가적인 제한을 걸거나 기능을 추가할 수 없지만 반복자라는 객체로 포인터를 추상화하면, 추가적인 제한을 걸거나 기능을 추가할 수 있습니다.또한 반복자를 사용하면 컨테이너의 내부 구조를 사용자에게 숨기고, 사용만 하게 만들 수 있습니다. 대부분의 컨테이너는 내부적으로 조작할 수 없는 내부 반복자를 갖고 있습니다. 그리고 사용자는 외부 반복자를 사용해서 컨테이너 내부의 요소에 접근합니다. 내부 반복자는 외부 반복자를 처리할 때 사용됩니다. 2. 반복자 종류반복자는 입력 반복자, 출력 반복자, 전방 반복자, 양방향 반복자, 임의 접근 반복자로 구분합니다.입력 반복자입력 반복자(input iterator..