개발자 면접 공부/C-C++ 49

(C++) 이동생성자(Move Constructor)

이동 생성자(Move Constructor)에 대해 공부하겠습니다. 이동생성자(Move Constructor) 이동 생성자는 객체가 살아있지만 안 쓴다고 보장할 수 있는 상황일 때 사용하게 되는 코드입니다. 기존 객체의 주소 및 Value값을 새로운 오브젝트에 소유권을 이전하게 하는 생성자로, 기존 객체의 값이 이전됩니다. 내부적인 구조로 봤을 때 Test b = static(a) 또는 Test b = move(a)는 새롭게 메모리를 복사할 필요 없이 이전에 잡은 메모리를 가르키기만 하면 되는데 굳이 새롭게 메모리를 잡고 그 메모리에 이전 데이터를 복사해서 저장함 그렇기 때문에 이동 생성자가 있고 이동 생성자를 통해 객체를 생성하면 이전에 Heap에 있던 메모리를 새로운 객체가 가리키게 되고 이전에 생성..

(C,C++) L-Value, R-Value

오늘은 L-Value, R-Value에 대해 공부하겠습니다. L-Value https://docs.microsoft.com/ko-kr/cpp/c-language/l-value-and-r-value-expressions?view=msvc-170 L-Value 및 R-Value 식 자세한 정보: L-Value 및 R-Value 식 docs.microsoft.com 마이크로소프트의 공식 문서를 보면 L-Value는 메모리 위치를 참조하는 식을 의미한다고 합니다. 왜 L이 되었는가 하면 메모리 주소를 참조한다는 뜻에서 Location의 앞글자, 또는 주로 코드에서 = 을 기준으로 왼쪽에 위치한다고 해서 Left Value라 해 L Value가 되었다는것 같습니다. 그리고 주로 L Value가 변수, 함수, 클래..

C++ 스마트 포인터(Unique, Shared, Weak)

오늘은 스마트 포인터에 대해 공부해보겠습니다. 스마트 포인터 란? 자바, C# 등은 가비지 컬렉터(Garbage Collector) 라는 기능을 통해 메모리를 관리합니다. 하지만 C++는 사용자가 스스로 메모리를 할당 해제를 통해 관리를 해줘야합니다. C에서는 malloc free C++에서는 new delete를 통해서 말이지요 하지만 사용자의 실수로 인해 메모리를 해제를 안할경우 프로그램은 계속 메모리를 사용하는걸로 인지하기 떄문에 해당 메모리를 정확히는 메모리 한칸을 차지하면서 사용을 안하고있는 상태가 됩니다. 이는 즉시 메모리 누수(memory leak)이 발생합니다. 이를 방지 하기위해 스마트 포인터라는것을 제공해주며 스마트 포인터는 포인터 처럼 사용하는 클래스 템플릿 입니다. 메모리를 자동으로..

C++ 캐스팅의 종류

C++ 에는 4가지의 캐스팅이 있습니다. 그 캐스팅을 공부해봅시다. 캐스팅은 자료형간 또는 포인터간 형변환시 사용됩니다. 캐스팅은 크게 묵시적 캐스팅와 명시적 캐스팅 두 가지로 나눌 수 있습니다. 특별히 캐스팅 연산자를 사용하지 않고 이루어지는 경우를 묵시적 캐스팅이라고 합니다. static_cast static_cast 의 특성은 묵시적 캐스팅와 일치적으로 같다고 보면 됩니다. 묵시적 캐스팅에는 컴파일 시점에서 무결성 검사를 하는데 이떄 허용 과 컴파일러에 의한 값 변환 이라는 두 가지 관점에서 이루어 집니다. 컴파일 타임에서 제약사항은 에러를 발생시킵니다. static_cast는 형변환에 대한 타입체크를 run time 에 하지않고 compile 타임에 정적으로 수행합니다. #include using..

C++ RTTI 에 대해

오늘은 RTTI에 대해 공부하겠습니다. RTTI란? Run Time Type Information의 약자로 프로그램 실행 중에 개체의 형식이 결정될 수 있도록 하는 매커니즘입니다. 다시 말해 실행중 포인터가 가르키는 객체의 타입을 알 수 있게 해주는 하나의 방법입니다. 기본적으로 RTTI가 필요한 이유는 A 타입에서 B 타입으로 변경할때 정보가 필요합니다. 컴파일시간에 타입 변환이 이루어진다면 굳이 RTTI가 필요 없습니다 하지만 컴파일 단계에서 충분히 알 수 있고 특정 타입으로 확정할 수 있기 때문입니다.(런타임 중에 타입 변환이 이루어질 경우) virtual 클래스로부터 상속이 하나라도 존재하면 RTTI를 사용하고 있습니다. dynamic_cast 또한 RTTI에 매우 의존적입니다. 초기단계 분석에서..

