1. 클래스의 개념
클래스(class)란 객체(object)를 정의하는 틀 혹은 설계도이다. 클래스 내에는 이 클래스 내부에 사용 할 수 있는 맴버 변수와 맴버 함수를 선언한다.
클래스를 만들때는 선언부와 구현부를 만들어준다.
클래스의 선언부의 마지막에는 반드시 세미콜론(;)을 붙여준다.
2. 객체의 개념
객체(object)란 클래스라는 틀에서 찍어내어, 맴버 변수 메모리와 햄버 함수 코드를 실제 가지고 프로그램이 실행되는 동안 실존하는 실체 혹은 인스턴스(instance)이다.
객체를 생성하는 방법 중 한가지 : 클래스이름 + 객체이름
ex) Circle 클래스 donut객체를 만드는 방법은 Circle donut; 처럼 만들면 된다.
3. 캡슐화의 개념
캡슐화(encapsulation)란 객체의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것으로, 객체의 가장 본질적인 특징중 하나이다.
한마디로 객체는 캡슐화를 통해 외부의 접근을 통제하여 자신의 내부 요소들을 보호한다.
4. 클래스작성 예(예제3-1, 소스코드, 주석)
예제 3-1 코드
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//클래스 정의하는 위치는 maim() 함수 위에 적는다. (클래스는 설계도 이기 때문이다.)
class Circle{ //클래스의 선언부
public:
int radius; //맴버변수
double getArea(); //맴버함수
};
//클래스의 구현부
double Circle::getArea(){ // 맴버함수 구현시 반드시 :: 범위지정연산자를 붙여준다.
return 3.14*radius*radius; // 범위지정연산자는 해당 함수가 어디에 속하는지를 알 수 있게 해준다.
}
int main(int argc, char** argv) {
//객체생성방법1 (클래스이름 + 객체이름)
Circle donut;
//생성된 객체로 맴버에 접근하는 방법은 객체이름에 . 연산자를 사용하여 맴버변수를 쓴다.
donut.radius = 1; // 맴버함수에 접근하는 방법 (객체이름 + . + 맴버변수)
double area = donut.getArea(); //면적을 계산하는 맴버함수를 이용하여 계산한 면적을 area 변수에 저장한다.
cout << "donut 면적은 " << area << endl;
Circle pizza;
pizza.radius = 30;
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
return 0;
}
예제 3-1 내코드
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//클래스 정의하는 위치는 maim() 함수 위에 적는다. (클래스는 설계도 이기 때문이다.)
class Circle{ //클래스의 선언부
public:
int radius; //맴버변수
double getArea(); //맴버함수
};
//클래스의 구현부
double Circle::getArea(){ // 맴버함수 구현시 반드시 :: 범위지정연산자를 붙여준다.
return 3.14*radius*radius; // 범위지정연산자는 해당 함수가 어디에 속하는지를 알 수 있게 해준다.
}
int main(int argc, char** argv) {
//객체생성방법1 (클래스이름 + 객체이름)
Circle donut;
Circle pizza;
//생성된 객체로 맴버에 접근하는 방법은 객체이름에 . 연산자를 사용하여 맴버변수를 쓴다.
donut.radius = 1; // 맴버함수에 접근하는 방법 (객체이름 + . + 맴버변수)
double area = donut.getArea(); //면적을 계산하는 맴버함수를 이용하여 계산한 면적을 area 변수에 저장한다.
cout << "도넛의 면적은 " << area << endl;
pizza.radius = 10;
double area2 = pizza.getArea();
cout << "피자의 면적은 " << area2 << endl;
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//클래스 정의하는 위치는 maim() 함수 위에 적는다. (클래스는 설계도 이기 때문이다.)
class Circle{ //클래스의 선언부
public:
int radius; //맴버변수
double getArea(); //맴버함수
Circle(); //기본생성자함수
Circle(int r);
};
//클래스의 구현부
Circle::Circle(){
radius = 1;
cout << "기본생성자함수 실행" << endl;
cout << "반지름 " << radius << endl;
}
Circle::Circle(int r){
radius = r;
cout << "매개변수 1개 있는 생성자함수 실행" << endl;
cout << "반지름 " << radius << endl;
}
double Circle::getArea(){ // 맴버함수 구현시 반드시 :: 범위지정연산자를 붙여준다.
return 3.14*radius*radius; // 범위지정연산자는 해당 함수가 어디에 속하는지를 알 수 있게 해준다.
}
class Rectangle{
public:
int width,height;
double getArea();
};
double Rectangle::getArea(){
return width*height;
}
int main(int argc, char** argv) {
/*
//객체생성방법1 (클래스이름 + 객체이름)
Circle donut;
//생성된 객체로 맴버에 접근하는 방법은 객체이름에 . 연산자를 사용하여 맴버변수를 쓴다.
donut.radius = 1; // 맴버함수에 접근하는 방법 (객체이름 + . + 맴버변수)
double area = donut.getArea(); //면적을 계산하는 맴버함수를 이용하여 계산한 면적을 area 변수에 저장한다.
cout << "donut 면적은 " << area << endl;
Circle pizza;
pizza.radius = 30;
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
*/
/*
Rectangle rect;
rect.width=3;
rect.height=5;
cout << "사각형의 면적은 " << rect.getArea() << endl;
*/
//생성자함수는 객체가 생성될때 자동으로 호출되는 함수이다.
//생성자함수의 이름은 클래스이름과 같은 이름을 쓴다.
Circle donut; //donut 객체 생성은 매개변수가 없는 객체를 생성하였다는 것이고
//매개변수가 없는 객체를 생성할때에는 기본 생성자 함수를 호출한다.
Circle pizza(30); //매개변수가 하나 있는 객체를 생성한다.
return 0;
}
5. 생성자함수
(1) 생성자 함수란?
생성자 함수란 객체를 초기화 시켜주는 함수이다.
(2) 생성자 함수의 특징
생성자 함수의 목적인 객체의 생성시 초기화 작업을 해준다. 객체가 만들어질때 이미 그 객체 내에 garbage 값이 들어가 있는데 이를 초기화 시켜준다.
생성자 함수는 오직 한 번만 실행이 된다. 그 시점은 객체가 생성되는 시점이다.
생성자 함수는 클래스 이름과 동일하게 작성이 되어진다.
생성자 함수를 정의 할 때 함수의 원형에 리턴 타입을 선언하지 않는다. 리턴 타입이 없어서 void 타입을 설정해서도 안된다.
생성자는 중복이 가능하며 오버로딩이 가능하다. 단 매개 변수의 개수나 타입이 서로 다르게 선언되어야 허용 된다.
(3) 기본생성자가 자동으로 생성되는 경우의 예
자동으로 만들어질 때는 생성자가 하나도 없는 클래스의 객체를 만들시 보이지 않는 기본 생성자에 의해서 만들어진다.
(4) 기본생성자가 자동으로 생성되지 않는 경우의 예
생성자가 하나라도 선언된 클래스의 경우 기본 생성자를 자동으로 삽입하지 않는다.
6. 소멸자함수
(1) 실행되는 시점
생성된 객체가 다 활용되고 메모리를 반환하게 되는데 객체가 생성이 되면 다 쓰이고 소멸이 된다. 정확히는 객체가 소멸되는 시점에서 자동으로 호출된다.
(2) 소멸자함수의 특징(5가지)
- 소멸자는 객체가 사라질 때 필요한 마무리 작업을 해준다. (객체가 사라지기 전에 필요한 조치를 해준다. 동적으로 할당받은 메모리를 돌려주거나 열어 놓은 파일등을 닫는 것과 같은 일들)
- 소멸자를 쓸 때엔 소멸자 클래스의 이름 앞에 ~를 붙인다.
- 소멸자는 리턴 타입이 없고 어떤 값도 리턴해서는 안된다.
- 생성자완 달리 소멸자는 오직 한 개만 존재한다.(매개 변수도 가지지 않는다.)
- 소멸자가 선언되어 있지 않으면 기본 소멸자가 자동으로 생성된다.
(3) 소멸자함수의 실행 예:역순으로 실행되는 과정을 확인
소멸자 함수는 객체가 만들어진 순서의 역순으로 실행된다.
#include <cstdlib>
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
Circle(); // 기본 생성자
Circle(int r); // 매개 변수 있는 생성자
~Circle(); //소멸자 함수
double getArea();
};
Circle::~Circle(){ //소멸자 함수 구현
cout << "반지름 " << radius << "원 소멸 " << endl;
system("PAUSE");
}
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
double Circle::getArea() {
return 3.14*radius*radius;
}
int main(int argc, char *argv[])
{
Circle donut; // 매개 변수 없는 생성자 호출
double area = donut.getArea();
cout << "donut 면적은 " << area << endl;
Circle pizza(30); // 매개 변수 있는 생성자 호출
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
'basic > C++' 카테고리의 다른 글
6. 함수중복과 static멤버 (0) | 2018.05.15 |
---|---|
5. 함수와 참조, 복사생성자 (0) | 2018.05.03 |
4. 객체 포인터와 객체배열, 객체의 동적생성 (0) | 2018.04.10 |
2. C++ 프로그래밍의 기본 (0) | 2018.03.13 |
1. C++ 시작 (0) | 2018.03.08 |