본문 바로가기
반응형

프로그래밍 언어170

[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.
[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.
[C++] 인터페이스(Interface) 추상 클래스 vs 인터페이스• 인터페이스: 지켜야 하는 규칙(순수 가상함수)만 가진 것• 추상클래스: 지켜야 하는 규칙 + 다른 멤버도 있는 경우 Java 등 대부분의 객체 지향 언어는 abstract, interface 별도 키워드 제공하지만 C++ 에서는 추상 클래스 문법만 존재[예제]사람들은(People)은 일반 카메라를 사용#include class People{public: void UseCamera(Camera* p) { p->Take(); }};class Camera{public: void Take() { std::cout [예제] 카메라 종류가 다양해지면 기존 UseCamera(Camera* p) 로는 모든 카메라를 담을 수 없다.#include class People{publi.. 2025. 3. 2.
[C++] object Slicing object Slicing Q) vector에 파생 클래스를 담으면 어떻게 될까?#include #include using namespace std;class Shape{ int num;public: virtual void draw() { cout v; Shape s; v.push_back(s); Rect d1; v.push_back(d1); Rect d2; v.push_back(d2); for (auto i : v) { i.draw(); // ??? }} 파생 클래스 Rect 담아주었지만 Shape draw()가 호출되었다. 이는 vector에서 Shape 타입만 보관하고 있다. Q) vector와 vector 무슨 차이가 있을까?#inc.. 2025. 3. 1.
반응형