Cpp (35) 썸네일형 리스트형 가상 함수와 순수 가상 함수의 차이 가상 함수와 순수 가상 함수는 virtual 키워드를 이용해서 선언한다는 공통점이 있지만가상 함수는 파생 클래스가 기반 클래스의 가상 함수를 재정의 하지 않고 사용 할 수 있으며가상 함수는 기반 클래스에서 구현이 되어 있어야한다. 가상 함수가 포함된 클래스는 인스턴스를 생성할 수 있다. 순수 가상 함수는 파생 클래스가 기반 클래스의 순수 가상 함수를 무조건 재정의해야한다.순수 가상 함수는 기반 클래스에서 선언만 되어 구현되어 있지 않다. 순수 가상 함수가 1개 이상 포함된 클래스를 추상 클래스라고 하며 인스턴스를 생성 할 수 없다. 가상 함수의 목적은 파생 클래스에서 재정의하여 기반 클래스의 함수를 확장 및 변경 가능하게 한다.순수 가상 함수의 목적은 클래스를 추상 클래스로 만들며 순수 가상 함수로 선언.. C++에서의 메모리 관리 방식 C++ 에서는 사용자가 직접 메모리 관리가 가능하다. 기본적으로 new와 delete 키워드를 이용한다. new 를 통해 힙 메모리 영역에 데이터를 할당한다. int* ptr;ptr = new int;* 은 포인터로 주소를 담는 변수이다. 이 주소를 담는 변수는 스택에 저장된다. 그리고 변수의 값으로는 힙 메모리 영역의 주소가 담긴다.사용이 끝난 포인터는 delete 를 사용하여 해제한다.int* ptr = new int;delete ptr; 메모리 누수할당했던 메모리를 제대로 해제하지 않으면 발생한다. 시간이 지날수록 점차 메모리 사용량이 많아지며 문제 발견 및 해결이 쉽지 않다.프로파일러나 메모리 디버깅을 통해 메모리 누수를 확인 가능하다.참조 카운팅 기법을 통해 예방할 수 있다.스마트 포인터를 사.. 주소 바인딩 주소 바인딩이란?cpu가 프로세스가 포함하는 데이터를 참조하기 위해서는 프로세스가 가지는 논리주소를 물리주소로 변환 할 수 있어야한다. 이 논리주소와 물리주소를 연결시키는 것을 주소 바인딩이라고 한다. 주소 바인딩은 컴파일 타임 바인딩(Compile-time binding), 로드 타임 바인딩(Load-time binding), 런타임 바인딩(Runtime binding)으로 나뉜다. 1. 컴파일 타임 바인딩 컴파일 타임 바인딩은 데이터의 위치가 컴파일 타임에 결정되는 것을 의미한다. 정적인 주소 할당.물리적 메모리 위치를 변경하려면 다시 컴파일해야하는 단점이 있다. 2. 로드 타임 바인딩프로그램이 시작 될 때 데이터의 물리적 위치가 결정되는 바인딩.프로그램이 종료될 때까지 위치가 고정됩니다.이는 메모리.. 재귀 함수 자신을 호출하는 방식으로 동작하는 함수 문제를 더 작은 하위 문제로 분할하여 해결하는 분할 정복 알고리즘에 사용된다. 자기 자신을 호출하기 때문에 특정 상황에서의 종료 조건과 재귀 조건을 가져야한다. 재귀함수의 장점 코드를 간결하게 만든다. 문제를 세분화하여 접근 가능하다. 재귀함수 단점 재귀함수가 호출될 때 마다 스택에 메모리가 할당되어 메모리를 많이 차지할 수 있다. 함수의 호출에 따른 메모리 접근에 의해 오버헤드 비용이 반복문에 비해 더 크다. 재귀 함수를 막 사용하면 함수의 논리 이해가 어려워 질 수 있다. 재귀 함수의 성능 향상을 위한 최적화 종료 및 진입 조건을 설정하여 재귀 호출의 횟수를 조절한다. 재귀 함수 구문의 마지막 부분에서 재귀 호출하여, 스텍 프레임을 재사용하는 방식 메모이제이션 .. 래퍼 함수 래핑 기능을 가지는 함수이다. 기존 함수를 감싸서 몇 가지 기능 및 환경을 변경/추가 한다. 특 징 1. 래퍼 함수를 사용하면 기존 함수를 포함하여 추가적인 행동을 가능하게 만들수있다. 2. 래퍼 함수를 사용하면 기존 함수의 호출 방식을 변경할 수 있다. 3. 래퍼 함수를 사용하면 기존 함수를 호출하던 위치에서 호출 시점을 변경할 수 있다. push_back, emplace_back push_back 은 생성된 객체를 넣고, emplace_back 은 정보를 받아 함수 내에서 객체를 생성하여 넣는다. push_back 은 이동 생성자를 호출하고 emplace_back은 호출하지 않는다. emplace_back 을 사용하면 불필요한 객체 생성을 줄일 수 있는 장점이 있지만, 정보만 넣는 특성상 과정이 생략되어져 의도치 않은 결과를 가져올 수 있다. 이러한 결과들은 컴파일러가 잡아주지 않기 때문에 위험하다. 객체를 이동하는 비용이 커질 경우에는 emplace_back 을 사용하여 이동 생성자 호출을 막는 것이 좋다. 실수 및 확실히 알아보기 힘든 코드의 경우에는 push_back 을 사용하여 에러를 방지하는 것이 좋다. move move 는 rvalue 캐스팅해주는 함수이다. 객체를 인자로 전달하면 rvalue 로 캐스팅 해준다. std::vector v; std::string str = "aaa"; v.push_back(std::move(str)); str.clear(); 위와 같은 상황에서 str 은 move 에 의해 rvalue 로 캐스팅되어진다. v 에 push 되는 객체는 str 이 가리키는 메모리를 받고 str 은 nullptr 이 할당된다. 따라서 str 은 요소와 관련한 함수를 호출 할 수 없지만 clear 할 수 있다. 복사와 이동 차이 복사의 경우 복사가 되어질 근본 변수가 유지된다. 이동의 경우 근본 변수가 사용되어지지 않는다는 가정이 있을 경우 사용되며 이동 후 nullptr 된다. 이동은 기존 변수의 소유.. 클래스의 기본 메소드 6가지 정리 1. 기본 생성자 2. 기본 소멸자 3. 복사 생성자 4. 복사 대입 연산자 5. 이동 생성자 6. 이동 대입 연산자 1. 기본 생성자 객체 생성 시 사용자가 초깃값을 명시하지 않았을 때, 컴파일러가 자동으로 제공하는 생성자. 특정 경우에 자동으로 삭제된다. 1. & 혹은 const 멤버변수가 있을 때 2. 기반 클래스의 기본 생성자가 삭제 됐을 때 3. 기반 클래스가 기본 소멸자가 삭제 됐을 때 4. 멤버 변수의 기본 생성자가 삭제 됐을 때 2. 기본 소멸자 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되는 함수. const, volatile, static 으로 선언되 수 없다. 생성자는 여러개 가질 수 있지만 소멸자는 하나만 가질 수 있다. 인자를 가지지 않는다. 특정 경우에 삭제된다. 1. s.. 이전 1 2 3 4 5 다음