반응형

프로그래밍/cpp 46

[c++] 스마트 포인터 (auto_ptr) 에 대한 이해

이번 포스팅은 스마트 포인터(auto_ptr)에 대해서 알아보겠습니다. C++11에선 (스마트 포인터)shared_ptr이 표준에 추가되었다. 이는 참조 카운팅을 추가하여 스마트 포인터간의 매끄러운 대입을 가능하게 하였다. 스마트포인터의 종류에 대한 설명은 다음 포스팅으로 미루고 여기에선 스마트포인터의 원리에 관해서 원론적인 이야기를 할까 한다. 내용에 들어가기 앞서 스마트 포인터에 관한 이해를 위해서는 다음과 같은 주제에 대한 이해가 필히 요구된다. 템플릿, 연산자 오버로딩, 정적할당, 동적할당, 스택, 힙, 생성자,파괴자... 2014/06/16 - [프로그래밍/c++] - C++ 템플릿, 함수템플릿에 대한 이해 2014/06/17 - [프로그래밍/c++] - 클래스 템플릿에 대한 이해 C++ 201..

프로그래밍/cpp 2015.04.14

const 키워드에 대한 이해(c++)

const의 기본적 내용은 아래 글을 참조하시기 바랍니다. 2014/01/14 - [프로그래밍/C언어] - 상수포인터, 포인터상수, const c언어에서의 const를 확장하여 c++의 클래스 내부에서 사용되어지는 예를 살펴보겠습니다. 예1) 멤버변수를 const로 선언한 경우 위 코드를 컴파일해보면 두 개의 에러가 생긴다. 첫 번째는 초기화 되지 않은 멤버 Mango::m라고 하고, 두 번째는 Mango::m의 값이 읽기전용이기 때문에 값을 넣을 수 없다는 에러다. 초기화를 시켜야 하지만 생성자에서 초기화를 할 수 없다고 유추해 볼 수 있다. const멤버의 초기화 이 방법은 멤버 이니셜 라이져를 이용한 전통적인 방법이다. c++11에서는 다음과 같은 방법도 제공한다. 다음 방법은 c++11에서만 가능..

프로그래밍/cpp 2015.04.07

비타입 인수,디폴트 템플릿 인수,특수화 (클래스,함수 템플릿) c++

비타입 인수(Nontype Argument)는 타입이 아닌 실제 값을 말합니다. 실제 값은 변수가 아닌 상수를 말합니다. 대표적인 예로 배열객체를 만드는 클래스를 클래스 템플릿으로 만들어 보겠습니다. 멤버변수로 배열이 선언되었지만, 초기화가 안되 있습니다. 배열의 특성상 구체화(컴파일시)와 동시에 초기화가 되어야 하기 때문에 N값에 상수가 필요합니다. 템플릿을 이용해서 객체 생성시로 초기화를 미룰 수 있습니다. 이렇게 하면 클래스로 원하는 타입과 크기의 배열 객체를 생성할 수 있습니다. 템플릿을 사용하지 않고서는 클래스로 원하는 객체를 만드는 방법은 동적할당을 이용하는 방법일 겁니다. 동적할당을 사용하면 실행중 언제라도 배열을 크기도 바꿀 수 있고 실행시간 중에 생성할 수도 있습니다. 하지만 동적할당은 ..

프로그래밍/cpp 2014.06.18

클래스 템플릿에 대한 이해 C++

클래스 템플릿도 함수 템플릿과 비슷합니다. 알고리즘이 동일하다는 조건하에 멤버들의 다른 경우 템플릿으로 해결할 수 있습니다. 템플릿 함수를 이해했다면 이해하기 쉽기 때문에 긴말 없이 예제로 바로 들어 가겠습니다. 결과는 1이 찍히는 간단한 프로그램입니다. 함수 템플릿과 동일하게 template 로 시작합니다. 클래스의 선언부를 선언하는 방식은 기존 클래스 문법과 똑같습니다. 호출에 따라 달라질 멤버변수만 T로 선언해 주면 됩니다. 객체의 생성시 클래스명 뒤에는 을 적어주도록 합니다. 클래스의 경우는 함수와 달리 이렇게 명시적으로 클래스를 호출해주어야 합니다. 단, 함수 템플릿의 경우도 인수로 타입네임이 정해지지 않은 경우에 명시적 호출을 하는 것과 비교해서 이해해 주시길 바랍니다. 참고로 생성자에 타입네..

프로그래밍/cpp 2014.06.17

C++ 템플릿, 함수템플릿에 대한 이해

STL(Standard Template Library)의 문법적 토대가 되는 템플릿에 대해서 알아보도록 하겠습니다. 템플릿을 일종의 형틀입니다. 원하는 모양을 직접 조각하거나 빗는 것은 시간이 오래걸리지만, 형틀이 있다면 단순히 찍어내기만 하면 바로 만들 수 있습니다. 이번 포스팅의 주제인 함수 템플릿은 함수를 찍어내는 형틀이라고 생각하면 될 것입니다. 먼저 간단한 템플릿 함수를 예를 들어 보겠습니다. template 부분은 함수 템플릿의 정의 시작 부분입니다. 선언과 정의를 따로 하려면 다음과 같이 하면 됩니다. 또한 다음과 같이 두 개 이상의 타입을 전달받을 수도 있습니다. 여기서 핵심적인 부분은 T인데, 함수의 본체에서 사용될 타입입니다. 이렇게 함수템플릿을 작성하고 단순히 이 함수를 호출을 하게되..

프로그래밍/cpp 2014.06.16

네임스페이스(namespace) 제대로 사용하기,모듈화 프로그래밍 C/C++

