클래스간의 관계 알아보기
const 함수
코테 연산횟수

Is-a관계이며, 파생 클래스가 기반 클래스의 특성을 그대로 물려받음
"Dog is an Animal"이 성립하므로 Dog(개) 클래스가 Animal(동물) 클래스를 상속받음
class Animal {
// ..
}
class Animal : 접근제한자 Dog
{
// ..
}
두 클래스가 서로 관련성은 있지만 독립적인 객체인 상태
객체가 서로를 참조하지만, 소유권이 없으며 생명주기도 다름
예: 학생(Student)과 전공수업(Course)의 관계(다대다 관계)
다대다, 일대다, 일대일 등 여러 형태가 존재
class Course {};
class Student {
Course* course; // 단순 참조(연관)
};
has-a관계(부분-전체)의 한 종류이며 클래스가 다른 클래스의 객체를 참조로 포함하지만, 부분 객체가 전체 객체와 독립적으로 존재할 수 있다
한 객체가 다른 객체를 포함하지만 포함된 객체가 독립적인 생명주기를 가질 때를 말함
예: Classroom이 여러 Student 객체를 포함하지만, 학생 객체는 계속 존재함.
class Student {};
class Classroom {
std::vector<Student*> students; // 포인터로 포함, 집합
};
강한 has-a (부분-전체 관계)관계 또는 "Part-of" 관계라고도 함
전체가 없어지면 부분도 함께 없어지는 생명주기를 공유하는 관계, 부분이 전체 없이 독립하지 못함
예: Human과 Heart와의 관계. 인간이 소멸하면 심장도 사라짐
보통 객체 포인터 대신 실제 객체가 멤버로 포함되어 있음.
class Heart {};
class Human {
Heart heart; // 직접 포함, 구성
};
한 클래스가 다른 클래스를 소유하지 않고 그냥 일시적으로 사용하는 관계 (Use-a 관계)
임시적이고 약한 연결이므로 멤버변수로 유지할 필요가 없다
함수 매개변수나 임시 객체 생성 또는 지역변수로 사용(한시적 참조)
class Engine {};
class Car {
public:
void startEngine(Engine& engine) { /* 함수 매개변수 의존 */ }
};
소유관계가 강한 경우(구성관계 등)에는 직접 멤버 변수로 객체를 포함
소유하는 클래스의 수명과 함께 포함된 객체의 수명도 같이 관리됨
소유관계가 약하거나 독립적인 경우(의존, 집합, 연관)에는 멤버 변수로 포인터나 참조자를 사용
객체의 수명은 보통 스마트 포인터를 통해 알아서 관리
const 키워드를 사용하지만 사용 위치에 따라 의미하는 바가 다름constint getValue() const;
멤버함수일때만 뒤에 붙일 수 있으며 이는 이 함수가 객체를 변경하지 않겠다는 뜻
즉, 함수 내에서 멤버 변수를 수정할 수 없고, const 객체에서도 이 함수를 호출할 수 있다
보통 읽기 전용 함수에 사용
constconst int& getRef();
반환하는 값이 상수(수정 불가)
보통 참조를 반환할 때 반환된 객체를 수정하지 못하게 할 때 사용
constvoid print(const std::string& s);
함수 내부에서 해당 인자를 변경하지 않겠다는 의미
복사 비용을 줄이면서 안전하게 참조 가능하게 할 때 자주 쓴다.
멤버 함수 뒤 const: 객체를 수정하지 않겠다
반환 타입 앞 const: 반환값을 수정하지 못하게 하겠다
매개변수 앞 const: 입력값을 수정하지 않겠다
이 3가지의 const 합쳐서 사용도 가능
const vector<int>& foo const (const int& a);
최대 초당 1억번(10^8)까지 연산횟수 가능
넉넉히 5천만번까지로 코드를 짜야함
파일 입출력 공부
C++ 코딩테스트