클래스 개념 :
부류를 형성하는 데이터들을 하나로 묶으며 그 데이터를 조작할 루틴, 함수들을 포함한다.
클래스의 장점 :
1. 데이터 은닉(information Hiding) : 정보를 은닉할수 있다.
2. 데이터 캡슐화(Encapsulation) : 같은 부류의 데이터와 메소드들을 묶어서 프로그래밍 할 수 있다.
클래스의 구성 : 데이터(멤버변수) + 메소드(멤버 함수)
클래스의 접근 :
1. public :
어느곳에서의 접근도 허용한다.
(멤버변수에 접근하는 검증된 메소드들을 public 로 선언한다)
2. private :
클래스 내부에서의 접근만 허용한다.
즉, 클래스 외부에서의 접근은 금지한다.(데이터 은닉을 위해 멤버변수를 private 로 선언한다)
클래스의 사용 :
클래스를 사용하기 위해선
정의된 클래스로부터 객체(object)를 생성해야 한다.(인스턴스화한다)
즉, 설계도(클래스)로부터 우리가 사용할 물품(객체)을 만든다.
예)
int a; == clasEx objec 객체
(자료형) (변수명) (클래스명(자료형)) (객체(변수명))
클래스의 내부 데이터(멤버변수)와 메소드(멤버함수)에 접근하기 위해선
' . ' 으로 접근한다.
ex) clasEx.add();
멤버함수의 외부 정의 :
코드의 가독성을 위해 클래스 내부에는 멤버함수의 선언만 하며
정의는 외부에서 한다.
리턴형 클래스명::함수명(파라미터)
{
함수의 내용;
}
#include <iostream>
using namespace std;
class example
{
private:
int result;
public:
int add(int a, int b);
};
void main()
{
example Ex;
cout<<Ex.add(5, 3);
}
int example::add(int a, int b)
{
result = a + b;
return result;
}
생성자와 소멸자 :
생성자(Constructor) :
객체를 생성하자 마자 호출되는 함수이다.(즉, 사용자에 의한 호출이 아닌 컴퓨터에 의한 호출이다)
생성자는 함수명이 클래스명과 동일하며 리턴형을 가지지 않는다.
생성자를 따로 정의하지 않을시 컴파일러에 의해 디폴트 생성자가 자동으로 삽입되며 객체 생성시 호출되게 된다.
생성자는 클래스의 내부 멤버변수들을 초기화하거나 메모리를 할당하는데 사용한다.
소멸자(Destructor) :
객체가 소멸될시에 호출되는 함수이다.(즉, 사용자에 의한 호출이 아닌 컴퓨터에 의한 호출이다)
소멸자는 함수명이 ~클래스명 이며 리턴형을 가지지 않으며 매개변수도 받을수 없다.
소멸자를 따로 정의하지 않을시 컴파일러에 의해 디폴트 생성자가 자동으로 삽입되며 객체 소멸시 호출되게 된다.
객체생성으로 인해서 할당된 메모리를 반환하는데 사용한다.
클래스 프로그래밍 :
1. 멤버변수 구상 :
사용할 멤버변수를 구상하여 선언한다.
2. 멤버함수 구상 :
멤버함수는 크게 두가지로 나누어 구상한다.
멤버변수값을 조작할 함수(일반적으로 가독성을 위해 접두사로 set 을 붙인다)
멤버변수값을 얻어올 함수(일반적으로 가독성을 위해 접두사로 get 을 붙인다)
실제 일을 할 함수
3. 헤더파일 정의 :
사용할 레퍼런스의 선언이 들어가 있는 헤더파일
클래스 정의
사용할 함수 선언
들을 포함한 헤더파일을 작성한다.
4. 함수정의 :
사용할 함수들을 정의한 소스파일을 작성한다.
5. 메인 정의 :
실제 프로그램의 메인 함수가 정의된 소스파일을 작성한다.
예제)
4칙연산이 가능한 계산기를 클래스로 작성
// Calculator.h
#include <iostream>
using namespace std;
class Calculator // 클래스 선언
{
private:
double add; // 덧셈 결과를 저장할 멤버변수
double sub; // 뺄셈 결과를 저장할 멤버변수
double mul; // 곱셈 결과를 저장할 멤버변수
double div; // 나눗셈 결과를 저장할 멤버변수
public:
Calculator(); // 생성자
void setfirst(); // 맴버변수를 초기화할 멤버함수
void addfunc(double num1, double num2); // 덧셈을 수행할 멤버함수
void subfunc(double num1, double num2); // 뺄셈을 수행할 멤버함수
void mulfunc(double num1, double num2); // 곱셈을 수행할 멤버함수
double divfunc(double num1, double num2); // 나눗셈을 수행할 멤버함수
// 함수리턴값을 보여주기 위해 일부로 double 선언
void getresult(); // 결과값을 얻어올 멤버함수
~Calculator(); // 소멸자
};
// CalculatorFunc.cpp
#include "Calculator.h"
Calculator::Calculator()
{
cout<<"객체가 생성됬습니다. 전 생성자에요"<<endl;
}
void Calculator::setfirst()
{
add = 0;
sub = 0;
mul = 0;
div = 0;
}
void Calculator::addfunc(double num1, double num2)
{
add = num1 + num2;
cout<<"함수의 리턴형을 void 로 할때는 이렇게 함수 내부에서"<<endl;
cout<<"cout를 사용하여 결과값을 보여줍니다."<<endl;
cout<<"덧셈결과 : "<<add<<endl;
}
void Calculator::subfunc(double num1, double num2)
{
sub = num1 - num2;
}
void Calculator::mulfunc(double num1, double num2)
{
mul = num1 * num2;
}
double Calculator::divfunc(double num1, double num2)
{
if(num2 == 0) // 나누는수가 0일경우에 대한 예외처리
{
return -1;
}
div = num1 / num2;
return div;
}
void Calculator::getresult()
{
cout<<"계산결과입니다"<<endl;
cout<<"덧셈 결과 : "<<add<<endl;
cout<<"뺄셈 결과 : "<<sub<<endl;
cout<<"곱셈 결과 : "<<mul<<endl;
cout<<"나눗셈 결과 : "<<div<<endl;
}
Calculator::~Calculator()
{
cout<<"전 소멸자에요. 이제 이 객체는 소멸됩니다"<<endl;
}
// CalculatorMain.cpp
#include "Calculator.h"
int main()
{
Calculator Cal;
Cal.setfirst();
double num1, num2;
cout<<"사칙연산이 가능한 계산기입니다."<<endl;
while(1)
{
cout<<"첫번째 수를 입력하세요 : (프로그램 종료를 원하시면 0을 입력)";
cin>>num1;
if(num1==0)
{
break;
}
cout<<"두번째 수를 입력하세요 : "<<endl;
cin>>num2;
Cal.addfunc(num1, num2);
Cal.subfunc(num1, num2);
Cal.mulfunc(num1, num2);
cout<<Cal.divfunc(num1, num2); // 리턴이 존재하므로 값을 출력할 수 있다.
Cal.getresult();
}
return 0;
}