TIL_021: 클래스 관계, const 함수, 코테 연산횟수

김펭귄·2025년 8월 26일

Today What I Learned (TIL)

목록 보기
21/139

오늘 학습 키워드

  • 클래스간의 관계 알아보기

  • const 함수

  • 코테 연산횟수

1. 클래스간의 관계 알아보기

상속(Inheritance) 관계

  • Is-a관계이며, 파생 클래스가 기반 클래스의 특성을 그대로 물려받음

  • "Dog is an Animal"이 성립하므로 Dog(개) 클래스가 Animal(동물) 클래스를 상속받음

class Animal {
   // ..
}
class Animal : 접근제한자 Dog
{
   // ..
}

연관(Association) 관계

  • 두 클래스가 서로 관련성은 있지만 독립적인 객체인 상태

  • 객체가 서로를 참조하지만, 소유권이 없으며 생명주기도 다름

  • 예: 학생(Student)과 전공수업(Course)의 관계(다대다 관계)

  • 다대다, 일대다, 일대일 등 여러 형태가 존재

class Course {};
class Student {
    Course* course; // 단순 참조(연관)
};

집합(Aggregation) 관계

  • has-a관계(부분-전체)의 한 종류이며 클래스가 다른 클래스의 객체를 참조로 포함하지만, 부분 객체가 전체 객체와 독립적으로 존재할 수 있다

  • 한 객체가 다른 객체를 포함하지만 포함된 객체가 독립적인 생명주기를 가질 때를 말함

  • 예: Classroom이 여러 Student 객체를 포함하지만, 학생 객체는 계속 존재함.

class Student {};
class Classroom {
    std::vector<Student*> students; // 포인터로 포함, 집합
};

구성(Composition) 관계

  • 강한 has-a (부분-전체 관계)관계 또는 "Part-of" 관계라고도 함

  • 전체가 없어지면 부분도 함께 없어지는 생명주기를 공유하는 관계, 부분이 전체 없이 독립하지 못함

  • 예: Human과 Heart와의 관계. 인간이 소멸하면 심장도 사라짐

  • 보통 객체 포인터 대신 실제 객체가 멤버로 포함되어 있음.

class Heart {};
class Human {
    Heart heart; // 직접 포함, 구성
};

의존(Dependency) 관계

  • 한 클래스가 다른 클래스를 소유하지 않고 그냥 일시적으로 사용하는 관계 (Use-a 관계)

  • 임시적이고 약한 연결이므로 멤버변수로 유지할 필요가 없다
    함수 매개변수나 임시 객체 생성 또는 지역변수로 사용(한시적 참조)

class Engine {};
class Car {
public:
    void startEngine(Engine& engine) { /* 함수 매개변수 의존 */ }
};

클래스 간 관계에 따른 코드 작성

  • 소유관계가 강한 경우(구성관계 등)에는 직접 멤버 변수로 객체를 포함
    소유하는 클래스의 수명과 함께 포함된 객체의 수명도 같이 관리됨

  • 소유관계가 약하거나 독립적인 경우(의존, 집합, 연관)에는 멤버 변수로 포인터나 참조자를 사용
    객체의 수명은 보통 스마트 포인터를 통해 알아서 관리

2. const 함수

  • 함수에서 어떤 변수의 값을 변형시키고 싶지 않을 때 const 키워드를 사용하지만 사용 위치에 따라 의미하는 바가 다름

함수 선언 끝에 붙는 const

int getValue() const;
  • 멤버함수일때만 뒤에 붙일 수 있으며 이는 이 함수가 객체를 변경하지 않겠다는 뜻

  • 즉, 함수 내에서 멤버 변수를 수정할 수 없고, const 객체에서도 이 함수를 호출할 수 있다

  • 보통 읽기 전용 함수에 사용

함수 반환 타입에 붙는 const

const int& getRef();
  • 반환하는 값이 상수(수정 불가)

  • 보통 참조를 반환할 때 반환된 객체를 수정하지 못하게 할 때 사용

함수 매개변수에 붙는 const

void print(const std::string& s);
  • 함수 내부에서 해당 인자를 변경하지 않겠다는 의미

  • 복사 비용을 줄이면서 안전하게 참조 가능하게 할 때 자주 쓴다.

정리

  • 멤버 함수 뒤 const: 객체를 수정하지 않겠다

  • 반환 타입 앞 const: 반환값을 수정하지 못하게 하겠다

  • 매개변수 앞 const: 입력값을 수정하지 않겠다

  • 이 3가지의 const 합쳐서 사용도 가능

const vector<int>& foo const (const int& a);

3. 코테 연산 횟수

  • 최대 초당 1억번(10^8)까지 연산횟수 가능

  • 넉넉히 5천만번까지로 코드를 짜야함

다음 학습

  • 파일 입출력 공부

  • C++ 코딩테스트

profile
반갑습니다

0개의 댓글