8. Class and Object

지니🧸·2023년 2월 25일
0

C++

목록 보기
8/10

본 문서는 인프런의 [하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문 강의를 공부하며 작성한 개인 노트입니다.

🍛 분할 컴파일

분할 컴파일: 프로그램의 세 부분을 나누어서 컴파일

  • header: 함수의 원형, 기호 상수, 구조체 선언, 클래스 선언, 템플릿 선언, 인라인 함수
    • #include <iostream>, using namespace std 포함
    • 기호상수: #define이나 const를 사용하는 기호 상수
  • 함수의 몸체: 함수가 정의된 것
  • main: 함수 실행 등

분할 컴파일하는 방법

  1. 헤더 분리하기
  • 소스파일/헤더 파일에 struct.h (.h가 헤더 파일)
  • 메인 파일에 #include "struct.h"로 연결
  1. 함수 몸체 분리하기
  • 소스파일에 (파일명).cpp
  • 함수 몸체 파일에 헤더 파일 정의
    • #include "struct.h"

ifndef

  • 하나의 헤더 파일은 한번만 Include되어야 한다
    (예) 헤더1을 include하는 헤더2. 메인에서 헤더1과 헤더2를 include하면 메인은 헤더1을 두번 Include하는 꼴이 된다
  • 해결방안: #ifndef ~ #endif
    • 두 키워드 사이의 코드는 기호상수화 시킴
#ifndef STRUCT

#include <iostream>
using namespace std;

struct MyStruct 
{
	string name;
    int age;
};

void display(MyStruct&);

#endif
  • 컴파일러가 처음으로 컴파일한 파일이 다시 컴파일하는 것을 무시하게 해줌

🍜 추상화와 클래스

추상화: 어떠한 객체를 사실적으로 표현하는 것이 아니라 공통된 특징을 간결한 방식으로 이해하기 쉽게 표현

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

  • 두 부분으로 나뉨: 선언과 메서드 정의
  1. 클래스 선언
  2. 클래스 메서드 정의
#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, float) {
	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;
}
	
int main() {
	Stock temp;
    temp.acquire("Samsung", 100, 1000);
    temp.show();
    temp.buy(10, 1200);
    temp.show();
    temp.sell(5, 800);
    temp.show();
    
    return 0;
}
  • 공개 범위
    • public: 공개 멤버
      • 클래스 외부에서도 접근 가능
    • private: 비공개 멤버
      • 클래스 내에서만 접근 가능
  • 데이터 은닉: 필드를 private하게 설정하여 public method을 통해서만 접근 가능케 하는 것
  • 사용범위 결정 연산자(::): 클래스에 종속된 메서드로 설정
    • (예) void Stock:: acquire(string&, int, flat) {}
  • 분할 컴파일
    • Stock.h 파일에 using namespace~클래스 선언 분리
    • 소스파일/func.cpp 파일에 함수 정의 분리 후 #include "Stock.h"
    • main.cpp에도 #include "Stock.h"

🥘 클래스 생성자와 파괴자

cpp에서 클래스 생성자와 파괴자를 기본적으로 제공해줌으로 정의하지 않더라도 문제가 되지는 않음

생성자 정의 (acquire 함수 대체)

Stock::Stock(string co, int n, float pr)
{
	name = co;
    shares = n;
    share_val = pr;
    set_total();
}

main에 사용

int main() {
	Stock temp = Stock("Samsung", 100, 1000);
}

default 생성자

파라미터를 받지 않고 기본값으로 초기화하는 생성자

Stock::Stock() {
	name = "";
    shares = 0;
    share_val = 0;
    set_total();
}

파괴자

파괴자

  • 생성자와 같은 함수 이름에 맨 앞에 ~ 붙임 (예) Stock::~Stock()
  • 객체의 수명이 끝나면 자동으로 호출됨
  • 일반적으로 명시적으로 호출할 일 없음
  • 매개변수 없음
  • 호출되는 이유
    • new를 사용해서 새 객체를 생성했을 때 (기존의 객체는 삭제됨)
    • 임시 객체의 사용이 끝났을 때
    • 정해진 범위 값을 벗어날 때

🫕 this 포인터

this: 멤버 함수를 호출하는데 쓰인 객체를 의미

Stock Stock::topval(Stock& s) {
	if (s.share_val > share_val) 
    	return s;
    else return this;
}

🍲 클래스 객체 배열

클래스 객체 배열 선언: 표준 데이터형 선언 방식과 같음

  • 원소마다 콤마(,)로 구분
Stock s[4] = {
	Stock("A", 10, 1000), 
    Stock("B", 20, 1200),
    Stock("C", 30, 1300)
};

(예) func.cpp의 메서드, main.cpp에서 예시
func.cpp

Stock &Stock::topval(Stock& s) {
	if (s.share_val > share_val)
    	return s;
    else return *this;
int main() {
	Stock s[4] = {
	Stock("A", 10, 1000), 
    Stock("B", 20, 1200),
    Stock("C", 30, 1300)
	};
	
    Stock *first = &s[0];
    for (int i = 1; i <4; i++) 
    	first = &first->topval(s[i]);
    
    first->show();
   	
    return 0;
}
profile
우당탕탕

0개의 댓글