본문 바로가기
반응형

개발/C, C++67

인터페이스 vs 추상 클래스 (Java, C++ 비교) C, C++ 전체 링크 인터페이스 vs 추상 클래스 (Java) 인터페이스 - 객체의 사용 방법을 정의한다. - 함수의 구현을 강제한다. - class 대신 interface 키워드 사용. - 상수와 메서드만을 가진다. 추상 클래스 - 상속을 위해 사용한다. - 추상 메서드를 가진다. - abstract 키워드 사용, new를 통해 객체 생성 불가. - abstract 메서드는 자식 클래스에서 반드시 구현해야 한다. (오버라이딩) 인터페이스와 추상 클래스 예시 청둥 오리와 모형 오리는 오리(Duck)을 상속한다. 이때 Duck은 추상 클래스다. 청둥 오리(Mallard)는 날 수 있다. 그러나 모형 오리(Model)는 날 수 없다. 따라서 fly()라는 행동은 FlyBehavior 인터페이스로 표현하고 .. 2022. 2. 5.
C++ - 순수 가상 클래스 (Pure Virtual Class) C, C++ 전체 링크 순수 가상 클래스는 순수 가상 함수를 가지는 클래스다. 순수 가상 함수는 virtual로 선언하고 끝에 = 0;이라고 표시한 함수다. 즉, 선언만 해두고 정의는 자식 클래스에 강요한다. 아래는 FOOD의 순수 가상 클래스다. #include #include using namespace std; class FOOD { public: FOOD() { cout 2021. 11. 10.
C++ - 가상 함수 테이블 (Virtual Function Table) C, C++ 전체 링크 virtual이 선언된 클래스가 있는 경우, 가상 함수 테이블은 rdata 섹션에 생성된다. 가상 함수 테이블(vtable)은 함수 포인터 배열이며, 이 포인터를 따라가면 가상 함수로 선언된 멤버 함수들의 주소에 배열 형태로 접근할 수 있다. 즉, 가상 함수 테이블이 실제 호출되어야 할 함수의 위치를 저장하고 있다. 가상 함수 테이블을 확인하기 위해 아래의 코드를 실행해보자. #include #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { cout 2021. 11. 7.
C++ - 이동 생성자 (move constructor) C, C++ 전체 링크 함수가 클래스를 return할 때, 임시 객체가 생성되고 불필요하게 깊은 복사(deep copy)가 일어나게 된다. 임시 객체는 대부분 생성 직후에 소멸하기 때문에 내부 연산이 최소화하도록 코드를 최대한 줄여야 한다. 주로 함수의 return이 클래스인 경우에 대응해야 한다. 이러한 비용을 r-value를 이용해 생성자를 만들어 얕은 복사(shallow copy)로 해결할 수 있다. FOOD class에 아래와 같이 이동 생성자를 추가한다. class FOOD { private: int price = 0; public: ... FOOD(FOOD&& food) : price(food.price) { printf("FOOD move constructor, price : %d\n", p.. 2021. 10. 29.
C++ - 임시 객체 (temporary object) C, C++ 전체 링크 FOOD 클래스를 반환하는 함수에 대해 아래의 결과를 보자. #include #include #include using namespace std; class FOOD { private: int price = 0; public: FOOD(int p) : price(p) { printf("FOOD created, price : %d\n", price); } ~FOOD() { printf("FOOD deleted, price : %d\n", price); } FOOD(const FOOD& food) /* 복사 생성자 */ :price(food.price) { printf("FOOD copy, price : %d\n", price); } FOOD& operator=(const FOOD& .. 2021. 10. 27.
C++ - 우측값 참조 r-value reference (기본 자료형) C, C++ 전체 링크 C++11 부터 r-value에 대한 참조가 가능하다. r-value는 &&가 붙게 된다. r-value 참조를 이용하면 아래와 같은 경우에 대한 모호성을 해결할 수 있다. #include #include using namespace std; void overloadingTest01(int value) { cout 2021. 10. 25.
C++ 스마트 포인터 : unique_ptr C, C++ 전체 링크 참고 - 전략 패턴 (Strategy Pattern) unique_ptr는 하나의 포인터만 허용하도록 하는 스마트 포인터다. unique_ptr는 해당 자원에 대한 유일한 소유권을 가지는 특징 덕분에 메모리 누수를 방지하고 자원 관리를 간편하게 해준다. (RAII, Resource Acquisition Is Initialization 객체가 소멸될 때, 자동으로 해당 메모리가 해제된다.) unique_ptr는 얕은 복사가 발생할 가능성을 사전에 차단한다. 즉, 오직 하나의 포인터만 존재할 수 있도록 한다. 여러 포인터가 동시에 하나를 가르킬 수 없도록 막는다. 따라서 아래의 myFood를 선언한 후, unqFood가 myFood를 가르키게 하는 것은 모두 컴파일 에러다. uniqu.. 2021. 10. 16.
C++ 스마트 포인터 : weak_ptr C, C++ 전체 링크 shared_ptr처럼 가리키는 대상에 참조 형식으로 포인팅하지만, counter에 영향을 주지 않는다. 그리고 weak_ptr이 소멸하더라도 대상 객체를 삭제하지 않는다. shared_ptr을 사용해야하지만 counter는 하지 않을 때 필요하다. FOOD 클래스에 어울리는 음식을 set하는 기능이 추가되었다고 하자. setWithFood는 shared_ptr의 객체를 받아 withFood에 설정한다. #include #include // shared_ptr, weak_ptr header #include using namespace std; class FOOD { private: int price = 0; shared_ptr withFood; public: FOOD() { pri.. 2021. 10. 14.
C++ 스마트 포인터 : shared_ptr C, C++ 전체 링크 shared_ptr은 포인팅 횟수를 계산해서 0이 되면 객체를 소멸하는 스마트 포인터이다. 아래 코드의 결과를 확인해보자. #include #include // shared_ptr header #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { printf("FOOD created\n"); } ~FOOD() { printf("FOOD deleted\n"); } virtual void printName() { cout 2021. 10. 12.
반응형