All is well

[YYBASIC0101/얌얌코딩] 클래스와 구조체, 멤버함수의 동작원리 본문

C++/YYBASIC

[YYBASIC0101/얌얌코딩] 클래스와 구조체, 멤버함수의 동작원리

D0YUN 2025. 1. 31. 17:49

클래스와 구조체의 차이

  • 클래스와 구조체의 큰 차이점은 default 접근 지정자에서 나타납니다.
  • struct : `public`
  • class : `private`

클래스에서는 멤버 함수 선언이 가능하다

  • 클래스에서는 멤버 함수 선언이 가능합니다.
  • 멤버 함수의 매개변수가 없는 경우, 객체의 주소암묵적으로 `this` 포인터를 통해 전달됩니다.
    • 이때 `this` 포인터는 함수가 실행되는 중에 객체 주소가 변하면 안되므로 `const` 키워드가 붙습니다.
      • `CLASSNAME* const this`

멤버 함수 뒤에 `const`를 붙이면 해당 함수는 읽기 전용 함수가 된다

  • `const` 키워드가 붙은 함수의 경우, 멤버 변수의 값을 변경할 수 없습니다.
    • 멤버 함수 내에서 멤버 변수의 값을 변경하려는 경우 컴파일 에러가 발생합니다.
  • 이때 `this` 포인터는 주소는 물론 전달되는 값도 변하면 안되기 때문에 앞뒤로 const 키워드가 붙습니다.
    • `const CLASSNAME* const this`
#include <iostream>
using namespace std;


// 사용자 정의 자료형 - struct
struct People
{
// public:
    int age;
    int height;
    char name[256];
};

// 사용자 정의 자료형 - class
class CPeople
{
    // 접근 제한 지정자
public:
    // 멤버 함수
    void AddAge(/* CPeople* const this */)
    {
        /* (*this).*/age += 10;
    }

    // 멤버 함수 뒤에 const : 멤버 변수의 값을 변경할 수 없음 - 읽기 전용 함수
    void AddAge2(/* const CPeople* const this */) const
    {
        // age += 15;       // ERROR
    }

    void AddHeight()
    {
        height += 50;
    }

//private:
    char name[256];
    int age;
    int height;
};


// 구조체와 클래스의 차이
// struct : default 접근 제한 지정자가 public
// class : default 접근 제한 지정자가 private
// 접근 제한 지정자를 사용하는 이유 : 중요한 데이터 보호 / 프로그래밍 중간에 데이터가 바뀌는 것을 방지
// 객체지향 5대 원칙 : SOLID


// ★ this pointer는 중간에 값이 변하면 안돼서 const로 정의됨


// P1에 Deep Copy가 일어남
// p1을 이용하여 값을 변경해도 원본 데이터는 변하지 않음
void AddAge(People p1)
{
    p1.age += 10;
}

// P1에 Shallow Copy가 일어남
// p1을 이용하여 값을 변경하면 원본 데이터가 변함
void AddAge(People* p1)
{
    // (*p1).age += 10;
    p1->age += 10;
}

void AddHeight(People* p1)
{
    // (*p1).height += 50;
    p1->height += 50;
}


int main()
{  
    // struct
    People A;
    A.age = 10;
    A.height = 120;
    // 선언만 된 char형 배열은 초기화 시 strcpy 사용
    //strcpy(&A.name[0], "Doyun");    
    strcpy(A.name, "Doyun");

    AddAge(&A);
    AddHeight(&A);


    // class
    CPeople B;
    B.age = 10;
    B.height = 120;
    strcpy(B.name, "Doyun");

    B.AddAge();     // 암묵적으로 () 안에 this 포인터를 통해 B의 주소를 전달함
    B.AddHeight();


    // const 키워드
    const int num = 100;

    int num2 = 100;


    // const가 뒤에 붙는 경우 : 초기화된 주소를 바꿀 수 없다
    int* const p = &num2;
    // p = &num2;       // ERROR


    // const가 앞에 붙는 경우 : 해당 포인터 변수가 가리키는 값을 바꿀 수 없다
    const int* pp = &num2;
    // *pp = 300;       // ERROR


    // const가 앞, 뒤로 붙는 경우 : 초기화된 주소, 해당 포인터 변수가 가리키는 값도 변경할 수 없다
    const int* const ppp = &num2;       

    return 0;
}

 

 

LV00_1 클래스 구조체 차이, 멤버함수 동작원리