C++

c++ 챕터 13

yyee234 2024. 10. 7.
  • 클래스 상속
    - 기초클래스 (base class)라고 부르는 클래스로부터 모든 메서드와 멤버들을 상속받아, 새로운 파생 클래스(derived class)를    만들 수 있게 한다.
    - 상속을 통하여 다음과 같은 일들을 할 수 있다.
      1. 기존의 클래스에 기능을 추가할 수 있다.
      2. 클래스가 나타내고 있는 데이터에 다른 것을 더 추가할 수 있다.
      3. 클래스 메서드가 동작하는 방식을 변경할 수 있다.

    - 어떤 클래스를 다른 클래스로부터 상속할 때, 오리지널 클래스를 기초 클래스라 하고, 상속받는 클래스를 파생 클래스라 한다.

    tabtenn0.h 예제
#ifndef TABTENNO_H
#define TABTENNO_H
#include <string>
using std::string;

// 간단한 기초 클래스
class TableTennisPlayer {
private:
    string firstname;  // 선수의 이름
    string lastname;   // 선수의 성
    bool hasTable;     // 탁구대를 소유하고 있는지 여부

public:
    // 생성자: 매개변수에 기본값을 제공
    TableTennisPlayer(const string & fn = "none", const string & ln = "none", bool ht = false);
    
    // 이름을 출력하는 함수
    void Name() const;
    
    // 탁구대 소유 여부를 반환하는 함수
    bool HasTable() const { return hasTable; }
    
    // 탁구대 소유 여부를 설정하는 함수
    void ResetTable(bool v) { hasTable = v; }
};
#endif

 

  • 프라이빗 멤버:
    • firstname: 선수의 이름을 저장하는 문자열.
    • lastname: 선수의 성을 저장하는 문자열.
    • hasTable: 부울 값으로, 해당 선수가 탁구대를 소유하고 있는지 여부를 나타낸다.
  • 퍼블릭 멤버 함수:
    • 생성자: 선수의 이름, 성, 탁구대 소유 여부를 초기화합니다. 기본값이 설정되어 있어, 매개변수를 제공하지 않으면 자동으로 "none" 및 false로 초기화된다.
    • Name(): 선수의 성과 이름을 포맷에 맞게 출력한다.
    • HasTable(): hasTable의 값을 반환하는 간단한 접근자 함수이다.
    • ResetTable(bool v): hasTable을 업데이트하는 함수이다.

 

 

#include "tabtenn0.h"
#include <iostream>

TableTennisPlayer::TableTennisPlayer(const string & fn, const string & ln, bool ht) 
    : firstname(fn), lastname(ln), hasTable(ht) {}  // 멤버 초기자 리스트 사용

void TableTennisPlayer::Name() const {
    std::cout << lastname << ", " << firstname;  // 성, 이름 순으로 출력
}
  • 생성자 구현: 멤버 초기자 리스트를 사용하여 속성을 초기화한다. 이는 string 객체를 효율적으로 초기화하는 방법으로, 불필요한 복사를 피할 수 있다.
  • Name() 메서드: 선수의 이름을 성과 이름 순서로 출력한다.
#include <iostream>
#include "tabtenn0.h"

int main() {
    using std::cout;

    TableTennisPlayer player1("Chuck", "Blizzard", true);
    TableTennisPlayer player2("Tara", "Boomdea", false);
    
    player1.Name();
    if (player1.HasTable())
        cout << ": 탁구대가 있다.\n";
    else
        cout << ": 탁구대가 없다.\n";
    
    player2.Name();
    if (player2.HasTable())
        cout << ": 탁구대가 있다.\n";
    else
        cout << ": 탁구대가 없다.\n";
    
    return 0;
}
  • main 함수에서 두 개의 TableTennisPlayer 객체를 생성:
    • player1: "Chuck"이라는 이름과 "Blizzard"라는 성을 가지며 탁구대를 소유합니다.
    • player2: "Tara"라는 이름과 "Boomdea"라는 성을 가지며 탁구대를 소유하지 않습니다.
  • 각 선수에 대해 이름과 탁구대 소유 여부를 출력.
  • HasTable() 메서드를 통해 탁구대의 소유 여부를 확인하고, 그에 따른 메시지를 출력.
Blizzard, Chuck: 탁구대가 있다.
Boomdea, Tara: 탁구대가 없다.

 

- 이 예제는 상속을 통해 더 복잡한 클래스를 만드는 방법의 기초를 이해하는 데 도움이 된다. 예를 들어, TableTennisPlayer 클래스를 상속받아 특정 유형의 선수 (예: 프로 선수, 아마추어 선수 등)를 정의할 수 있다. 이러한 상속 관계는 코드의 재사용성을 높이고, 특정 기능을 확장하는 데 유리하다.

이 프로그램은 객체 지향 프로그래밍의 기본 개념인 클래스, 객체, 멤버 함수, 생성자, 상속 등을 이해하는 데 중요한 사례로, 탁구 동호회의 회원 관리 시스템을 효과적으로 표현하고 있다.

'C++' 카테고리의 다른 글

C++ 챕터 12  (0) 2024.09.27
C++ 챕터 11  (0) 2024.09.26
C++ 챕터 10 (Class)  (0) 2024.09.25
C++ 스터디 챕터 05~  (0) 2024.09.24
C++ 스터디 챕터 02~04  (1) 2024.09.24

댓글