본문 바로가기

2010/09

[C++의 특징 -5] This 포인터와 Friend This 포인터란? : This Pointer란 객체가 멤버함수를 호출할 때 자동으로 멤버함수에게 전달되는 포인터이며, 호출한 객체를 가리키는 포인터를 말한다. 흔히 자기 참조 포인터(자기 자신을 가리킬 수 있는 포인터)라고 불리우며, 멤버 함수에게만 this pointer가 전달된다.(Friend 함수는 멤버 함수가 아니므로 this pointer가 전달되지 않는다. Static 함수도 마찬가지이다.) 아래의 예제를 보면 금방 감이 올것이다. #include using namespace std; class Person { public: Person* GetThis(){ return this; //this 포인터를 리턴. } }; int main() { Person *p1 = new Person(); c.. 더보기
[EC++] 항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 대입과 초기화를 구분하자 class B {...}; class A { public: A(const std::string& name, const std::string& address, const std::list& phone); private: std::string theName; std::string theAddress; std::list thePhone; int num; }; A::A(const std::string& name, const std::string& address, const std::list& phone) { thName = name; theAddress = address; thePhone = phone; num = 0; } C++규칙에 의하면 어떤 객체이든 그 객체의 데이터 멤버는 생성.. 더보기
[C++] 생성자와 소멸자 (Constructor & Destructor) - 두번째 저번 포스팅에 이어 두번째로 이번에는 소멸자에 대해서 얘기해 보겠습니다. 우선 소멸자를 이야기 하기 전에 객체가 소멸되는 시점에 관해서 언급 해보도록 하죠. * 객체가 소멸되는 시점 : 함수 내에 지역적으로 변수가 선언되면 함수 호출이 끝남과 동시에 소멸이 된다. 이와 마찬가지로 객체도 함수내에서 선언된다고 하면, 함수 호출이 끝나면 소멸되게 된다. * 전역적으로 선언된 객체 : 전역변수는 프로그램 시작과 동시에 메모리에 올라갔다가, 프로그램이 종료될때 소멸된다. 객체도 마찬가지로 똑같은 동작을 하지만, 객체는 이렇게 생성할 일은 거의 없다고 보면 된다. * 전역 : 일반적인 객체지향에 전역이란 개념은 존재 하지 않는다. 이를 대신하기 위한 static 멤버 변수, 멤버 함수가 존재 한다. (이거 대해서.. 더보기
[C++] 생성자와 소멸자 (Constructor & Destructor) - 첫번째 1. 생성자 (Constructor) : 생성자는 객체를 생성할 때 자동적으로 호출되는 함수로 클래스와 같은 이름의 형태를 띤 함수이며, 리턴형이 없으며, 리턴 하지도 않는 특징을 가지고 있다. 그럼 왜 생성자가 필요할까? 바로 객체를 생성과 동시에 초기화를 해주기 위해 필요하다. 객체를 생성과 동시에 초기화 주는 것이 클래스의 좋은 구조이기 때문에, C++는 정보은닉과 더불어 생성과 동시에 초기화라는 안전성을 제공하는 생성자라는 문법을 제공해 주는 것이다. 1-1. 생성자의 사용? : 생성자의 형태를 보면, 일단 세가지 형태를 가지고 있다. 첫번째로 디폴트 생성자 (Default Constructor), 인자가 있는 생성자, 마지막으로는 복사 생성자 (Copy Constructor) 이 세가지 형태가 .. 더보기
[C++] 정보은닉과 캡슐화 (Information Hiding & Encapsulation) 1. 정보은닉 (Information Hiding) : 프로그램을을 사용하는 사용자가 알아야 하는 것은 프로그램 사용법이지 프로그램의 내부 동작이나 상세 구조가 아니다. 사용자가 굳이 알 필요가 없는 불필요한 정보는 숨김으로써 사용자는 최소한의 정보만으로 프로그램을 쉽게 사용할 수 있어야 한다. C++에서는 클래스의 정보 은폐 기능을 지원하기 위해 private, public, protected 등의 접근제어 키워드를 통해 선언된 클래스 외부에서 직접적인 접근을 허용하지 않는것을 정보은닉이라 할 수 있다. 하지만 간접적 접근 경로를 제공해줘야 한다. 숨길 멤버와 공개할 멤버의 블록을 구성하도록 해서, 공개된 멤버는 외부에서 자유롭게 읽을 수 있지만 숨겨진 멤버를 참조하려고 시도하면 컴파일 과정에서 접근할.. 더보기
[EC++] 항목 20. 값에 의한 전달보다는 상수 객체 참조자에 의한 전달 방식을 택하는 편이 대게 낫다. 우선 이번 항목에서는 쟁점이라고 할 수 있는 것은 Pass by Value(Call by value) 의 두가지 문제점을 제기 하는데요. 첫번째는 바로 고비용 문제 입니다. 기본적으로 C++는 함수로부터 객체를 전달받거나 함수에 객체를 전달할 때 값에 의한 전달 방식을 사용하는데요. 특별히 다른 방식을 지정하지 않는 한, 함수 매개변수는 실제 인자의 '사본'을 통해 초기화되며, 어떤 함수를 호출 한 쪽은 그 함수가 반환한 값의 사본을 돌려받습니다. 이들 사본을 만들어 내는 곳이 바로 복사 생성자인데, 이런 점 때문에 고비용의 연산이 되기도 합니다. 한번 예제를 보면서 알아 보도록 하겠습니다. #include #include using namespace std; class person{ public: pe.. 더보기
[C/C++] Call by Value & Call By Reference (값에 의한 호출, 참조에 의한 호출) 1. 값에의한 호출 : 값에 의한 호출은 Call By Value라고 불리우며, 인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식으로 값의 복사에 의한 함수 호출을 의미합니다. #include using namespace std; void swap(int a, int b); int main() { int val1 = 10; int val2 = 20; swap(val1, val2); cout 더보기
[C++의 특징 - 3] 변수(Variable)와 레퍼런스(Reference) 우선 레퍼런스를 알아 보기 전에 변수에 대해서 간단히 알아 봅시다. 1. 변수 (Variable) : 변수란 메모리 공간에 붙은 이름 이라고 할 수 있습니다. C에서는 하나의 메모리 공간에 하나의 이름만을 가지고 있었는데, C++에서는 하나의 메모리 공간에 둘이상의 이름을 붙여 줄 수 있죠. 그것이 바로 레퍼런스입니다. 2. 레퍼런스 : 이름을 지니는 대상에 별명을 붙여주는 행위. 아래와 같이 사용합니다. int main() { int val =10; int *pVal = &val; //주소 값을 얻기 위해 & 연산자 사용의 예 int &Val = val; //레퍼런스 선언을 위한 &연산자 사용 return 0; } '&' 연산자를 이용해 마음대로 변수에다가 별명을 붙여 줄 수 있는데요. 아래 예제를 보.. 더보기
[C/C++] 데이터, 스택(Stack), 힙(Heap) 영역 우리들이 프로그램을 실행하면, 운영체제는 우리들이 실행한 프로그램을 위해 메모리 공간을 할당해줍니다. 그냥 할당해 주느냐? 그것이 아니라 용도별로 메모리 공간을 할당해 운영체제가 메모리 영역을 구분해 메모리 공간의 효율적 사용을 하게 만들어 줍니다. 1. 메모리 영역의 종류 * 데이터영역 : 전역 변수, Static변수를 위한 메모리 공간 - 전역 변수 : 프로그램이 시작하자마자 메모리 공간에 올라가서 종료 될때까지 남아있는다. - Static 변수 : 프로그램 시작과 동시에 메모리 공간에 올라가서 종료될때까지 남아 있긴 한다. * 힙영역 : 런타임에 크기가 결정될수 있는 요소들을 올리기 위한 공간 * Stack : 컴파일 타임에 크기가 결정될 수 있는 요소들을 메모리 공간에 올리기 위한 영역 각각의 영.. 더보기
[C/C++] 콘스트(const)란? 1. Const? : Const는 변수를 상수화 하기 위해 사용하는데, 쓰이는 위치에 따라서 용도가 조금 달라진다. - 첫번째, const int* n : 위와 같이 const가 자료형 뒤에 붙은 경우를 데이터 상수화 라고 하고 n이라는 포인터가 가리키는 대상을 상수화 하겠다는 의미가 된다. #include using namespace std; const int*n; void main() { int b =10; n = &b; b = 20; cout 더보기