객체 지향 프로그래밍 정리

2023. 3. 18. 15:06개인공부/C++

객체란?

객체란, 변수들과 참고 자료들로 이루어진 소프트웨어 덩어리이다. 객체가 현실 세계에서의 존재하는 것들을 나타내기 위해서는 추상화(abstraction)라는 과정이 필요하다. 아래의 그림은 객체를 간단하게 표현한 그림이다.

이와 같이 어떠한 객체는 자기만의 정보를 나타내는 변수들과, 이를 가지고 어떠한 작업을 하는 함수들로 둘러싸고 있다. 참고로, 이러한 객체의 변수나 함수들을 보통 인스턴스 변수(instance variable)와 인스턴스 메서드(instance method)라고 부르기도 한다. 외부에서 직접 인스턴스 변수의 값을 바꿀 수 없고 항상 인스턴스 메서드를 통해서 간접적으로 조절하는 것을 캡슐화(Encapsulation)라고 부른다.

캡슐화의  장점은 간단하게 "객체가 내부적으로 어떻게 작동하는지 몰라도 사용할 줄 알게 된다"이다. 여러가지 처리를 프로그래머가 직접 하지 않고 함수를 호출하는 것으로 작업이 가능하다는 의미이다. 특히 대형 프로젝트에서는 객체들은 한 사람이 설계하는 것이 아니기 때문에 다른 사람이 작성한 것을 읽고 완벽히 이해한다는 것은 매우 어렵다.   

 

클래스(class)

C++ 에서 객체를 만들 수 있는 장치를 준비하였는데, 바로 클래스(class)이다. C++에서 이와 같이 클래스를 이용해서 만들어진 객체를 인스턴스(instance) 라도 부른다. 클래스 상에서 이들을 지칭할 때 각각 멤버 변수(member varialbe)와 멤버 함수(member function)라고 부른다. 즉 인스턴스로 생성된 객체에서는 인스턴스 변수, 인스턴스 함수이고 클래스 상에서는 멤버 변수 멤버 함수라고 부른다. 멤버 변수와 멤버 함수는 실재하는 것이 아니다. 인스턴스가 만들어져야 비로소 생성된다. 

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
 
#include <iostream>
 
class Dog
{
private:
    char age;
    bool happy;
 
public:
    bool IsHappy()
    {
        return happy;
    }
 
public:
    Dog()
        :age(0)
        ,happy(true)
    {}
    ~Dog()
    {}
};
 
int main(void)
{
    Dog mydog;
    mydog.IsHappy();
}
 
cs
접근 지시자
접근 지시자는 외부에서 클래스의 멤버들에게 접근을 할 수 있냐 없냐를 지시해준다. private 키워드의 경우, 아래에 쓰여진 것들은 모두 객체 내에서 보호하고 있다는 의미이다. public은 공개된 것으로 외부에서 마음껏 이용이 가능하다. 참고로 키워드를 명시하지 않았다면 기본적으로 class 에서는 private 로 struct에서는 public 으로 설정된다. 

 

생각해보기

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
77
78
79
80
 
#include <iostream>
 
class Date {
    int year_;
    int month_;  // 1 부터 12 까지.
    int day_;    // 1 부터 31 까지.
 
public:
    void SetDate(int year, int month, int date);
    void AddDay(int inc);
    void AddMonth(int inc);
    void AddYear(int inc);
 
    void ShowDate();
    
private:
    void Modify();
};
 
void Date::SetDate(int year, int month, int date)
{
    year_ = year;
    month_ = month;
    day_ = date;
}
 
void Date::AddDay(int inc)
{
    day_ += inc;
    Modify();
}
 
void Date::AddMonth(int inc)
{
    month_ += inc;
    Modify();
}
 
void Date::AddYear(int inc)
{
    year_ += inc;
}
 
void Date::ShowDate()
{
    std::cout << year_ << "년 " << month_ << "월 " << day_ << "일 입니다.";
}
 
void Date::Modify()
{
    while (true)
    {
        // 월 
        // 31일 1월 3 5 7 8 10 12
        if (day_> 31 && (month_ == 1 || month_ == 3 || month_ == 5 || month_ == 7 
            || month_ == 8 || month_ == 10 && month_ == 12))
        {
            day_ -= 31;
            ++month_;
        }
        // 30일 4 6 9 11
        if (day_ > 30 && (month_ == 4 || month_ == 6 || month_ == 9 || month_ == 11))
        {
            day_ -= 30;
            ++month_;
        }
        if (year_ % 4 == 0 && day_> 29)
        {
            ++month_;
            day_ -= 29;
        }
 
        if (year_ % 4 != 0 && day_ > 28)
        {
            ++month_;
            day_ -= 28;
        }
    }
}
cs

'개인공부 > C++' 카테고리의 다른 글

복사 생성자, 소멸자 정리  (0) 2023.03.20
함수의 오버로딩, 생성자 정리  (0) 2023.03.19
참조자 공부 내용 정리  (1) 2023.03.17
범위 기반 for 문(range-based for statement)  (0) 2023.03.14
new 이중 배열 선언  (0) 2023.03.06