클래스의 관계
객체지향프로그래밍에서 부모 클래스는 자식 클래스에게 변수와 메소드를 넘겨줄수있다.
접근제어자를 통해 주고싶은것만 줄 수 있다.
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가지있다.
약한 관계 순으로 의존, 연관, 집합, 합성, 상속 관계가 있다.
의존 관계( 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관계