클래스와 객체

Jaemyeong Lee·2024년 8월 10일
0

FastCampusC++

목록 보기
52/78

이 코드 예제는 C++에서 클래스와 객체 지향 프로그래밍의 핵심 개념인 캡슐화, 접근 지정자, 그리고 객체 간의 상호작용을 설명하는 데 사용됩니다. 각 클래스의 구현과 예제를 분석하여 주석과 함께 자세히 설명해 보겠습니다.

클래스와 객체 개념에 대한 예제 코드 분석

1. Player0 클래스

class Player0
{
    int health;
    int power;
};

설명:

  • Player0 클래스는 두 개의 멤버 변수 healthpower를 포함하고 있지만, 이 클래스는 기본적으로 private 접근 지정자를 사용합니다. 즉, 클래스 외부에서 이 변수들에 접근할 수 없습니다.

주석:

  • 기본 접근 지정자: 클래스 멤버는 별도로 지정하지 않으면 기본적으로 private 접근 지정자를 사용합니다. private 멤버는 클래스 내부에서만 접근 가능하며, 외부에서는 접근할 수 없습니다.

코드 예시:

{
    // Player0 player0{ 100, 200 }; // 안 됨: 생성자가 없으며, 멤버가 private이므로 직접 초기화 불가능
    // player0.health = 100; // 안 됨: health가 private 멤버이기 때문에 접근 불가
}

2. Player1 클래스

class Player1
{
public: // 접근 지정자
    int headlth;
    int power;
};

설명:

  • Player1 클래스는 public 접근 지정자를 사용하여 headlthpower 멤버 변수에 대한 접근을 허용합니다. 클래스 외부에서도 이 변수들에 자유롭게 접근할 수 있습니다.

주석:

  • 공개 멤버 변수: public 접근 지정자를 사용하면 클래스 외부에서도 해당 멤버 변수에 접근할 수 있습니다. 이는 외부 코드가 멤버 변수의 값을 직접 변경할 수 있다는 의미입니다.

코드 예시:

{
    Player1 player1{ 100, 200 }; // 가능: 생성자가 자동 생성되며, 멤버 변수에 직접 접근 가능
    player1.headlth = 200; // 가능: headlth가 public 멤버이기 때문에 접근 가능
}

3. Player2 클래스

class Player2
{
public:
    int health;
private:
    int power;
};

설명:

  • Player2 클래스는 health 변수는 public으로, power 변수는 private으로 선언되어 있습니다. 따라서 health는 클래스 외부에서 접근할 수 있지만, power는 접근할 수 없습니다.

주석:

  • 혼합 접근 지정자: 클래스는 publicprivate 접근 지정자를 혼합하여 사용할 수 있습니다. 이는 멤버 변수 또는 함수의 가시성을 세밀하게 조절할 수 있게 해줍니다.

코드 예시:

{
    Player2 player2;
    // player2.power = 300; // 안 됨: power가 private 멤버이기 때문에 접근 불가
}

4. Player3 클래스

class Player3
{
public:
    int _health;
    int _power;
    string _name;

public:
    void attack(Player3& target)
    {
        cout << "Attack " << _name << "->" << target._name << endl;
        target.damaged(_power);
    }

    void damaged(int power)
    {
        _health -= power;
        if (_health <= 0)
            cout << "Died " << _name << endl;
    }
};

설명:

  • Player3 클래스는 public 접근 지정자를 사용하여 모든 멤버 변수와 함수에 대한 접근을 허용합니다. 이 클래스는 다른 Player3 객체를 공격할 수 있는 attack 함수와, 공격을 받았을 때 체력을 감소시키는 damaged 함수를 포함합니다.

