반응형

프로그래밍 215

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

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

프로그래밍/cpp 2014.04.21

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

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

프로그래밍/cpp 2014.04.17

자료구조 큐(Queue) C언어

스택은 데이타의 출입구가 한 군데인데 반해, 큐는 데이타 입출입이 양뱡향입니다. FIFO(First in First Out)구조를 가졌습니다. 터널을 지나는 자동차를 생각해보면 터널은 큐고 터널의 길이는 큐의 크기가 됩니다. 그리고 자동차는 데이타가 되겠죠. 큐도 스택과 비슷하고 데이타의 입력방향과 출력방향이 다르다는 것만 주의하면 됩니다. 스택에서는 offset(오프셋)을 기억하는 변수를 하나만 두었지만, 큐에서는 입력과 출력의 위치가 다르기 때문에 두개를 두어야합니다. 데이타가 머리부터 차례로 입력된다 생각하고 변수를 정하면, FIFO구조기때문에 출력위치는 머리가 됩니다. 그리고 입력위치는 꼬리가 되겠죠. 출력위치를 가리키는 변수를 head, 입력위치를 가리키는 변수를 tail이라고 하면 구조는 다음..

자료구조 스택(stack) C언어

스택(stack)도 연결리스트와 마찬가지로 선형자료구조다. 우리가 알고있는 메모리의 스택도 같은 구조를 가진다. 스택의 특성은 LIFO(Last in First Out)으로 저장되는 구조인데, 스택을 비우는 순서는 가장 마지막으로 넣은 정보부터 빠지게된다. 책을 박스에 차곡차곡 쌓아서 보관해 놓았는데, 다시 책들을 꺼내기 위해서는 맨 위에서부터 빼내야 하는 이치와 같다. 우리가 알고있는 재귀함수를 이용하는 것도 스택의 특성을 사용한다. 좀 더 예를 들어보면 우리가 C프로그래밍을 할 때 가장먼저 호출되는 함수는 main함수다. 하지만 main함수는 가장 마지막에 반환된다. (LIFO == FILO ) 우리가 구현하고자 하는 스택을 간략히 표현해 보겠다. 2014/02/28 - [프로그래밍/C언어] - 동적..

자료구조 - 연결리스트[linked list] C언어

연결리스트는 동적배열과 비슷하지만 동적배열에 비해 데이터를 유연하게 삽입, 삭제할 수가 있다. 동적배열의 경우엔 삽입을 하기위해선 배열의 크기를 체크하고 배열의 공간이 꽉 차있다면 realloc을 하였다. 그리고 삽입, 삭제할 지점 이후의 자료들은 메모리의 이동이 이루어지기 때문에, 삽입시 부자연스럽기도 하다. 동적배열과의 연결리스트의 차이점은 배열의 특성은 메모리공간에서 연속이라는 점이다. 그래서 첨자연산으로 빠른 속도가 보장되지만, 메모리가 연속이어야 하기 때문에, 삽입과 삭제가 번거롭다. 하지면 연결리스트는 메모리상에 연속이지 않아도 된다. 다음데이터에 대한 링크정보를 지니고 있기때문에 가능한 일이다. 2014/02/28 - [프로그래밍/C언어] - 동적배열 자료구조의 시작 2014/03/17 - ..

연산자 오버로딩 C++

일반적인 연산을 살펴보면 오버로딩과 비슷한 규칙을 살펴볼 수 있다. 피연산자의 타입이 달라지더라도 알아서 계산이 된다는 것이다. 예를들어 정수+정수 의 연산결과는 정수가 되고, 실수+실수 의 연산결과는 실수가 된다. 이렇게 피연산자의 타입을 알아서 체크하고 그에 맞는 +연산을 하는 것은 마치 함수가 인수의 타입에 따라서 작동하는 오버로딩과 비슷하다 볼 수 있다. 이렇게 살펴본 사실은 실제로 사실이다. 다시말해 '+'는 피연산자의 타입에 따라서 오버로딩 되어있다. 하지만 char*타입과 같은 문자나 클래스 타입에 대해서는 작동하지않는다. 그렇다면 사용자가 직접 이런 연산자들을 오버로딩하는 법이 있을까? 15~18라인은 연산자 오버로딩코드이다. 일반적인 함수의 선언과 비슷한데 눈여겨볼 점은 호출시의 모양이다..

