ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 추상화와 클래스
    C++ 2025. 3. 28. 21:19

    추상화와 클래스

    데이터형이란 무엇인가?

    데이터형을 대상으로 어떠한 연산을 수행할 수 있는가?

     

    #include <iostream>
    using namespace std;
    
    int main() {
    
    	int a = 3;
    	int b = 4;
    
    	cout << sizeof(a) << "byte" << endl;
    
    	int* a_ = &a;
    	int* _b = &b;
    	cout << sizeof(a_) << "byte" << endl;
    	return 0;
    }

    먼저 위와 같은 코드가 있을때, int형은 4바이트, 포인터 a_도 4바이트를 차지한다.

    클래스는 추상화를 사용자정의 데이터형으로 변환해주는 수단이다.

    추상화란 어떠한 객체를 사실적으로 표현하는 것이 아니라,

    공통된 특징을 간결한 방식으로 이해하기 쉽게 표현하는 것이다.

     

    클래스는 선언하는 부분과

    메서드를 정의하는 부분으로 나눌 수 있다.

    #include <iostream>
    using namespace std;
    
    class Stock {
    private:
    	string name;
    	int shares;		// 주식 수
    	float share_val;	// 주가
    	double total_val;	// 주식 총 가치
    
    public:
    	void acquire(string&, int, float);
    	void buy(int, float);
    	void sell(int, float);
    	void update(float);
    	void show();
    	Stock();
    	~Stock();
    
    };
    int main() {
    
    	return 0;
    }

    이제 Stock이라는 데이터형을 만들었다. 이제 이 stock을 통해서 새로운 변수나 객체를 선언할 수 있다.

    멤버변수로는 name, shares, share_val, total_val 4개가 선언되었다. 이 값들은 private형태이므로 사용하기

    위해서 public 안에 있는 함수들을 통해서 접근할 수 있다. 이렇게 데이터에 직접적으로 접근하지

    못하게 하는것을 데이터 은닉이라 한다.

     

    public private
    공개 멤버, 클래스 비공개 멤버
    외부에서도 접근 가능 클래스 내에서만 접근 가능
    직접적인 데이터는 private로 선언하여 데이터를 은닉하자.
    Stock::Stock() {
    	cout << "생성자 호출" << endl;
    }
    
    Stock :: ~Stock() {
    	cout << "소멸자 호출" << endl;
    }

    그리고 하단에있는 것은 생성자와 소멸자이다.

    void Stock::acquire(string& co, int n, float pr) {
    
    }
    
    void Stock::buy(int, float) {
    
    }
    
    void Stock::sell(int, float) {
    
    }
    
    void Stock::update(float) {
    
    }
    
    void Stock::show() {
    
    }

    이제 Stock클래스의 사용범위에 허용된다는 것으로 인식한다.

    acquire함수는 주식을 선언하고, buy는 구매, sell은 판매, update는 변경, show는 출력하는 기능을 한다.

    주식을 선언할때는 co는 이름, n은 갯수, pr는 가격을 받는다.

    #include <iostream>
    using namespace std;
    
    class Stock {
    private:
    	string name;
    	int shares;		// 주식 수
    	float share_val;	// 주가
    	double total_val;	// 주식 총 가치
    	void set_total() {
    		total_val = shares * share_val;
    	}
    
    public:
    	void acquire(string, int, float);
    	void buy(int, float);
    	void sell(int, float);
    	void update(float);
    	void show();
    	Stock();
    	~Stock();
    };
    
    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;
    }
    
    Stock::Stock() {
    	cout << "생성자 호출" << endl;
    }
    
    Stock :: ~Stock() {
    	cout << "소멸자 호출" << endl;
    }
    
    int main() {
    	Stock temp;
    	temp.acquire("Kakao", 100, 1000);
    	temp.show();
    	temp.buy(10, 1200);
    	temp.show();
    	temp.sell(5, 800);
    	temp.show();
    
    	return 0;
    }

    먼저 temp를 통해 acquire함수를 호출해서 매개변수로 값들을 넣어준 결과이다.

    이제 main함수에 있는 모든 코드들을 ifndef ~endif를 통해 가독성있게 나눠줄 것이다.

    헤더파일에는 변수와 함수의 선언부,

    main함수에서는 헤더파일을 include 한뒤, 함수를 호출하고있다.

    #include "Stock.h"
    
    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;
    }
    
    Stock::Stock() {
    	cout << "생성자 호출" << endl;
    }
    
    Stock :: ~Stock() {
    	cout << "소멸자 호출" << endl;
    }

    func.cpp의 소스파일이다.

    정리하자면, 헤더파일에서 private로 멤버 변수를 정의하고, public으로 함수를 정의한다.

    private한 변수는 접근할 수 없기때문에 함수를 통해 접근한다. main함수에서 매개변수에 값을 대입하여 함수를 호출한 뒤 결과값을 읽어온다고 생각한다.

     

     

    'C++' 카테고리의 다른 글

    C++ 연산자 오버로딩  (0) 2025.03.29
    C++ 생성자와 소멸자  (0) 2025.03.29
    C++ 분할 컴파일  (0) 2025.03.27
    C++ 함수 오버로딩과 템플릿  (0) 2025.03.26
    C++ 인라인 함수 및 디폴트 매개변수  (0) 2025.03.25
Designed by Tistory.