목차
0. 추상화란?
1. 클래스란?
2. 클래스 생성자
3. 클래스 파괴자
0. 추상화란?
- 어떠한 객체를 사실적으로 표현하는 것이 아니라, 공통된 특징을 간결한 방식으로, 이해하기 쉽게 표현하는 것
- c++에서 추상화 중요하다!
1. 클래스란?
- 추상화를 사용자 정의 데이터형으로 변환해주는 수단
- 같은 타입이면 서로 대입 가능 (마치 string)
1-1) stock_structure.h (헤더파일)
//클래스 선언 & 클래스 메서드 정의
#ifndef FIRE_C_STOCK_STRUCTURE_H
#define FIRE_C_STOCK_STRUCTURE_H
#include <iostream>
using namespace std;
class Stock {
private:
//private member의 값을 변경하려면 public에 선언된 함수를 통해서만이 가능
//private member에는 '직접' 접근할 수 없음 : 데이터 은닉
string name;
int shares;
float share_val;
double total_val; //double: float과 같이 실수를 표현하되 더 넓은 범위를 표현함
void set_total() {total_val = shares * share_val;}
//private에서 함수 포함 가능
public: //public member 함수: private member의 값을 변경할 수 있는 단위
void acquire(string, int, float);
void buy(int, float);
void sell(int, float);
void update(float);
void show();
};
//사용 범위 결정 연산자 ::
void Stock::acquire(string co, int n, float pr) {
name = co;
shares = n;
share_val = pr;
set_total();
}
void Stock::buy(int n, float pr) {
shares += n;
share_val += pr;
set_total();
}
void Stock::sell(int n, float pr) {
shares -= n;
share_val -= pr;
set_total();
}
void Stock::update(float pr) {
share_val = pr;
set_total();
}
void Stock::show() {
cout << "회사 명 : " << name << endl;
cout << "주식 수 : " << shares << endl;
cout << "주가 : " << share_val << endl;
cout << "주식 총 가치 : " << total_val << endl;
}
#endif //FIRE_C_STOCK_STRUCTURE_H
1-2) main.cpp 소스파일
#include "stock_structure.h"
int main() {
Stock temp;
temp.acquire("Panda", 100, 1000);
temp.show();
temp.buy(10, 1200);
temp.show();
temp.sell(5, 800);
temp.show();
return 0;}
/*회사 명 : Panda
주식 수 : 100
주가 : 1000
주식 총 가치 : 100000
회사 명 : Panda
주식 수 : 110
주가 : 2200
주식 총 가치 : 242000
회사 명 : Panda
주식 수 : 105
주가 : 1400
주식 총 가치 : 147000*/
2. 클래스 생성자
2-1) 클래스 생성자 & default 클래스 생성자가 추가된 stock_structure.h
- 기존의 acquire함수 코드를 생성자 코드에 반영
- 생성자는 클래스 내 원형 선언 시 자료형을 쓰지 않아도 됨. 클래스 이름 그대로 사용.
#ifndef FIRE_C_STOCK_STRUCTURE_H
#define FIRE_C_STOCK_STRUCTURE_H
#include <iostream>
using namespace std;
class Stock {
private:
//private member의 값을 변경하려면 public에 선언된 함수를 통해서만이 가능
//private member에는 '직접' 접근할 수 없음 : 데이터 은닉
string name;
int shares;
float share_val;
double total_val; //double: float과 같이 실수를 표현하되 더 넓은 범위를 표현함
void set_total() {total_val = shares * share_val;}
//private에서 함수 포함 가능
public: //public member 함수: private member의 값을 변경할 수 있는 단위
void show();
Stock(string, int, float); //입력이 있는 생성자
// 기존의 acquire 함수 대체 //클래스 생성할 때 init하는 것들
Stock(); //Default 생성자
~Stock(); //파괴자
};
void Stock::show() {
cout << "회사 명 : " << name << endl;
cout << "주식 수 : " << shares << endl;
cout << "주가 : " << share_val << endl;
cout << "주식 총 가치 : " << total_val << endl << endl;
}
//Stock 클래스 내부에서 귀속되어 있음
/* 생성자 */
Stock::Stock(string co, int n, float pr){
name = co;
shares = n;
share_val = pr;
set_total();
}
/* Default 생성자 */
Stock::Stock(){
name = "None";
shares = 0;
share_val = 0;
set_total();
}
/* 파괴자 */
Stock::~Stock(){
}
#endif //FIRE_C_STOCK_STRUCTURE_H
2-2) 클래스 생성자 & default 클래스 생성자가 호출된 main.cpp 소스파일
#include "stock_structure.h"
int main() {
Stock temp = Stock("Panda", 100, 1000);
Stock temp2("another", 200, 2000);
Stock temp3; //default 생성자 //함수 오버로딩 사용
temp.show();
temp2.show();
temp3.show();
return 0;}
/*회사 명 : Panda
주식 수 : 100
주가 : 1000
주식 총 가치 : 100000
회사 명 : another
주식 수 : 200
주가 : 2000
주식 총 가치 : 400000
회사 명 : None
주식 수 : 0
주가 : 0
주식 총 가치 : 0*/
2-2-0) 클래스 생성자의 특징
리턴값을 가지지 않고 & 자료형이 별도로 없음
2-2-1) 클래스 생성자로 생성하는 방법에는 두 가지가 있음
(1) 클래스타입 클래스명 = 클래스타입(입력)
(2) 클래스타입 클래스명(입력)
2-2-2) Default 클래스 생성자는 '함수 오버로딩' 컨셉을 사용하는 것
** 생성자
Stock::Stock(string co, int n, float pr){
name = co;
shares = n;
share_val = pr;
set_total(); }
** Default 생성자
Stock::Stock(){
name = "None";
shares = 0;
share_val = 0;
set_total(); }
3. 클래스 파괴자
3-1) 클래스 파괴자의 특징
생성자의 반대. 객체의 수명이 끝나는 시점에서 파괴자가 자동으로 호출됨. (사용자가 직접 할 수 없음)
- 클래스 생성자와 마찬가지로 리턴값을 가지지 않고 & 자료형이 따로 없으며
- 추가로, 매개변수 입력을 가지지 않음
- 파괴하는 것 이외 아무것도 하는 일이 없으므로, 내부 코드가 필요 없음
3-2) 파괴자가 자동으로 호출되는 세 가지 경우
1) 스코프를 벗어났을때
2) new를 사용하여 객체를 생성하고 delete 하였을때
3) 임시 객체를 생성했을 경우에 프로그램은 객체의 사용을 마쳤을때
3-3) 파괴자가 필요한 이유
//헤더파일에서
public: //public member 함수: private member의 값을 변경할 수 있는 단위
void show();
Stock(string, int, float);
Stock();
~Stock(); //파괴자
};
// ... 헤더파일에서
///* 파괴자 */
Stock::~Stock(){
cout << name << " 클래스가 소멸되었습니다.\n" << endl;
}
main.cpp 실행 결과
>>>
회사 명 : Panda
주식 수 : 100
주가 : 1000
주식 총 가치 : 100000
회사 명 : another
주식 수 : 200
주가 : 2000
주식 총 가치 : 400000
회사 명 : None
주식 수 : 0
주가 : 0
주식 총 가치 : 0
None 클래스가 소멸되었습니다.
another 클래스가 소멸되었습니다.
Panda 클래스가 소멸되었습니다.
Refer to
'개발 > c++' 카테고리의 다른 글
[c++] 연산자 오버로딩 (0) | 2023.09.10 |
---|---|
[c++] this 포인터, 클래스 객체 배열 (0) | 2023.09.08 |
[c++] 분할 컴파일 / Preprocessor & Compiler & Linker (2) | 2023.09.08 |
[c++] 배열과 문자열이 헷갈리지 (1) | 2023.09.07 |
[c++] 함수 템플릿 (0) | 2023.09.07 |