주석:

  • 캡슐화의 부족: 모든 멤버 변수가 public으로 선언되어 있기 때문에, 클래스 외부에서 이 변수들에 직접 접근하고 수정할 수 있습니다. 이는 객체의 무결성을 위협할 수 있습니다.
  • 객체 간의 상호작용: attack 함수는 다른 Player3 객체를 공격하고, damaged 함수는 공격을 받아 체력을 감소시키는 역할을 합니다. 객체 간의 상호작용이 직접적으로 구현되어 있습니다.

코드 예시:

{
    Player3 david{ 200, 100, "David" };
    Player3 daniel{ 200, 100, "Daniel" };
    
    daniel._health -= 300;
    // daniel의 health가 0 이하가 됐음에도 죽었다는 메시지가 발생하지 않음
    // 멤버 변수를 노출하게 되면 이렇게 객체의 무결성이 깨지는 상태가 발생할 가능성이 높아짐
}
  • 문제점: daniel._health -= 300;처럼 클래스 외부에서 멤버 변수를 직접 수정하면, damaged 함수가 호출되지 않아 객체의 상태가 예상과 다르게 변경될 수 있습니다. 이는 객체지향의 기본 원칙인 캡슐화가 지켜지지 않았기 때문입니다.

5. Player4 클래스

class Player4
{
private:
    int _health;
    int _power;
    string _name;

public:
    Player4(int health, int power, string name)
    {
        _health = health;
        _power = power;
        _name = name;
    }

    void attack(Player4& target)
    {
        cout << "Attack " << _name << "->" << target._name << endl;
        target.damaged(_power);
    }

    void damaged(int power)
    {
        _health -= power;
        if (_health <= 0)
            cout << "Died " << _name << endl;
    }
};

설명:

  • Player4 클래스는 멤버 변수를 private으로 선언하여 외부에서 직접 접근할 수 없도록 합니다. 대신 생성자를 통해 초기화하며, attackdamaged 함수로만 객체의 상태를 변경할 수 있습니다.

주석:

  • 캡슐화의 구현: 멤버 변수를 private으로 선언하여 클래스 외부에서의 직접 접근을 제한하고, 객체의 무결성을 보호합니다. 객체의 상태는 오직 클래스 내부의 함수들을 통해서만 변경될 수 있습니다.
  • 생성자: 생성자를 통해 객체가 생성될 때 초기값을 설정할 수 있으며, 이는 클래스 외부에서 멤버 변수를 직접 수정할 필요를 제거합니다.

코드 예시:

{
    Player4 david{ 200, 100, "David" };
    Player4 daniel{ 200, 100, "Daniel" };
    
    // daniel._health -= 300; // 불가능하다: health가 private 멤버이기 때문에 직접 접근 불가
    david.attack(daniel); // Attack David->Daniel
    david.attack(daniel); // Died Daniel
}
  • 장점: Player4 클래스에서는 daniel._health -= 300;과 같은 직접적인 변수 수정이 불가능하므로, 객체의 상태가 attackdamaged 함수에 의해 올바르게 관리됩니다. 이렇게 함으로써 객체의 무결성이 유지됩니다.

결론

이 코드 예제는 C++의 클래스와 객체 지향 프로그래밍의 중요한 개념을 다루고 있습니다. 캡슐화는 클래스의 중요한 원칙으로, 객체의 내부 상태를 보호하고, 객체의 상태가 외부로부터 안전하게 유지되도록 합니다. Player4 클래스는 이를 잘 보여주며, 객체의 무결성을 지키기 위해 멤버 변수를 private으로 선언하고, 이를 수정하는 함수를 제공하는 것이 좋습니다.

반면에, Player3 클래스처럼 멤버 변수를 public으로 노출시키는 것은 객체의 무결성을 위험에 빠뜨릴 수 있습니다. 이러한 문제를 피하기 위해서는 멤버 변수에 대한 직접적인 접근을 제한하고, 필요한 경우 적절한 함수를 통해서만 객체의 상태를 수정하도록 설계하는 것이 좋습니다. 이러한 설계 원칙을 따르면, 더 안전하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.

profile
李家네_공부방

0개의 댓글