01. Defining a Class
Object-Oriented Programming
๊ฐ์ฒด์งํฅ ์ค๊ณ (object-oriented design)
ํด๋์ค-๊ฐ์ฒด-์ธ์คํด์ค์ ์ฐจ์ด
- Class๋?
- ๊ฐ๋
- Object๋ฅผ ๋ง๋ค์ด ๋ด๊ธฐ ์ํ ์ค๊ณ๋ ํน์ ํ
- ์ฐ๊ด๋์ด ์๋ Variable๊ณผ Method์ ์งํฉ
- Object๋?
- ๊ฐ๋
- ์ํํธ์จ์ด ์ธ๊ณ์ ๊ตฌํํ ๋์
- Class์ ์ ์ธ ๋ ๋ชจ์ ๊ทธ๋๋ก ์์ฑ๋ ์ค์ฒด
- ํน์ง
- โClass์ Instanceโ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
- Object๋ ๋ชจ๋ Instance๋ฅผ ๋ํํ๋ ํฌ๊ด์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
- OOP์ ๊ด์ ์์ Class์ ํ์
์ผ๋ก ์ ์ธ๋์์ ๋ โObjectโ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- Instance๋?
- ๊ฐ๋
- ์ค๊ณ๋๋ฅผ ๋ฐํ์ผ๋ก ์ํํธ์จ์ด ์ธ๊ณ์ ๊ตฌํ๋ ๊ตฌ์ฒด์ ์ธ ์ค์ฒด
- ์ฆ, ๊ฐ์ฒด๋ฅผ ์ํํธ์จ์ด์ ์ค์ฒดํ ํ๋ฉด ๊ทธ๊ฒ์ โInstanceโ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ค์ฒดํ๋ Instance๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค.
- ํน์ง
- Instance๋ Object์ ํฌํจ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
- OOP์ ๊ด์ ์์ Object๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋์ด ์ค์ ์ฌ์ฉ๋ ๋ โinstanceโ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ถ์์ ์ธ ๊ฐ๋
(๋๋ ๋ช
์ธ)๊ณผ ๊ตฌ์ฒด์ ์ธ Object ์ฌ์ด์ ๊ด๊ณ์ ์ด์ ์ ๋ง์ถ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- โ~์ instanceโ์ ํํ๋ก ์ฌ์ฉ๋๋ค.
- Object๋ Class์ Instance์ด๋ค.
- Object ๊ฐ์ ๋งํฌ๋ Class ๊ฐ์ ์ฐ๊ด ๊ด๊ณ์ Instance์ด๋ค.
- ์คํ ํ๋ก์ธ์ค๋ ํ๋ก๊ทธ๋จ์ Instance์ด๋ค.
- ์ฆ, Instance๋ผ๋ ์ฉ์ด๋ ๋ฐ๋์ Class์ Object ์ฌ์ด์ ๊ด๊ณ๋ก ํ์ ์ง์ด ์ฌ์ฉํ ํ์๋ ์๋ค.
- ์ธ์คํด์ค๋ ์ด๋ค ์๋ณธ(์ถ์์ ์ธ ๊ฐ๋
)์ผ๋ก๋ถํฐ โ์์ฑ๋ ๋ณต์ ๋ณธโ์ ์๋ฏธํ๋ค.
Reusability in OOP
- ์๋ก์ด ํด๋์ค ์์ฑ ๋๋ ํ๋ก๊ทธ๋จ ์์ฑ์ ๊ธฐ์กด ํด๋์ค์ ์ฌ์ฌ์ฉ์ ์๊ฐ๊ณผ ๋
ธ๋ ฅ์ ์ค์ฌ์ค๋ค.
- ์ฌ์ฌ์ฉ์ ๋ํ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ ์ ๋ขฐ์ฑ ์๊ณ ํจ์จ์ ์ธ ์์คํ
์ ๊ตฌ์ถํ ์ ์๋๋ก ๋๋๋ค.
Defining a Class
ํด๋์ค ์ ์ (class definition)
- ์ปดํ์ผ๋ฌ์๊ฒ ํด๋์ค์ ์ํ ๋ฉค๋ฒํจ์์ ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ฅผ ์๋ ค์ค๋ค.
- ํด๋์ค์ ์ด๋ฆ์ class ํค์๋์ ํจ๊ป ์ฌ์ฉํ์ฌ ์์ํ๋ค.
- ํด๋์ค์ ๋ณธ๋ฌธ(body)์ ๋๊ดํธ ์์ ์์ฑ๋์ด์ผ ํ๋ค.
{ }
- ๋ฐ์ดํฐ ๋ฉค๋ฒ(๋ฉค๋ฒ ๋ณ์)์ ๋ฉค๋ฒ ํจ์์ ๋ช
๊ธฐ
- ์ ๊ทผ ์ง์ ์ (access-specifier).
public :
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
class GradeBook {
public:
//function overloading
void displayMessage() {
cout << "Welcome to the GradeBook" << endl;
}
void displayMessage(string str) {
cout << str<< endl;
}
};
int main() {
GradeBook myGradeBook;
myGradeBook.displayMessage();
myGradeBook.displayMessage("Welcome");
myGradeBook.displayMessage("to");
myGradeBook.displayMessage("the");
myGradeBook.displayMessage("GradeBook");
return 0;
}
๋ฉค๋ฒ ํจ์ (member function) ์ ์
- ํจ์์ ๋ฐํํ (return type)
- ํจ์๊ฐ ์ข
๋ฃ๋์์ ๋ ๋ฐํํ ๊ฐ์ ์๋ฃํ (์ผ๋ฐ์ ์ธ ํจ์์ ๊ฐ์ ์๋ฏธ)
void
๋ ํจ์๊ฐ ์๋ฌด๋ฐ ๊ฐ๋ ๋ฐํํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธ
- ํจ์ ๋ณธ๋ฌธ์ ํจ์๊ฐ ์ด๋ค ์ผ์ ์ํํ๋์ง ๊ธฐ์ ํจ
- ์ค๊ดํธ
{}
์ ์ํด ์ ํ๋๋ค.
ํด๋์ค ์ฌ์ฉ
- ํด๋์ค๋ ์ฌ์ฉ์ ์ ์ ์๋ฃํ (user-defined type)
- C++ ๊ฐ์ฒด์์ฑ์ ์ฌ์ฉ
- dot operator ( . )
- ๊ฐ์ฒด์ ๋ฉค๋ฒ ํจ์ ๋ฐ ๋ฐ์ดํฐ ๋ฉค๋ฒ์ ์ ๊ทผ์ ์ฌ์ฉ๋๋ค.
Defining a Member Function with a Parameter
๋งค๊ฐ๋ณ์์ ์ธ์
ํจ์ ๋งค๊ฐ๋ณ์ (parameter)
: ํจ์๊ฐ ์
๋ฌด๋ฅผ ์คํํ๋๋ฐ ํ์ํ ์ ๋ณด
ํจ์ ์ธ์ (argument)
: ํจ์์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ํด ํจ์ ํธ์ถ์ ๊ณต๊ธ๋ ๊ฐ
- ์ธ์ ๊ฐ์ ํจ์ ๋งค๊ฐ๋ณ์๋ก ๋ณต์ฌ๋๋ค.
๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ (parameter lists)
- ํจ์ ์ด๋ฆ ๋ค์ ()์์ ์์นํ์ฌ ํจ์๊ฐ ์คํ๋๋๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ๋๊ฒจ๋ฐ์
- ์ฌ๋ฌ๊ฐ์ ๋งค๊ฐ๋ณ์๋
,
์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ ์์์ ๊ฐ์๊ฐ ๊ฐ๋ฅ
- ํจ์ ์ธ์์ ๊ฐ์์ ์์, ์๋ฃํ์ ํจ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์, ์์, ์๋ฃํ๊ณผ ์ผ์นํด์ผ ํจ
Defining a function parameter again as a local variable in the function is a compilation error.
Data Members
์ง์ญ๋ณ์์ ๋ฉค๋ฒ๋ณ์
์ง์ญ ๋ณ์ (local variables)
- ํจ์ ์์์ ์ ์ธ๋ ๋ณ์
- ํจ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
- ํจ์๊ฐ ์๋ฉธ๋ ๋ ๊ฐ์ด ์๋ฉธ๋๋ค.
๋ฉค๋ฒ ๋ณ์ (member variables)
- ๊ฐ์ฒด๊ฐ ์ด์์๋ ๋์๋ง ์กด์ฌ
- ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ก ํํ
- ํด๋์ค ์ ์์ ์ ์ธ๋ ๋ณ์
์ ๊ทผ ์ง์ ์
์ ๊ทผ ์ง์ ์ private
- ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ ๋ฉค๋ฒ ํจ์์ ์ค์ง ๊ฐ์ ํด๋์ค์ ๋ฉค๋ฒ ํจ์๋ก๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค.
private
์ ํด๋์ค ๋ฉค๋ฒ์ ๊ธฐ๋ณธ (default) ์ ๊ทผ ์ง์ ์
- ์๋ฃ ์๋ (์๋ฃ์ ์บก์ํ)
- default ์์ฑ์ private์ด๋ค.
๊ธฐํ ์ ๊ทผ ์ง์ ์
set Functions and get Functions
์ํํธ์จ์ด๊ณตํ๊ณผ set, get ํจ์
- public ๋ฉค๋ฒํจ์๋ก ์ ์ธ
- private ๋ฐ์ดํฐ ๋ฉค๋ฒ์ ๊ฐ์ ์ค์ (set) ๋๋ ์ฝ์(get) ์ ์๋๋ก ์ ์๋ ์ธํฐํ์ด์ค ์ญํ
- ํด๋์ค์ ์ค๊ณ์๋
private
๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ์ํด์ผ ํจ
- ํด๋์ค์ ๋ชจ๋ private ๋ฉค๋ฒ๋ set, get ํจ์๋ฅผ ํตํด ์ ๊ทผํด์ผ ํจ
Initializing Objects with Constructors
ํด๋์ค ์์ฑ์ (constructor)
UML diagram
์์ฑ๋ฐฉ๋ฒ
- ํจ์์ ๋ฐํํ์ ํจ์ ์ด๋ฆ๊ณผ
()
๋ค์ :
์ ๋ถ์ด๊ณ ๋ฐํํ์ ๋ช
์
-
๊ธฐํธ๋ private
๋ฉค๋ฒ๋ฅผ, +
๊ธฐํธ๋ public
๋ฉค๋ฒ๋ฅผ ์๋ฏธ
UML์์ ํด๋์ค ์์ฑ์ ํ๊ธฐ
- ์ธ๋ฒ์งธ ์น์
์ ๋ฑ์ฅํ๋ฉฐ
<<constructor>>
๋ผ๊ณ ๋ช
๊ธฐํ์ฌ ์ผ๋ฐ ๋ฉค๋ฒํจ์์ ๊ตฌ๋ถ
- ์ผ๋ฐ์ ์ผ๋ก ๋ฉค๋ฒํจ์๋ณด๋ค ์์ ์์นํจ
Separating .h
and .cpp
Files
์ฉ๋์ ๋ฐ๋ฅธ ํ์ผ์ ๋ถ๋ฆฌ
.cpp
๋ ์์ค์ฝ๋ ํ์ผ๋ก ์๋ ค์ ธ ์๋ค.
- ํด๋์ค ์ ์ธ๋ถ๊ฐ ์์นํ๋ฉฐ, ์์ค ํ์ผ๊ณผ ๋ณดํต ๋ถ๋ฆฌ๋จ
- ํด๋์ค๊ฐ ์ด๋์์ ์ฌ์ฉ๋๋๋ผ๋ ์ปดํ์ผ๋ฌ๊ฐ ํด๋์ค๋ฅผ ์ธ์ํ ์ ์๋๋ก ํด์ค๋ค.
- ์ผ๋ฐ์ ์ผ๋ก
.h
ํ์ฅ์๋ฅผ ๊ฐ์ง๋ค.
๋๋ผ์ด๋ฒ ํ์ผ (driver files)
- ์์ฑํ ํด๋์ค๋ ํจ์๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋จ
- ์คํ ๋ ์ ์๊ฒ ํ๊ธฐ ์ํด ํ๋์
main
ํจ์๋ฅผ ํฌํจ
๋๋ผ์ด๋ฒ cpp ํ์ผ ์์
#include <iostream>
using std::cout;
using std::endl;
#include "GradeBook.h"
int main()
{
GradeBook gradeBook1("CS101 introduction to C++ Programming");
GradeBook gradeBook2("CS102 Data Structures in C++");
cout << "gradeBook1 created for course: " << gradeBook1.getCourseName()
<< "\ngradeBook2 created for course: " << gradeBook2.getCourseName()
<< endl;
return 0;
}
#include
์ ์ฒ๋ฆฌ๊ธฐ ์ง์์
- ํค๋ ํ์ผ์ ํฌํจ(include)ํ๊ธฐ ์ํด ์ฌ์ฉ๋จ
- C++ ์ ์ฒ๋ฆฌ๊ธฐ๋ ์ด ์ง์์๋ฅผ ํค๋ํ์ผ๋ก ๋ฐ๊ฟ์น๊ธฐ ํจ
- ์ฌ์ฉ์๊ฐ ์์ฑํ ํค๋ํ์ผ์ ํฌํจํ ๋๋
โ โ
๋ฅผ ์ด์ฉ
- ์:
#includeโmyclass.hโ
- C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ ๋๋
<>
๋ฅผ ์ด์ฉ
์ปดํ์ผ ๊ณผ์ ์์ ํค๋ ํ์ผ์ ์ญํ
- ์ปดํ์ผ๋ฌ๋ ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์์์ผ ํ๋ค.
- C++ ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ง ํฌํจํ๋ค.
- ์ปดํ์ผ๋ฌ๋ ์ค์ง ํ๋์ ํด๋์ค ๋ฉค๋ฒ ํจ์์ ๋ณต์ฌ๋ณธ์ ์์ฑ (๊ณต์ )
- ์ด ๋ณต์ฌ๋ณธ์ ๋ชจ๋ ํด๋์ค ๊ฐ์ฒด์์ ๊ณต์
- ์) 4๊ฐ์ ์ ์ํ ๋ฐ์ดํฐ ๋ฉค๋ฒ์ 2๊ฐ์ ๋ฉค๋ฒ ํจ์๋ฅผ ๊ฐ์ง ํด๋์ค ๊ฐ์ฒด
- 16๋ฐ์ดํธ (๋ฐ์ดํฐ ๋ฉค๋ฒ)์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง
- ์ปดํ์ผ๋ฌ๋ ํค๋ ํ์ผ์ ํตํด ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์์๋ด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํจ.
Separating Interface from Implementation
์ธํฐํ์ด์ค (interface)
- ์ฌ์ฉ์๊ฐ ์ด๋ค (which) ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ป๊ฒ (how) ๊ทธ ์๋น์ค๋ฅผ ์์ฒญํ๋์ง ์ ์๋ ์ฝ์
- ๊ทธ๋ฌ๋ ํด๋์ค๊ฐ ์ด๋ป๊ฒ (how) ์๋น์ค๋ฅผ ์ํํ๋์ง์ ๊ดํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ ์์
- ๋ฉค๋ฒ ํจ์ ์ด๋ฆ, ๋ฐํํ๊ณผ ๋งค๊ฐ๋ณ์ํ๋ง์ผ๋ก ์ ์๋จ
- ํจ์ ์ํ (function prototype)
- ํด๋์ค์ ์ธํฐํ์ด์ค๋ ํด๋์ค์
public
๋ฉค๋ฒ ํจ์๋ก ์ ์๋๋ค.
๊ตฌํ(implementation)๊ณผ ์ธํฐํ์ด์ค์ ๋ถ๋ฆฌ
- ํด๋์ค์ ํค๋ ํ์ผ (
.h
)
- ๋ฉค๋ฒ ํจ์์ ์ํ์ ํด๋์ค์ public ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ์ ํจ
- ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ๋ด์ฉ์ ์จ๊ฒจ์ง๋ค.
- ํด๋ผ์ด์ธํธ ์ฝ๋๋ ๊ตฌํ ์ ๋ณด๋ฅผ ํ์๋ก ํ์ง์๊ณ , ์
์ถ๋ ฅ๋ง ํ์๋กํจ.
- ํด๋์ค์ ์์ค์ฝ๋ ํ์ผ (
.cpp
)
- ๋ณ๋์ ์์ค์ฝ๋ ํ์ผ์์ ํด๋์ค ๋ฉค๋ฒํจ์๋ฅผ ๊ตฌํํ๋ค.
- Binary scope resolution operator (
::
)๋ฅผ ์ด์ฉํ์ฌ ํด๋์ค ์ด๋ฆ๊ณผ ๋ฉค๋ฒ ํจ์์ ์ ์๋ฅผ ์ฐ๊ฒฐ
- ์:
voidGradeBook::displayMessage()
์ปดํ์ผ
- ์์ค์ฝ๋ ํ์ผ์ ์ปดํ์ผ ๋์ด ํด๋์ค ๋ชฉ์ ์ฝ๋(object code,
*.obj
)๋ฅผ ์์ฑํ๋ค.
- ํด๋์ค๋ฅผ ๊ตฌํํ๋ ํ๋ก๊ทธ๋๋จธ๋ ํค๋ํ์ผ(
*.h
)๊ณผ ๋ชฉ์ ์ฝ๋ (*.obj
)๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํด ์ฃผ๋ฉด ๋จ (๋ชฉ์ ์ฝ๋๋ ๊ธฐ๊ณ์ด)
- ํด๋ผ์ด์ธํธ๋ ์์ ์ ์ฝ๋์ ๋ฐ๋์
#include
โํค๋ํ์ผโ ์ ์ ์ธํ์ด์ผ ํ๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ํด๋์ค์ ์กด์ฌ๋ฅผ ๋ชจ๋ฆ
- ํจ์์ ์ํ์ด ์ ์ธ๋ ํค๋ ํ์ผ์ includeํ๋ ์๋ฆฌ์ ๊ฐ์
Validating Data with set Functions
private ๋ฉค๋ฒ์ ๋ํ set ํจ์์ ์ฉ๋
- set ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆ(validation) ํ ์ ์๋ค.
- ์ ํจ์ฑ ๊ฒ์ฌ(validity checking)๋ก ์๋ ค์ ธ ์๋ค.
- ๊ฐ์ฒด๋ฅผ ์์ ์ ์ธ ์ํ๋ก ์ ์ง
- ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ ์ ํจํ ๊ฐ๋ง์ ๊ฐ์ง
- ์ ํจํ์ง ์์ ๊ฐ์ผ๋ก ์ค์ ํ ๊ฒฝ์ฐ,์ค๋ฅ์ ํด๋น๋๋ ์ฝ๋๋ฅผ ๋ฆฌํดํ ์ ์์