목록Programming (115)
Nagie's DevStory
우리는 지금까지 C++에서 제공하는 데이터의 타입으로 연산을 해왔다. 그러나 C++에서 기본 제공하는 연산자로는 객체 간 연산이 불가능했고 이를 해결하기 위해 연산자 오버로딩이라는 개념이 등장하게 된다. 즉 "내가 만든 객체의 연산 방법은 내가 정하겠다!"라는 의미라고 생각하면 이해가 빠르겠다. 다음은 연산자 오버로딩의 기본적인 사용법이다. 반환형식 operator 연산자명(매개변수) { // 연산자 동작을 정의하는 코드 } 여기서 "반환 형식"은 연산자의 결과 형식을 나타내며 "연산자명"은 오버 로딩하려는 연산자를 나타내고 "매개변수"는 연산자에 필요한 피연산자를 나타낸다. 예를 들어 덧셈 연산자(+)를 사용자 정의 클래스에 대해 오버 로딩을 한다면 다음과 같은 코드로 작성할 수 있겠다. class C..
앞서 함수 템플릿에 대해 글을 작성한 적이 있지만 모든 템플릿 문법을 설명한 게 아니라 추가적인 포스팅을 하게 됐다. C++에서 사용하는 템플릿 문법은 총 3가지가 있으며 가장 많이 사용하는 문법은 함수 템플릿과 클래스 템플릿이다. C++14부터 추가된 변수 템플릿이라는 문법도 있긴 하지만 많이 사용하는 걸 못봤다. 그럼, 함수 템플릿부터 설명하겠다. 1. 함수 템플릿 (Function Template) 함수 템플릿은 함수의 틀을 만드는 데 사용된다. 템플릿을 사용하면 다양한 데이터 형식에 대해 동일한 함수 로직을 사용할 수 있으며 함수 템플릿은 일반 함수처럼 정의되지만 데이터 형식을 템플릿 파라미터로 사용한다. 다음은 함수 템플릿의 사용 예시이다. template T add(T a, T b) { ret..
다중 상속은 클래스가 두 개 이상의 부모 클래스에서 특성( 데이터 멤버, 멤버 함수)을 상속할 수 있게 한다. 이에 따라 파생 클래스는 여러 부모 클래스의 데이터 멤버와 멤버 함수를 모두 가질 수 있으며 서로 관련 있는 클래스에서 특성을 상속 하거나 클래스 계층 구조에서 여러 부모 클래스로 부터 상속받아 새로운 클래스를 만들 때 또는 다형성을 활용하여 다양한 부모 클래스에서 파생한 객체를 다룰 때 사용한다. 다만 주의할 점이 있는데 다중 상속을 사용할 때는 상속 충돌 문제가 발생할 수 있다. 이걸 죽음의 다이아몬드 문제라고 부르며 하나의 클래스가 둘 이상의 경로를 통해 같은 기본 클래스를 상속할 때 발생한다. C++에서는 가상 상속(virtual inheritance)을 사용해 이 문제를 해결하지만 코드..
간혹 클래스를 설계하다 보면 추상 클래스로 만들고 싶어도 멤버 함수에 순수 가상함수를 쥐어줄 수 없는 경우가 존재하기도 한다. 그때 사용하는 것이 순수 가상 소멸자인데 소멸자를 순수 가상함수로 만드는 것으로 멤버 함수 중 순수 가상함수가 없어도 해당 클래스가 인스턴스를 생성할 수 없는 추상 클래스로 변한다. 다만 순수 가상 소멸자를 선언했다면 클래스 내부에서 가상 소멸자를 또 선언할 수 없기에 클래스 밖에서 정의를 해줘야 한다. class AbstractBase { public: virtual ~AbstractBase() = 0; // 순수 가상 소멸자 }; AbstractBase::~AbstractBase() { // 순수 가상 소멸자의 기본 구현 } class Derived : public Abstr..
순수 가상함수(Pure Virtual Function)는 함수 본문이 없고 ;(세미콜론)으로 끝나며 앞에는 'virtual' 키워드가 붙고 뒤에는 '= 0'으로 표시되며 아래의 코드처럼 작성할 수 있다. class AbstractClass { public: virtual void pureVirtualFunction() = 0; // 순수 가상 함수 }; 추상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스를 말하며 아래는 추상 클래스의 예시다. class AbstractShape { public: virtual void draw() = 0; // 순수 가상 함수 virtual double area() const = 0; // 순수 가상 함수 }; class Circle : public Abstra..