프로그래밍/cpp 2014.03.19

복사 생성자 - 얕은복사 깊은복사 C++

C++에서 생성자의 주된 임무는 클래스 멤버 변수의 초기화 일 것이다. 이러한 생성자는 기본적으로 인수의 유무에 따라서 인수의 형태에 따라서 몇가지 이름을 붙인다. 기억해둘 생성자에는 디폴트 생성자, 복사 생성자가 있고 결국 생성자이고, 형태 또한 생성자의 형태에서 벗어나지 않는다. 그러면 왜 이렇게 구분해 놓은 것인가? 그러면 생성자의 형태를 살펴본 후 이야기하자. 아주 간단한 클래스와 생성자를 만들었다. 생성자의 기본적인 형태는 위 코드처럼 반환타입이 존재하지않고, 클래스의 이름과 똑같다. 그 외에는 일반적인 함수의 형태를 띠게된다. 생성자는 생성자라는 이름처럼 객체의 생성과 동시에 호출이 되게 되어있다. myClass A; 는 myClass A = myClass(); 와 동일한 구문이다. 해석하자면..

프로그래밍/cpp 2014.03.18

동적배열에서 memmove함수 사용하기 연습 C언어

동적배열은 실행중 배열의 크기를 유연하게 바꿀수 있는 배열이다. 이전에 대략적으로 다뤘지만, 개인적으로 이 동적배열을 잘 다루면 앞으로 나오는 자료구조를 이해하고 적응하는데 많은 도움이 되기 때문에, 몇가지 중요한 포인트를 정리하고자 한다. 아니면 아주 동적배열에서 특정 데이타를 삽입하는 코드를 외우는 것도 괜찮다 생각된다. memmove 함수의 선언을 써보자. void *memmove(void *dest, const void *src, size_t n); // src부터 n만큼을 dest로 이동 memmove함수의 특징은 메모리상에서 dest와 src의 위치가 겹쳐 있어도 데이타의 손실없이 이동이 이루어 진다는데 있다. memcpy와 동작을 비교하기도 하지만 컴파일러에 따라서(gcc,vc)는 memcp..

동적배열 자료구조의 시작

c언어에서 배열은 가장 단순하면서도 직관적인 자료구조다. 배열의 요소가 연속적인 메모리 공간에 붙어 있고 요소의 타입이 동일하기 때문에, 포인터 연산을 통한 데이터로의 접근이 빠르다. 그런데 배열을 사용하면서도 정형적인 형식과, 특징때문에, 유연한 요소의 삽입과 삭제에 제한이 있고, 일단 선언되면 배열의 크기를 가변적으로 바꿀 수 없기 때문에 유연한 사용에 한계가 있다. memmove 함수를 이용해서 메모리의 위치를 이동하여 삽입 삭제가 가능하지만, 이 또한 처음에 정해진 배열의 크기안에서만 가능하다. 이를 해결 하기 위한 것이 동적배열이다. 2014/03/17 - [프로그래밍/C언어] - 동적배열에서 memmove함수 사용하기 연습 C언어 2014/03/20 - [프로그래밍/C언어] - 자료구조 - 연..

하노이탑 재귀호출 알고리즘

하노이 탑은 재귀호출의 대표적인 예다. 또 팩토리얼 연산은 재귀호출의 기본인데, 재귀호출이 무엇인지 알아보고, 점화식과의 관계를 도출하면서 C언어로 어떻게 코딩하는 가를 살펴보는 것이 이번 포스팅의 목표다. 거창한 듯 하지만 재귀호출을 이해만 하면 모든 것이 해결된다. 재귀호출은 간단히 말해서 함수가 자신을 호출하는 경우를 말한다. factorial의 경우를 살펴보자. factorial은 일련의 수의 곱을 말한다. a!은 1부터 a까지의 곱을 말하는데, for문을 이용해 증가되는 수를 계속 결과값에 곱해서 계산할 수 있다. 그럼 두가지 방법을 살펴보자. 재귀에 대한 생각(factorial) 결과는10! = 3628800으로 같다. 함수의 호출 형태는 같지만 내부적 구조는 다르다. 환경에 따른 성능의 차이..

반응형