Chap 4. 클래스의 완성
4-1. 정보은닉(Information Hiding)
객체 지향 프로그래밍에 있어서, 중요한 것을 클래스 설계인데, 이 클래스 설계에서 가장 중요한 두 가지는 정보은닉과 캡슐화이다.
그 중에서 먼저, 정보은닉에 대해서 이야기하자면 정보은닉은 쉽게 말해서 클래스의 멤버변수 정보를 감추는 것인데, 타 클래스에서 접근하지 못하도록 설계하는 것이다.
private으로 멤버변수를 설정하고 이를 접근할 수 있도록 public 함수들(get,set) 등을 설정해주는 방법을 통해 안전한 방법으로 멤버변수에 접근할 수 있도록 해주는 것이다.
추가적으로 멤버 함수에 const 선언을 해주면 해당 멤버변수 값을 변경하지 않도록 하여, 안정성을 높이는 효과를 가져온다.
int getX(void) const; 와 같이 사용한다.
4-2. 캡슐화(Encapsulation)
캡슐화도 마찬가지로 정보은닉과 함께 클래스 설계에서 중요한 개념이다.
클래스를 적절하게 묶어서 하나의 캡슐처럼 설계한다는 뜻으로, 보통 감기약으로 예시를 든다.
콧물, 재체기, 해열 의 약이 각각있다면, 이를 합쳐서 하나의 "콘택"이라는 캡슐로 묶는다.
그렇게 되면 환자는 이 하나의 "콘택"이라는 캡슐만 복용하면 코감기에 대해 쉽게 처방이 가능하게 되는 것이다.
이 캡슐화의 개념 자체는 간단하지만, 응용에 있어서는 가장 어렵다고 표현을 하기에 많은 실전 경험을 통해 익혀야 하는 부분이다.
4-3. 생성자(Constructor)와 소멸자(Destructor)
우리는 객체를 생성할 때 반드시 생성자를 통해 생성한다.
생성자는 반환형이 없고 반환을 하지도 않고 클래스 이름과 같은 함수를 말하는 것이다.
지금까지, 생성자를 선언하지 않았어도 객체를 생성할 수 있었던 것은 Default 생성자가 선언이 되어 있기 때문이었다.
생성자도 함수이기에 마찬가지로 오버로딩과 default 값 설정이 가능하다.
추가적으로, 멤버 변수 초기화가 중요한 내용인데, 이는 밑의 예제에서 검토해보겠다.
멤버 변수도 클래스의 생성자가 호출 될 때, 초기화 되기에 밑의 예제 처럼 사용하면 생성자가 호출 될 때 멤버변수의 생성자를 호출해서 초기화를 하는 개념이다.
생성자(변수 1, 변수 2) : 멤버변수이름(변수1, 변수2)
와 같은 방식으로 초기화한다.
그리고, 소멸자는 생성자의 반대 개념으로 객체가 사라질 때, 호출되는 함수이다.
소멸자가 활용되는 경우는 생성자에서 "new"를 통해 동적 할당을 해줬을 경우 이를 "delete"를 통해 해제해주는 것이 일반적이다.
소멸자는 생성자와 마찬가지로 반환형이 없고 반환하지도 않으며, 이름과 같은 함수를 선언해주는데, 이 때 이름 앞에 ~를 붙여준다.
4-4. 객체 배열과 This 포인터
객체 배열은 말 그대로 객체를 배열로 활용하는 것이고, 객체 포인터 배열은 객체의 주소값을 저장할 수 있는 객체 포인터들을 원소로 가지는 배열을 말하는 것이다.
그리고 This 포인터는 해당 클래스 객체를 지칭할 수 있는 포인터로 이 this 포인터를 통해서 초기화를 한다든지, 해당 객체를 또 다른 참조형 변수로 가르킬 수 있도록 사용한다든지, 그 외 다양한 활용이 가능하다.
(private 생성자를 통해서 계속 같은 객체를 가르킬 수 있도록 하는 것도 가능하다)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | // Chap 4. Constructor & Destructor #include <iostream> using namespace std; // Point class class Point{ // 멤버 변수 private: int xpos; int ypos; // 멤버 함수 public: // 생성자 Point(const int & xpos, const int & ypos) :xpos(xpos), ypos(ypos) { ; } // 정보 출력 함수 void shwPointInfo() const{ cout << "x : " << xpos << endl; cout << "y : " << ypos << endl; } }; // Rectangle class class Rectangle { // 멤버 변수 private: Point upLeft; Point lowRight; // 멤버 함수 public: // 생성자 Rectangle(const int & x1, const int & y1, const int & x2, const int & y2) :upLeft(x1, y1), lowRight(x2, y2) { ; } // 정보 출력 함수 void showRecInfo() const { cout << "좌 상단 " << endl; this->upLeft.shwPointInfo(); cout << "우 하단" << endl; this->lowRight.shwPointInfo(); cout << endl; } // 소멸자 ~Rectangle(){ cout << "소멸자 호출" << endl; } }; // 메인함수 void main() { // Point 객체 생성 Point ul(3, 5); Point lr(8, 8); ul.shwPointInfo(); lr.shwPointInfo(); Rectangle rec(4, 4, 8, 8); rec.showRecInfo(); } | cs |
'Archived(CSE Programming) > cpp' 카테고리의 다른 글
Chap 6. friend와 static 그리고 const (0) | 2019.01.07 |
---|---|
Chap 5. 복사 생성자(Copy Constructor) (0) | 2019.01.06 |
Chap 3. 클래스의 기본 (0) | 2019.01.04 |
Chap 2. C언어 기반의 C++ 2 (0) | 2019.01.04 |
Chap 1. C언어 기반의 C++ (0) | 2019.01.04 |