본문 바로가기

C++

Garbage Collection (가비지 컬렉션) 가비지 컬렉션Garbage Collection이란, 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭 혹은 개체를 찾아 자동적으로 다시 사용 가능한 자원으로 회수하는 것을 말한다. 시스템에서 가비지 컬렉션을 수행하는 부분을 가비지 컬렉터Garbage Collector라고 하며, 최초의 가비지 컬렉터는 1958년에 존 매카시(John McCarthy)에 의해 리습(Lisp) 언어의 일부로 구현되었다. 일반적인 가비지 컬렉터 알고리즘(Algorithm)은 다음과 같이 동작한다. 1. 더 이상 프로그램에서 사용하지 않을 Object를 찾아낸다. 2. 해당 개체가 사용하는 리소스를 회수한다. 그러나 실제로 어떤 Object가 마지막으로 사용되었고, 따라서 더 이상 사용되지 않을 것이란 사실을 알아내기는.. 더보기
항목 10. 대입 연산자는 *this의 참조자를 반환하게 하자. Effective C++의 이번 항목 내용은 관례(Convention)에 대한 이야기 입니다. C++의 대입연산은 여러 개가 사슬처럼 엮일 수 있는 성질을 갖고 있습니다. 아래와 같이 말입니다. int x,y,z; x = y = z = 15; 대입 연산이 가진 또 하나의 재미있는 특성은 바로 우측 연관(Right-associative) 연산이라는 점입니다. 즉, 위의 대입 연산 사슬은 다음과 같이 분석이 됩니다. x = (y = (z = 15))); 위 소스코드를 보면, 15가 z에 대입되고, 그 대입 연산의 결과가 y에 대입된후에, y에 대한 대입 연산의 결과가 x에 대입이 됩니다. 이렇게 대입 연산이 사슬처럼 엮일려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있기 때문일 것입니다... 더보기
Doxygen, C/C++외의 코드 문서화 도구 Doxygen은 주어진 소스 코드를 분석하고 소스 코드에 있는 특정한 형식의 주석을 이용해서 소스 코드를 자동으로 문서화해주는 프로그램이다. 결과는 일련의 HTML 페이지들이구, LATEX나 PDF 문서들을 만들어낼 수도 있다. 일단 Doxygen을 설치 하기 전에 아래와 같이 해당 문서에그래프 다이어그램도 만들기 위해서는 Graphviz의 Graph Visualization Software를 설치할 필요가 있다. graphviz-2.26.3 다운 받으러 가기 이 사이트에 접을 하면 위와 같이 첫 화면에서 current stable release 부분에서 다운을 받을 수 있다. graphviz-2.26.3.msi 이라는 파일 이름으로 다운이 받아졌을 것이다. 다운 받고 아무 폴더에 깔아 주기만 하면 된다.. 더보기
[C++] 함수 템플릿? 템플릿 함수? 템플릿의 동작원리는 함수 오버로딩(Function Overloading)과 유사한 형태로 구성이 된다. 다음 템플릿화된 소스코드를 보자. #include using namespace std; template T Add(T a, T b) { return a+b; } void main() { cout 더보기
[C++] 연산자 오버로딩 - 교환법칙의 성립과 임시객체(Temporary Object) 교환 법칙? 3 + 2 라는 연산이 있다. 여기에서 피연산자 위치를 다르게 바꿔도 ( 2 + 3 ) 동일한 결과를 가져오게 하는 법칙이 바로 교환법칙이다. 우리는 연산자 오버로딩을 사용함에 있어서 이렇게 교환법칙도 성립할 수 있게 만들어야 한다. 아래의 연산자 오버로딩을 보자. #include using namespace std; class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point operator+(int val); //operator+라는 이름의 함수 }; void Point::ShowPosition() { cout 더보기
[C++] 연산자 오버로딩 (Operator Overloading)의 두가지 방법 연산자 오버로딩(Operator Overloading)은 C++ 문법과 우리와의 약속이라고 할 수 있는데, 우리가 함수를 정의하는데 이어서 operator라는 키워드와 연산자를 붙여서 함수의 이름을 만들 경우에 (operator + 이렇게 ) 우리가 일반적인 함수를 호출 방법 말고도, 연산자만을 이용해서도 함수가 호출 되도록 해주겠다는 이야기이다. 멤버 함수에 의한 오버로딩 #include using namespace std; class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point operator+(const Point& p); }; void Point::ShowPo.. 더보기
가상 함수 동작 원리와 단점 동작 원리 : 가상함수는 어떻게 동작을 할까? 객체가 생성되면 멤버 함수는 메모리의 코드영역에 올라가게 된다. 우리가 생성한 객체는 코드 영역에 있는 이 멤버함수를 공유하게 것이죠. 하지만 클래스에 한개 이상의 가상 함수가 있을 경우에는 컴파일러는 실제 호출되어야 할 함수의 위치 정보를 가지고 있는 가상 함수 테이블(Vritual Table) 이라는 것을 만들고, 클래의 객체에는 가상 함수 테이블을 위한 포인터가 멤버 변수로 추가 시킵니다. 일반적으로 가상 함수가 있는 객체는 가상 함수 테이블에 있는 함수만을 호출하는 원칙을 가지고 있다. 가상 함수의 단점 : 가상 함수를 사용해서 생기는 단점은 두가지를 들 수 있다. 첫번째로, 가상함수를 쓰면 가상함수 테이블을 만드므로 그만큼의 메모리 공간의 소모가 일.. 더보기
[C++] 오버라이딩 (Overriding) 오버라이딩 (Overriding) : 오버라이딩(Overriding)이란 기본 클래스에 선언된 멤버와 같은 형태의 멤버를 파생 클래스에서 선언하는 것이다. 오버라이딩에 관해서 더 자세히 알아 보기 전에 오버라이딩을 재정의로 알고 있으신분들은 오버라이딩에 등장하는 특성이 재정의 인거지 오버라이딩 자체는 재정의가 아닌것을 명심하고 들어가보자. 은닉의 효과 #include using namespace std; class AAA { public: void fct(){ cout 더보기
[C++] 상속 다섯번째, 상속된 객체와 참조와의 관계 객체 레퍼런스 : 객체 레퍼런스란 객체를 참조 할 수 있는 레퍼런스로 클래스 포인터(객체 포인터)의 특성과 일치 한다. #include using namespace std; class Person { public: void Sleep(){ cout 더보기
[C++] 상속 두번째, 세가지 형태의 상속 (private, protected, public) 다음과 같이 상속(Inheritance)의 경우를 보자 class A : public B { }; B클래스를 public으로 상속하겠다는 의미로 우리들이 일반적으로 많이 사용하는 class A : [상속형태] B 형태를 가지고 있다. 기본적으로 기본 클래스는 파생 클래스에 의해 상속되어지는 과정에서 접근 권한이 변경이 된다. 그 상속 형태에 따라 멤버들을 상속하는데 있어서 접근권한을 무엇으로 변경할 것이냐 하는 얘기이다. 아래는 기본 클래스와 상속의 형태에 따른 파생클래스에서의 기본클래스로의 접근범위를 표로 나타낸것이다. 일반적으로 public을 가장 많이 쓰이므로 그 부분에 초점을 맞춰서 보는 것이 좋다. 그냥 도표로는 언뜻 이해 하기가 힘드니, 이것을 코드와 분석을 통해서 더 자세히 알아 보자.(상속.. 더보기