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

+ Recent posts