본문 바로가기
C++ 공부

class 01

by Dev_Hugh 2021. 8. 19.
728x90
반응형

OOP

  • C 언어 : 절차지향 언어
  • C++ 언어 : 객체지향 언어 -> class를 이용한다.
  • class? 유사 [구조체+함수] 라고 이해

class 이해이해를 돕기위한 코드

print라는 기능이 C에서 C++로 어떻게 변화하는지 중점으로)

///제작자 코드
typedef struct USERDATA
{
  int nAge;
  char szName[32];
}USERDATA;

///사용자 코드
int main(void)
{
  USERDATA u = {20, "Hugh"};
  printf("%d %s\n", u.nAge, u.szName);
  return 0;
}
  • 자료구조는 제작자 코드를 사용자 코드는 함수를 의미
  • 사용방식: [자료구조 <- 사용자 코드] 형태
  • 사용자 코드가 자료구조를 이용하는 형태로 자료구조의 변화가 있으면 사용자측에서도 불가피하게 변화가 생기는데 이것을 "의존적 관계" 또는 "의존성있다" 표현!!
  • 제작자가 USERDATA 라는 대상을 만들면 사용자는 이를 이용해 print를 실행하는 중인데 우리는 여기서 조금 깊게 생각해보자
  • Q) 제작자 코드에서 변화가 있으면 어떨까? USERDATA에 대해 더 잘 알고있는 사람은 제작자일까 사용자일까?
  • A) 당연히 제작자가 더 잘알고 변화가 생길시 사용자측에서 잘 모르기에 오류가 생길 확률이 높아진다.
  • 이런 오류를 줄이기 위해선 오류가 생길 가능성을 봉쇄하면 되는데 제작자가 print 기능의 함수를 만들어 제공해주면 해결된다.

print 기능을 제작자가 제공한 ver

///제작자 코드
typedef struct USERDATA
{
  int nAge; //멤버 변수 (자료에대해 의존적으로 보여!)
  char szName[32]; //멤버 변수 (자료에대해 의존적으로 보여!)
}USERDATA;

//출력 기능 제공
void PrintUserData(USERDATA* pUser)
{
  printf("%d %s\n", pUser->nAge, pUser->szName);
}
///사용자 코드
int main(void)
{
  USERDATA u = {20, "Hugh"};
  PrintUserData(&u);
  return 0;
}
  • 제작자가 print 기능의 함수를 제공하여 사용자는 이런 기능이 있다는것말 알면 쉽게 사용가능하다.
  • 그러나 문법적으로 print 기능과 자료의 연관성이 없어보인다.
    사용자가 자료에서 출력을 제공하는것만 알면 쉽게 사용가능하다.
  • USERDATA 라는 자료 내 nAge와 nzName은 자료에 대해 의존적으로 보이는데 print 기능은 마치 자료에서 제공하는 느낌(의존적X)이 아닌거 같다.
  • 의존적이려면 print 기능도 자료안에 멤버로 넣어주느것이다.

절차지향에서 객체지향으로 가는 과정 (print를 멤버로 넣어주기)

///제작자 코드
typedef struct USERDATA
{
  int nAge; // 멤버변수
  char szName[32]; //멤버변수
  void(*Print)(struct USERDATA *); // 멤버함수
}USERDATA;

void PrintUserData(USERDATA* pUser)
{
  printf("%d %s\n", pUser->nAge, pUser->szName);
}

///사용자 코드
int main(void)
{
  USERDATA u = {20, "Hugh", PrintUserData};
  u.Print(&u);
  return 0;
}
  • 자료와 기능함수의 관계가 명확하게 일부(의존적)으로 보여진다
  • 이에따라 main에서의 print 기능 사용법이 변했는데 OOP 이해를 위해 매우 중요한 표현법이다 (this와 연관)
  • u.Print(&u)은 "내가 집에가는데 집 주소를 몰라 네비게이션을 키고 간다"로 해석 될 수 있다
  • 즉 뭔가 어색해보인느 점이 있는데 C++은 이를 변화시켜 멤버함수 즉 method라고 불리는 것을 제공한다

C++ style (method의 탄생)

class USERDATA
{
public:
  int nAge;
  char szName[32];
  void Print() //C++ style 멤버함수
  {
    printf("%d %s\n", this->nAge, this->szName);
    //printf("%d %s\n", nAge, szName); 과 동일
  }
};

///사용자 코드
int main(void)
{
  USERDATA u = {20, "Hugh"};
  u.Print(); //C++ style 사용
  return 0;
}
  • main에서 print 기능을 호출하는 방법이 변한것이 보인다.
  • Print() 함수내부도 잘 보길바란다. this 개념의 시작이다.
  • 그렇다면 u.Print(&u) 와 u.Print()의 차이는 뭘까?
  • 디버깅 모드로 u.Print(&)와 u.Print()를 찍어보면 둘 다 u의 같은 주소값이 들어가 있음을 확인 가능하다
  • hidden parameter가 들어있는 것이다.
  • 참고로 C++은 엄밀히 말해 struct가 없으며 class를 이용하니 위 코드는 struct을 class로 변환하고 접근제어자를 추가한거다.
728x90
반응형

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

constructor 03  (0) 2021.08.20
constructor 02  (0) 2021.08.20
constructor 01  (0) 2021.08.20
class 03  (0) 2021.08.20
class 02  (0) 2021.08.19