Language/C++

[TheSSEN/C++] 4. 객체 지향 프로그래밍

coco_daddy 2025. 1. 27. 15:31
※ LIG Nex1 The SSEN Embedded SW School에서 진행된 내용을 정리한 포스팅입니다.

객체 지향 프로그래밍

객체 지향 프로그래밍이란

  • 객체를 정의
    • 모델링에서 도출된 샘플을 클래스로 정의
  • 객체가 갖는 2가지 종류의 관계
    • 상속
    • 포함 

클래스 정의

일반적인 형태

class Class_name {
	// 멤버 변수: 값의 저장 목적
	// 멤버 함수(메서드): 기능 제공 목적
};

 

  • 멤버 변수
    • 값 저장
    • 객체의 정보를 저장한다.
    • 값은 변경 가능하다.
  • 멤버 함수(메서드)
    • 객체의 기능을 제공한다.

접근 제어자

  • private
    • 클래스 내에서만 접근 가능
  • protected
    • 상속 관계 내에서만 접근 가능
  • public
    • 클래스 외부에서 접근 가능

잘못된 클래스 예제

  • 10개의 주소를 저장하는 Addr 클래스
class Addr {
public:
	char *name[10];
	char *tel[10];
	char *addr[10];
}
  • 클래스의 목적을 위배하고 있다.
    • 캡슐화: 하나의 클래스는 하나의 객체를 저장할 수 있어야 한다.
  • 개선된 클래스의 형태
class Member {
private:
	string name;
	string tel;
	string addr;
};

class Addr {
public:
	Member addr[10];
};
  • 다른 클래스로 분리해야 한다.
    • 이후 적절한 자료구조를 통해 다수의 멤버를 저장할 수 있도록 해야 한다.

캡슐화

  • 캡슐화를 적용한 Member 클래스 예제
class Member {
private:
	string name;
	string tel;
	string addr;
	
public:
	//멤버 변수 값 변경
	void inputData(const string &n, const string &t, const string &a);
	//멤버 변수 값 출력
	void printData() const;
};

 

객체 생성

  • Stack
Member m1;
// m1.tel = "010"; Error
m1.inputData("name", "010", "addr");
m1.printData();
  • Heap
Member *m2 = new Member();
m2->inputData("heap", "000", "addr");
m2->printData();
Member m1;
Memeber *p = new Member();
Member m2[3];
Member *m3[3];   // 객체가 없기 때문에 객체를 생성하여 주소를 넣어주어야 한다.
Member &m4 = *p; // 힙에 참조자 변수의 이름으로 접근 가능 -> m4.name(O)

파일 분할

  • 클래스의 구현부와 선언부를 분할하는 것이 일반적이다.
  • 분리가 되어있더라도 link과정을 따라 하나의 바이너리로 구성할 수 있으면 된다.
  • Contact.h
class Contact
{
public:
    Contact();
    void insert_data(string name, string phoneNum);
    int getId();
    void printData();

private:
    static int cnt;
    int mId;
    string mName;
    string mPhoneNum;
};
  • Conatact.cpp
int Contact::cnt = 0;

Contact::Contact()
    : mId(0)
    , mName("")
    , mPhoneNum("")
{}

void Contact::insert_data(string name, string phoneNum)
{
    mId = cnt++;
    mName = name;
    mPhoneNum = phoneNum;
}

int Contact::getId()
{
    return mId;
}

void Contact::printData()
{
    cout << " " << mId << " | " << mName << " | " << mPhoneNum << "\n";
}

 

※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)