반응형 전체 글1339 [C++] 스마트 포인터(Smart Pointer) 원리 스마트 포인터(Smart Pointer)란?다른 타입의 포인터 역할을 하는 "객체"#include class Harbang{ int color;public: ~Harbang() { printf("~Harbang"); } void foo() { std::printf("foo"); }};class Ptr{ Harbang* obj;public: explicit Ptr(Harbang* p = nullptr) : obj{ p } {} ~Ptr() { delete obj; } Harbang* operator->() { return obj; } Harbang& operator*() { return *obj; } // 임시 객체 생성 막기 위해 Reference 반환};int main(){ Ptr p(new Harba.. 2025. 3. 12. [C++] 변환 연산자 conversion operator 변환 연산자란 (conversion operator)• 사용자 정의 타입을 다른 타입으로 변환할 때 사용하는 멤버 함수• 반환 타입 명시 X• primitive 타입과의 호환성 유지 [예제] 변환 연산자 필요성#include class Tcp{ bool state = false;public: void connect() { state = true; } bool isConnect() { return state; }};int main(){ Tcp tcp; tcp.connect(); if ( tcp.isConnect() ) { printf("접속 완료"); }} Q) 객체 유효성을 if 문으로 조사하려면? A) 객체가 bool 타입으로 변환되어야 한다. → 변환 연산자 (= 객체가 다른 타입으로 변.. 2025. 3. 11. [C++] 다이아몬드 다중상속 [예시] 다이아몬드 다중 상속#include #include class File{public: std::string filename; void open() {}};class InputFile : public File{public: void read() {}};class OutputFile : public File{public: void write() {}};class IOFile : public InputFile, public OutputFile{public:};int main(){ IOFile file; file.open(); // error} 상속 형태 [IOFile] → [InputFile], [OutputFile] → [File] 만약에 IOFile file 에서는.. 2025. 3. 10. [C++] ADL (Argument Dependent Lookup) ADL (Argument Dependent Lookup)• 함수 검색할 때 인자가 포함된 namespace는 자동으로 검색에 포함! • Koening Lookup 라고도 부름#include namespace Harbang{ class Point {}; void draw(const Point& p) { printf("draw..\n"); }}int main(){ Harbang::Point pt; Harbang::draw(pt); // ok draw(pt); // ?? -> ok (ADL)}Harbang Namespace 없이도 draw() 호출 가능 이는 ADL로 Point가 포함된 namespace 검색하였기 때문. Q) namespace 명시하게 하면 분명하고 좋은데 굳이 ADL 기능이 있는 이유는?.. 2025. 3. 9. [Git] .gitkeep 파일이란? .gitkeep 파일Git에서 빈 디렉터리를 유지하기 위해 사용하는 "관습적인 파일" 🔹 왜 필요한가? Git은 기본적으로 빈 폴더를 추적하지 않는다. 따라서 빈 폴더를 저장소에 포함시키고 싶다면 그 안에 최소한 하나의 파일이 있어야 한다. 프로젝트 초기에는 추적하고 있는 파일이 없을 수 있기에 폴더 구조를 유지하기 위해 「.gitkeep」파일을 활용할 수 있다. $ touch {디렉토리_이름}/.gitkeep $ git add .$ git commit -m "Add .gitkeep" 📌 [Git] .gitignore 설정 [Git] .gitignore 설정.gitignore 설정 git은 변경점을 추적을 추적하는데, 특정 파일들을 무시(ignore)하여 추적하지 않게 할 수 있다. ▶ Log 파.. 2025. 3. 8. [C++] 대입 연산자 재정의 (Assignment Operator) 대입 연산자• 사용자가 만들지 않으면 컴파일러가 기본 구현 제공 (모든 멤버 복사)• 멤버 함수로만 만들 수 있다. [예제] 복사 생성자: 객체 생성할 때 초기화 하는 것 대입 연산자: 객체를 생성 후에 값을 넣는 것class Point{public: int x = 0; int y = 0; Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1 { 1, 1 }; Point p2; Point p3 = p1; // 복사 생성자 p2 = p1; // 대입 연산자 p2.operator=(p1)}[예제] 대입 연산자#include class Point{public: int x{ 0 }; int y{ 0 }; Point() =.. 2025. 3. 7. [C++] 가상함수 테이블 가상 함수 테이블(vtable) 개념가상함수는 실행시간에 어떻게 타입을 조사할까? 실행시간에 해당 함수 호출하려면 함수 주소를 알아야 한다. C++ 컴파일러는 가상 함수 테이블(vtable) 을 생성하여 런타임에 올바른 함수를 찾는다. ** 가상함수 원리는 컴파일러 종류와 버전에 따라 다를 수 있다.#include using namespace std;class Base{ int d;public: virtual void f1() {} virtual void f2() {} virtual void f3() {}};class Derived : public Base{ int d;public: virtual void f2() override {}};int main(){ Base.. 2025. 3. 6. [C++] 연산자 재정의 (Operator Overloading) 연산자 재정의 (Operator Overloading)사용자 정의 타입에서 +, - 등 연산자 사용할 수 있는 문법class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Point p2{ 2, 2 }; Point p3 = p1 + p2; // ?? -> error}「 a + b 」 → a, b 중 「operator+」 라는 함수 호출 찾을 수 없는 경우 Error→ 「 operator+(a, b) 」 or 「 a.operator+(b) 」 「 operator+(a, b) 」 함수 인자 2개로 멤버가 아닌 함수로 구현 「 .. 2025. 3. 5. [C++] 다중 상속 (multiple inheritance) 다중 상속 (multiple inheritance)• 클래스 2개 이상의 기반 클래스 상속 하는 것• Java, C# 에서는 지원하지 않지만 C++에서는 다중 상속 지원 [예제] 다중상속class InputFile{public: void read() {}};class OutputFile{public: void write() {}};// 다중 상속class IOFile : public InputFile, public OutputFile{};int main(){ IOFile file; file.write(); file.read();} 주의사항• 서로 다른 기반 클래스에 동일 이름 멤버 있으면 충돌 주의 • Disamond 형태 상속class InputFile{public: .. 2025. 3. 4. [C++] dynamic_cast dynamic_cast• 실행시간 캐스팅 (overhead 有)• 실제 가리키는 곳 조사해서 잘못되지 않는 경우 주소 반환 → 잘못된 경우 「0」 반환• porymorphic type 에 대해서만 사용 가능 → 가상함수 없는 경우 컴파일 에러 [예제] downcastingclass Animal{public: virtual ~Animal() {}};class Dog : public Animal {};int main(){ Animal* p = new Dog; // error (암시적 형변환) Dog* pd1 = pa; // ok (명시적 형변환) Dog* pd2 = static_cast(pa);}downcasting• 기반 클래스 포인터 타입을 파생 클래스 포인터 타입으로 캐스팅 • 암시적 변환 될 수 .. 2025. 3. 3. 이전 1 2 3 4 5 ··· 134 다음 반응형