네임스페이스(namespace)의 개념은 하나의 독립된 공간을 할당해 주는 것이라 할 수 있습니다. 이 공간의 개념을 일반적인 집 주소라고 생각해도 되는데, 개념 자체가 어려운 것은 아니지만 실제로 사용하려면 감이 안 잡힐 수 있습니다. 여기서는 C++을 기준으로 설명할 것이고, 클래스의 개념 내에서 네임스페이스를 사용하는 간단한 예제를 만들어 보려 합니다.. 또한 분할 컴파일의 개념도 간략하게 알고 넘어 갈 것입니다.. 프로젝트 구조 예제 클래스의 관계도 입니다. MyClass.h 파일에는 Myclass클래스의 선언(prototype)이 있습니다. MyClass.cpp 파일에는 클래스의 멤버함수에 대한 정의가 있습니다. main.cpp에 Myclass 의 선언과 정이가 모두 들어가도 상관없습니다. 하지..

프로그래밍/cpp 2014.05.13

포인터와 레퍼런스,포인터의 레퍼런스,이중포인터 C++

포인터와 비슷한 개념이 레퍼런스입니다. 레퍼런스의 뜻은 이미 아시다시피 참조를 말하며, 컴퓨터공학에서 reference는 다양한 뜻을 내포하지만 오늘 설명할 개념은 C++에서 포인터와 비슷한 기능을 가진 레퍼런스와 포인터에 관해서 글을 작성합니다. 포인터는 변수의 주소값을 담는 그릇이라 생각하면, 레퍼런스는 변수의 또다른 이름을 나타냅니다. 이 둘은 각각 용량에 대한 특성을 가집니다. 포인터는 가리키는 타입에 상관없이 32비트 운영체제에서 32비트 즉 4바이트입니다. 주소값을 담기 때문에 주소만큼의 용량이죠. 모든 주소값은 같은 운영체제에서는 같을 수 밖에 없겠죠. 그럼 레퍼런스의 경우는 어떨까요? 별명이다. 용량이 없기 때문에 포인터보다 빠르다..등등 여러가지 설명이 많이 있습니다. 다 맞는 말이지만,..

프로그래밍/cpp 2014.05.11

C++ 추상클래스(인터페이스(interface)/순수가상함수)에 대한 고찰

디자인 패턴에 관한 책을 보면 인터페이스를 많이 활용합니다. 그런데 C++에서는 인터페이스라는 용어를 정확히 찝어서 사용하지는 않는 것 같습니다. 자바(Java)언어의 경우를 보면 일반적인 클래스와 인터페이스가 확실히 구별되고, 구현 방법도 extends와 implements로 다른 종류로 치부됩니다. 애초에 자바의 경우는 언어적인 차원에서 다중상속을 하지 못하게 하였고, 대신 인터페이스를 구현하는 방법으로 다중 상속부분을 해결하는 걸로 알고 있습니다. 꼭 다중상속의 차원에서만은 아니겠지만, 자바언어는 인터페이스를(interface) 따로 정의해 놨습니다. 이에 반해서 다중 상속이 자유로운 C++의 경우는 인터페이스라는 용어에 대해서 굳이 생각하지 않아도 되고 굳이, 구분해서 문법을 설명하지 않습니다. ..

프로그래밍/cpp 2014.05.01

c++ 생성자 소멸자/(virtual)가상 소멸자를 쓰는 이유

생성자와 소멸자 또는 파괴자라고도 한다. 생성자와 소멸자의 특성을 정리한다면 다음과 같다. 생성자는 클래스의 인스턴스를 메모리에 할당할 때 초기화의 방식을 담당한다. 반대로 소멸자는 클래스의 인스턴스가 더 이상 필요하지 않을 때 메모리에 존재하는 인스턴스를 해제를 위해 호출한다. new로 인스턴스를 동적할당 할때 생성자가 호출된다. 객체가 파괴될 때 소멸자는 자동으로 호출된다. 여기서 중요한 것은 객체의 파괴 뿐 아니라 객체가 생성될 당시 동적으로 할당된 환경들의 소거작업에 대한 정의가 소멸자에 정의(구현)되어야 한다. 생성자의 이름은 클래스의 이름과 동일하고 반환값이 없다. 반면에 소멸자의 이름은 클래스의 이름에 ~가 붙는다. 생성자와 소멸자는 클래스에 명시하지 않는 경우는 디폴트 생성자와 디폴트 소멸..

프로그래밍/cpp 2014.04.21

오버로딩 오버라이딩 (overloading overriding) c++

오버로딩과 오버라이딩은 C언어에서는 지원하지 않습니다. C++에서 지원한다는 점을 기억해 두시고, 오버로딩과 오버라이딩의 차이점을 설명합니다. 오버로딩(overloading) 오버로딩은 중복정의라고도 합니다. 기존에 만들어 놓은 함수와 이름은 같지만, 인수의 형태가 다른 함수가 있을 때 오버로딩되었다고 합니다.(참고 : 리턴값은 같을 수도 있고 달라질 수도 있습니다. 주의할 점은 인수형태는 같은데 리턴값만 다를 경우는 모호한(ambiguous)표현이라고 에러가 나게 됩니다.) 이때 인수의 개수는 같거나 다르거나 상관은 없습니다. 그리고 오버로딩은 일반 함수나 같은 클래스의 멤버함수간에 이루어집니다. 예를 들어 설명해 드리겠습니다. overl의 함수명을 가진 3개의 함수가 있습니다. 오버로딩을 확인할 때는..

프로그래밍/cpp 2014.04.17
반응형