원티드_언리얼RPG 2기/C++

클래스의 관계

하시무 2025. 3. 11. 21:44

객체지향프로그래밍에서 부모 클래스는 자식 클래스에게 변수와 메소드를 넘겨줄수있다.

접근제어자를 통해 주고싶은것만 줄 수 있다.

 

private: 해당(부모) 클래스 안에서만 사용가능. 외부에서는 불가능
protected: 자식 클래스 에서 사용가능. 외부에서는 불가능
public: 어디서든 접근이 가능하다. 외부에서도 가능 

 

외부에서 접근한다는 의미:  Child 클래스의 객체를 통한 접근을 할때

Child obj;
obj.a = 10;  // ✅ 가능 (a는 public)
obj.b = 20;  // ❌ 불가능 (b는 protected)
obj.c = 30;  // ❌ 불가능 (c는 private)

 

public만 가능하다. 

 

protected는 상속받은 클래스에서 사용가능하다면서 왜 자식클래스의 객체로 접근이 불가능할까?

 

class Parent {
protected:
    int protectedVar;  // 자식 클래스에서는 접근 가능하지만, 외부에서는 불가능

public:
    Parent() { protectedVar = 10; }
};

class Child : public Parent {
public:
    void AccessParentVar() {
        cout << protectedVar << endl;  // ✅ 가능 (자식 클래스 내부에서 접근)
    }
};

int main() {
    Child obj;
    obj.AccessParentVar();  // ✅ 가능 (자식 클래스 내부의 멤버 함수를 통해 접근)

    // obj.protectedVar = 20;  // ❌ 오류! (객체를 통해 직접 접근 불가)

    return 0;
}

 

정보은닉때문인 것 같다. 자식클래스의 메소드로는 접근이 가능하지만 자식클래스의 객체로는 직접접근이 불가능하다. 

객체지향프로그래밍에서는 변수를 직접 조작하는것이 아니라 최대한 메소드를 통해 변수를 조작하게 짜야한다. 

 

잠시 학교에서 배웠던 걸 떠올려보자

 

클래스에는 관계가 5가지있다.

약한 관계 순으로 의존, 연관, 집합, 합성, 상속 관계가 있다.

참고:https://mydirectorystory.tistory.com/entry/5-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B4%80%EA%B3%84-Class-Relationships

 

의존 관계( Dependency ) 

        A 클래스에서  B 클래스를 일시적으로 참조하는 형태이다. 함수의 매개변수등으로 받고 함수가 종료될때 사라진다.

 

연관 관계( Association )

       의존관계처럼 일시적으로 참조하는게 아니라 A 클래스에서 B 클래스의 인스턴스를 생성해서 사용하는 형태이다.

 

집합 관계( Aggregation 

       클래스 A가 없어도 클래스 B는 존재하는 관계

클래스A에서 클래스B의 인스턴스를 생성해서 조작했지만 클래스 B에는 해당클래스의 멤버변수,함수들만 있어서 상관 없는 형태.

 

합성 관계( Composition )

       클래스 A가 없으면 클래스 B도 존재하는 관계

서로 갖다써서 어느 하나라도 없으면 안되는 관계

 

상속 관계( Inheritance )

 

Is- a 관계

       

  A is a B : A는 B의 일종이다.

부모클래스에서 상속받아 기능을 확장한다. 클래스간 일반화 관계, public 상속을 주로한다. 

상속이 깊어지면 유지보수가 어려워질 수 있다.

class Animal {  // 부모 클래스
public:
    void Eat() { cout << "Eating..." << endl; }
};

class Dog : public Animal {  // 자식 클래스
public:
    void Bark() { cout << "Woof!" << endl; }
};

int main() {
    Dog myDog;
    myDog.Eat();  // ✅ 부모 클래스의 멤버 함수 사용 가능 (상속됨)
    myDog.Bark(); // ✅ 자식 클래스의 멤버 함수 사용 가능
}

 

Has-a 관계

 

A has a B : A는 B를 포함하고있다.

 

한 클래스가 다른클래스의 객체를 포함하고있다.

클래스 내부에서 다른 클래스를 멤버변수로 포함한다.

클래스간 느슨한 관계를 유지해서 유지보수성이 높다.

생성자에서 포함된 객체를 초기화해야한다.

class Engine {  // 엔진 클래스
public:
    void Start() { cout << "Engine starting..." << endl; }
};

class Car {  // 자동차 클래스 (Engine을 포함)
private:
    Engine engine;  // 포함 관계 (has-a)
public:
    void StartCar() { engine.Start(); }
};

int main() {
    Car myCar;
    myCar.StartCar();  // ✅ Car 내부에서 Engine 객체 사용
}

 

 

탱크만들기에서 tank, missile, enemy, gameobject등의 클래스가 있다.

tank와 missile은 모두 gameobject를 상속받은 클래스이다.  Is-a관계

tank에서는 missile의 객체 missiles를 생성해 사용한다. Has-a관계