1. class
class는 struct와 매우 유사하나 보안이 필요한 코딩을 해야할 때 이용할 수 있다.
class는 왜 사용할까?
결론적으로 말하자면, 객체 지향적인 코드를 만들기 위해, 코드의 재활용성을 높이기 위해 Class를 만든다라고 말할 수 있다.
1. 코드의 재활용성이 높아진다.
2. 설계적인 면에서 작업의 효율을 높일 수 있다.(각자 서로의 객체를 제작하여 하나로 합치면 된다.)
여기서 한번 절차 지향과 객체 지향의 차이를 보자.
레고를 기준으로 한번 설명해보자.
레고는 블럭 하나 하나를 나누어 만들어두었다.
이 레고 하나는 하나의 객체라고 볼 수 있다
이 객체들을 이용하여 우리는 빌딩도 만들 수 있고, 배도 만들 수 있고, 로봇도 만들 수 있다.
이처럼 객체를 잘 구성해두면 할 수 있는 것들이 무수히 많다.
반면 레고를 블럭 단위로 만들어 둔 것이 아닌 로봇 하나로 만들어서 판매하고 있는 레고를 보자.
이 레고는 객체로 만들어진 로봇과 같은 로봇이지만, 부수게 된다면 다시 배로 만들 수 없는 레고이다.
이것이 절차 지향과 객체 지향의 차이이다.
이때문에 우리는 class를 좀 더 깊게 살펴봐야 한다.
다시 본론으로 돌아와서 class를 알아보자.
struct에서는 없던 private, public, protected라는 개념이 존재하는데 한번 사용해보자.
public : 모든 클래스에서 이 클래스의 public를 참조할수 있다.
private : 자신의 클래스에서만 참조가능
protected : 자신의 클래스에서 상속받은 클래스도 참조가능
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 | #include <iostream> #include <cstdio> #include <string.h> using namespace std; class children { private: int age; char name[10]; int birth; public: children(int a, char *n, int b) { this->age = a; strcpy(this->name, n); this->birth = b; } ~children() { } void addAge() { this->age++; } void changeName() { char tmp[10]; cin >> tmp; strcpy(this->name, tmp); } int getAge() { return this->age; } char* getName() { return this->name; } int getBirth() { return this->birth; } }; int main() { children kkw(27, "고관우", 19920526); cout << kkw.getAge() << " " << kkw.getName() << " " << kkw.getBirth() << endl; kkw.addAge(); cout << kkw.getAge(); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | cs |
클래스 내부에는 private가 존재한다.
private의 의미는, 사용자가 프로그램을 실행 할 때, private부분은 호출할 수 없게 된다.
하지만 public에 있는 함수등을 이용하여 private내부에 접근 할 수 있게 되는데, 사용자가 접근하는 것이 아닌 프로그램이 private로 접근하는 것이기에 안전하다.
예를들어 password가 변수로 설정되어있는데 아무 사용자나와서 변경 할 수 있다면 큰 일이 생길 것이다.
따라서 중요한 자료는 private로, 공개해도 되는 자료는 public로 두어 사용자가 프로그램을 이용 할 수있도록 한다.
그리고 위에서 자기자신의 클래스명으로 생긴 함수가 있는데 그것을 생성자라고 한다.
생성자는 해당하는 클래스가 생성될 때 초기값을 입력해주는 역할을 해준다.
children(){
}
로 나타낸다.
반대로 소멸자라는 개념이 있는데 소멸자는 클래스가 사라질 때 행동하는 것을 코딩 할 수 있다.
~children(){
}
로 나타낸다.
class에 대한 몇가지 이야기 :: http://www.crocus.co.kr/232
2. 상속
이번에는 상속이라는 개념을 이용해보자.
상속은 현재 내 클래스가 가진 정보를 다음 클래스로 넘겨줄 수 있는 역할을 한다.
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 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> #include <cstdio> #include <string.h> using namespace std; class parent { private: int childCnt; protected: int pVal; int getParentage() { return this->pVal; } public: parent() { childCnt = 0; pVal = 89564321; } ~parent() { } void addChild() { childCnt++; } int getChild() { return childCnt; } }; class children : public parent { private: int age; char name[10]; int birth; public: children(int a, char *n, int b):parent() { this->age = a; strcpy(this->name, n); this->birth = b; } ~children() { } void plusChild() { this->addChild(); } // 함수 오버라이딩 int getChild() { return parent::getChild();; } }; int main() { children kkw(27, "고관우", 19920526); kkw.plusChild(); cout << kkw.getChild() << endl; kkw.plusChild(); cout << kkw.getChild() << endl; kkw.plusChild(); cout << kkw.getChild() << endl; kkw.plusChild(); cout << kkw.getChild() << endl; return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> // This source code Copyright belongs to Crocus // If you want to see more? click here >> | cs |
우선 상속은 class 클래스명 : 상속해줄 클래스명 으로 사용한다.
이제 children이라는 클래스는 parent라는 클래스를 상속받게 되었고 parent의 private를 제외한 모든 것을 사용할 수 있게 된다.
그러한 사용 예제는 위의 코드를 통해 확인해보자.
그리고 이번 클래스를 작성하며 하나 더 알게되는 것은 함수 오버라이딩이다.
함수 오버라이딩이란?
같은 함수명이 존재할 때 이를 처리하는 방법이다.
함수 오버라이딩은 상속을 할 때 발생할 수 있는 경우이다.
함수 오버라이딩을 하기 위해서는 위의 코드처럼 children의 getChild를 쓰고 싶다면 this->getChild()를
parent의 getChild를 쓰고 싶다면 parent::getChild()를 호출하면 된다.
참조 내용 :: http://memoryfilm.tistory.com/16
'Tutoring > C++' 카테고리의 다른 글
다양한 입/출력 방식 (0) | 2018.03.07 |
---|---|
operator (0) | 2018.03.07 |
참조, template (0) | 2018.03.02 |
입출력, namespace (0) | 2018.02.26 |