뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++
-
[C++] Reference 와 Pointer 의 차이점 설명해줄래뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 14. 15:10
안녕하세요. 요번 시간에는 Reference와 Pointer의 차이점에 대해서 적어보려고 합니다. 우선, 포인터(Pointer)와 레퍼런스(Reference) 둘 다, 변수에 대하여 값을 가리키거나 변수 자체에 접근하여 값을 변경할 수 있도록 하는 역할을 실시하게 됩니다. 하지만 포인터와 레퍼런스의 가장 근본적인 차이는 포인터의 경우, 포인터는 메모리가 저장되어 있는 곳을 가리키는 값을 저장하게 되고, 레퍼런스의 경우 값(변수)에 대한 별칭을 의미 하는데 있어 차이가 존재합니다. 위의 그림0 을 보게 되면, 포인터 p 는 변수 a의 주소 값을 담아두게 되고, 레퍼런스인 ref는 단지 a의 별칭일 뿐, a의 주소 값을 저장하지 않습니다. 그럼 각 차이점을 알아보도록 하겠습니다. 비 교 포인터(Pointer..
-
[c++] delete[] 가 포인터를 받아도 잘 동작하는 이유(over-allocate)뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 9. 16:23
c++에서는 동적으로 객체를 생성 및 삭제를 시켜줄 때, new 그리고 delete 키워드를 쓰게 됩니다. 이때, new는 우리가 메모리를 할당하고, 생성자를 호출하게 되어, 그 사이즈나 크기를 명시해주게 됩니다. 그렇지만 delete는 포인터만 넘겨줄 뿐인데, 어떻게 그 사이즈를 예측하고 삭제시켜 줄 수 있을까? 부연하자면, 밑과 같은 코드가 존재했을때, pFoo는 단순 포인터일 뿐인데, 어떻게 Foo array에 해당하는 메모리를 삭제시키고 알맞는 개수의 소멸자를 호출할 수 있을까요? class Foo { public: Foo() {} ~Foo() {} int mNunber; } int main() { Foo* pFoo = new Foo[10]; delete[] pFoo; } 메모리 할당에 해당 2가..
-
[c++] 너 .. 혹시 생성자에서 가상함수 호출할거야 ?뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 9. 00:54
네.. 제목을 좀 재밌게 지어보려고 했는데, 의도된 대로 지어졌는지 모르겠습니다. ㅎㅎ 아무튼 오늘 글을 쓰려고 한 주제는 생성자에서 가상 함수 호출을 하면 어떻게 되는가? 가 주제였습니다. 결론부터 말하자면, "제발 하지 마"입니다..! 뭐가 문제일까? 가상 함수를 생성자에서 호출하기 전에, "뭐가 문제일까?" 하는 생각이 드실 수 도 있습니다. 다음 함수를 보고 결과를 맞추신다면 이 글을 읽으실 필요는 없으실 거 같습니다. 그럼 문제입니다. 다음 코드를 보시고 어떤 결과가 나올지 예측해 주세요! #include class A { public: A() { fn(); } virtual void fn() { _n = 1; } int getn() { return _n; } protected: int _n; ..
-
[c++] New 그리고 malloc( ) 구분할 수 있어?뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 8. 12:41
c++에서 메모리를 할당하려면, new 키워드로 메모리를 할당하고, 메모리를 해제하려면 delete 키워드로 메모리를 해제해줍니다. 마치 c 언어에서 malloc( )과 free( )를 사용하는 것처럼 비슷하게 사용합니다. 하지만 C++에서는 new와 delete의 작동법은 조금 다르게 작동하는데 이에 대해 알아보겠습니다. 0. new 그리고 delete 사용법 우선 new와 delete는 연산자의 일종입니다. (malloc( )과 free( )는 함수의 일종입니다.) 따라서, new 연산자는 operator new( )라는 특별한 연산자 함수를 호출하며, delete 또한 마찬가지로 operator delete라는 특별한 연산자 함수를 호출하게 됩니다. 우선 다음과 같이 new 연산자를 사용할 수 있는..
-
[객체의 관계] Is-A 그리고 Has-A 관계 !뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 8. 02:03
프로그래밍을 하다 보면, 서로 다른 클래스가 공통적인 속성을 가지거나, 최소 두 클래스가 관련이 되어있는 경우가 존재합니다. 이때, 객체의 관계를 표현할 수 있는데, 대표적으로 Is-a 관계 그리고 Has-a 관계가 있습니다. Is-a 그리고 Has-a 관계 그게 뭔데? Has-a 관계 Composition 또는 Aggregation 관계라고도 부르는 has-a 관계는 "A는 B를 가진다" 또는 "A가 B를 가지고 있다"라고 정의할 수 있습니다. 한 객체가 다른 객체의 일부가 되는 것입니다. Has-a 관계는 비행기의 엔진을 예로 들 수 있는데, 비행기에는 엔진이 존재하며, 엔진을 포함하고 있다 또는 비행기는 엔진이 있다라고 표현할 수 있습니다. 이를 코드로 표현하면, 비행기라는 객체는 엔진 컴포넌트를 ..
-
[c++] 상속을 어떻게 멈출 수 있을까 ?뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 6. 00:24
질문. 마침 이런 생각을 할 수 있겠다. 상속되는 자식 객체에게 더 이상의 자식 객체를 만드는 것을 허락하지 않을 수 있을까? 이번 글에서는 이러한 객체를 만드는 디자인적인 방법론과 C++에서 제시하는 방법에 대해 알아보겠습니다. 정답 공개 더보기 1. Final 키워드를 사용한다. 2. Constructor를 private으로 사용한 다음, static 함수를 사용하여, 객체를 얻어온다. 3. private 생성자를 가진 dummy class를 활용하여, friend 키워드 활용하기. 1. final keyword 사용 c++ class 객체에서 final 키워드를 사용하게 된다면, 더 이상 클래스를 상속하는 것을 허락하지 않습니다. 따라서 어떠한 클래스도 final 클래스를 사용한 객체에 대해 상속받..
-
왜 c에는 이동 연산자가 없는가.뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 3. 01:23
이동 의미론(move semantic)을 사용하다가 문득 든 생각은 왜 C에는 이동연산자가 없을까? 하는 질문이 생각났습니다. 나름대로의 해답을 도출했는데, stackOverflow에서도 비슷한 질문을 한 경우가 있어, 첨언하여 답변해보겠습니다. 우선 C++에서 "move semantic"은 임시 객체에 대해서 효율적인 이동이 가능하도록 하는 오버로딩 방법중 하나입니다. - 이를 생각해보지 못했는데, 이동 연산자 또한 함수 오버로딩의 일종이었습니다. 그렇다면 우선적으로 c 에서는 함수의 오버로딩이 허용되지 않기 때문에 쉽사리 답을 내릴 수 있습니다. C 에서는 함수 오버로딩이 불가능하기 때문에, 만약 데이터 이동 함수를 작성하려면, Copy_Struct 처럼 앞에 Copy라고 명시적으로 이 함수가 Str..
-
Vtable - 어디에 존재하는가..뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 3. 00:59
0. Vtable 이란 vtable 이란, Virtual Function Table의 약자로, 상속 구조에서 메서드를 virtual로 선언하게 되면, vtable이 생성되게 됩니다. vtable(가상 테이블)은 특수한 메모리 영역을 활용하여 알맞은 코드를 호출하게 되는데, 기본적인 정보는 virtual 메서드가 하나 이상 정의된 클래스마다 vtable은 하나씩 구현되어 있습니다. 따라서 vtable을 가진 클래스를 생성한 객체마다 이 vtable에 대한 포인터를 가지게 됩니다. vtable은 상속구조에서 동적 바인딩(dynamic binding)이라는 중요한 특성을 가지므로, 꼭! 공부해두시길 바랍니다. 1. vTable 실험 단일 상속구조를 가진, class의 경우 다음과 같이 메모리 구조를 가지게 됩..