반응형

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