C++ 순수 가상 함수(추상 클래스)

순수 가상 함수에 대해 공부합시다. 순수 가상함수란? - 함수의 정의는 없으며 오직 다형성 파생 클래스에 오버라이드(override)만으로 적용되는 함수입니다. virtual void Open() = 0; 요런 형태가 됩니다. 이렇게 선언된 순수 가상 함수가 있는 클래스는 보통 추상 클래스(abstract class) 라고 부릅니다. 이러한 추상클래스에 특징은 절대로 자기 혼자 객체화를 시킬수가 없습니다. 왜 이러한 추상 클래스를 사용을 하는가에는 ex) 예를들어 자동차가 있으면 그 자동차에도 스포츠 자동차가 있고 일반차가 있으면 차에 문을 위로 올리는 차 아래로 올리는 차로 나눌수 있습니다. 또한 추상클래스를 상속받는 클래스들은 순수가상함수를 반드시 재정의를 해줘야하기때문에 강제성도 보장합니다. 이를 ..

C++ Virtual(가상) 함수

오늘은 Virtual 함수 가상 함수에 대해 공부하도록 하겠습니다. 가상 함수란? - 기본 클래스 내에서 선언되는 파생 클래스에 의해 재정의되는 맴버함수 가상 함수를 호출하고 파생 클래스의 함수를 실행할 수 있습니다. 주로 실행시간에 함수의 다형성을 구현하는데 사용됩니다. 가상 함수는 기본 클래스내에 Virtual 키워드로 함수를 선언합니다. 가상 함수 선언에는 몇가지 규칙이 존재합니다. 1. 클래스의 공개(public) 섹션에 선언합니다. 2. 가상 함수는 정적(static)일 수 없으며 다른 클래스의 친구(friend) 함수가 될 수도 없습니다. 3. 가상 함수는 실행시간 다형성을 얻기위해 기본 클래스의 포인터 또는 참조를 통해 접근(access)해야 합니다. 4. 가상 함수의 프로토타입(반환형과 매..

C++ 포인터(Pointer) 레퍼런스(Reference) 차이

포인터와 레퍼런스에 차이 시작 포인터(Pointer)와 레퍼런스(Reference)는 보면 둘다 참조를 하는 변수임은 똑같다고 생각을 하였다. 하지만 이 둘도 엄연히 차이점이 존재하였다. 그 차이점을 알아보자. 1.NULL의 허용 여부 일단 NULL을 허용하냐 안하냐에서 차이점이 난다. 포인터는 NULL 즉 nullptr도 허용이 되지만 레퍼런스 만큼은 허용이 되지않습니다. 포인터는 즉 NULL을 가르키거나 초기화 하지 않을경우 Null pointer exception 또는 Segmentation Fault 에러를 난다. 따라서 포인터는 반드시 Null Check 를 해줘 코드를 처리를 해줘야 에러를 방지할수 있습니다. Student S = new Student(); if(S!=nullptr) { S->..

댕글링 포인터(Dangling Pointer)

댕글링 포인터 댕글링 포인터란? - 포인터가 여전히 해제된 메모리 영역을 가리키고 있다면, 이러한 포인터를 댕글링 포인터(Dangling Pointer)라고 한다. 댕글링 포인터가 가르키는 메모리는 더는 유효하지 않다. 댕글링 포인터는 Premature Free(조숙한 해제, 너무 급한 해제) 라고 부르기도 한다. 댕글링 포인터의 사용은 아래 목록에 나열된 문제를 포함한 다양한 문제가 있다. -메모리 접근시 예측이 불가능한 동작 -메모리 접근 불가 시 Segmentation Fault -잠재적인 보안 위험 이런 문제는 다음과 같이 동작을 할경우 발생한다. -메모리 해제 후, 해제된 메모리에 접근 -함수 호출에서 자동 변수를 가리키는 포인터의 반환 - 댕글링 포인터의 코드 - #include using n..