머 대충 아는 한도내에서 적어봤습니다.
과연 도움이 되실지는 의문 ^^;


MadOx Henry
----
#include<iostream.h>

enum BREED{ YORKIE, CAIRN, DANDIE, SHETLAND, DOBERMAN ,LAB } ; // << 이거 모하는 건지 모르겠음;;

/*
enum 은 한국말로 열거형 상수라고 부릅니다. enum 은 enumeration 의 약자이구요.
열거형 상수는 여러개의 상수를 정의할 때 편하게 사용할 수 있구요, 추가적으로
타입 안정성을 위해 사용하기도 합니다. 자세한건 밑에서..

snowflower 님이 설명해주신것 처럼, BREED 열거형의 상수 YORKIE 는 0, CAIRN 은 1 ...
이런식으로 정의 되구요. 만약에

enum BREED { YORKIE = 5, CAIRN, ... }; 형태로 정의 했다면, YORKIE 는 5, CAIRN 은 6
으로 지정됩니다.
*/

class Mammal
{
public:
    // 생성자 -_-??
/*
생성자는 이름이 클래스 명과 동일하며 리턴타입이 없는 메소드를 말합니다. 해당 클래스의 인스턴스가
메모리속에 만들어질 때 최초로 불려지는 메소드이며, 일반적인 사용 용도는 멤버 변수의 초기 값을
설정한다거나, 메모리 할당등 새로 만들어지는 인스턴스가 정상적인 활동을 할때 필요한 것들을 준비하기
위한 메소드라고 보시면 됩니다.

소멸자는 앞에 '~' 가 붙어있고, 생성자와 마찬가지로 클래스명과 동일한 이름을 가진 메소드를 말하며,
생성자와는 반대로 해당 인스턴스를 메모리속에서 제거할 때 꼭 해줘야 하는 일들을 기술합니다.
즉, 생성자에서 할당한 메모리를 해제해 준다거나(안해주면 바로 메모리 누숩니다..) 인스턴스의 생명
주기 동안 할당된 각종 리소스들을 해제한다거나, 슈팅게임에서 적기의 인스턴스라면 뒈지면서 폭발과
파편 인스턴스를 잔뜩 만들어놓고 죽는다거나.. 용도는 다양합니다. ^^;
*/
    Mammal();
   ~Mammal();
    
    //액세스 그리고.. 이부분 잘 모르겠어요.
/*
액세서(accessor)라고 하기도 하고, Getter/Setter 라고 하기도 하는데요. 암튼 이넘의 목적은
객체의 프로퍼티에 대해 접근할 수 있도록 해주기 위함입니다. 그럼 프로퍼티란 뭐냐구요? 프로퍼티는
객체(나 인스턴스나 거의 같은 용어이므로 일부러 혼용합니다.)의 멤버 변수중 외부에서 접근 가능한
넘들을 이야기 합니다. 객체의 특성을 나타내죠. 내부적으로 사용되는 멤버 변수는 프로퍼티라 부르지
않습니다. 이유는 외부에서 그 객체의 특성을 판단하는데 아무런 도움이 되지 않기 때문입니다.
밑의 메소드들에서 볼 수 있듯, 포유동물(Mammal)이라는 클래스 인스턴스의 프로퍼티는 나이와 무게가
있습니다. (졀라 간단한...) 이 프로퍼티는 크게 읽기 전용, 읽기/쓰기 겸용으로 나눌수 있습니다.
쓰기 전용은 없습니다. (있어봐야 무슨 도움이... ) 이 예에서는 Getter/Setter 모두 존재하므로
Age 및 Weight 모두 읽기/쓰기 겸용 프로퍼티 입니다.
쉽게 정리하면 객체의 특성을 조회하고, 설정하기 위한 메소드를 프로퍼티라고 하며, 통상적으로
GetXXX, SetYYY, 불 대수형태면 IsXXX, SetYYY 형태로 클래스 정의에서 나타납니다.
어, 구질구질 설명이 길어졌네요 ㅡㅡ;
*/
    int GetAge()const; // 상수인가요?
    void SetAge(int);
    int GetWeight() const;
    void SetWeight();
/*
함수명 뒤에 띨렁 붙어있는 const 의 정체는 리턴 값이 상수라는 뜻입니다.
*/
    
    // 다른 메서드
    void Speak();
    void Sleep();
    
protected:
    int itsAge;
    int itsweight;
};
    
class Dog : public Mammal
{
public :
    // 생성자
    Dog();
   ~Dog();
    
    // 액세스  이부분도 잘 모름..
/*
개(Dog)에 대해서 특화된 프로퍼티입니다. 프로퍼티 타입은 BREED (위에서 정의한 열거형이죠?)
입니다. BREED 는 어차피 내부적으로 int 값이므로 int 라고 적어도 무리없어 보입니다만, 왜
궂이 BREED 라는 열거형을 선언해서 그걸 여기에다 쑤셔박아 놨냐면, 앞에서 잠시 언급했던
타입 안정성에 기인합니다. int 로 선언했을 경우 컴파일러가 SetBreed() 메소드의 매개변수로
int 값 중 아무거나 넣어줘도 전혀 문제가 생기지 않습니다. 위의 BREED 열거형 상수들 역시

#define YORKIE   0
#define CAIRN    1
#define DANDIE   2
#define SHETLAND 3
#define DOBERMAN 4
#define LAB      5

혹은

const int YORKIE   = 0;
const int CAIRN    = 1;
const int DANDIE   = 2;
const int SHETLAND = 3;
const int DOBERMAN = 4;
const int LAB      = 5;

라고 정의해주고 사용해도 큰 무리는 없어 보입니다. 허나 중요한 차이점이 하나 있는데요..
만약에 Breed 프로퍼티의 값이 0 ~ 5 이외의 값이 들어갈 경우 프로그램에서 제대로 처리할
수 없다고 할 경우 어떻게 해줘야 할까요? 일반적으로 생각해보면

void SetBreed(int breed) {
     if (breed < 0 || breed > 5) {
             // 에러처리
     }
    
     ....
}

이렇게 해야 할껍니다. 내가 실수로 프로그램 내에서 SetBreed(500) 이라고 적어줘도 실행해
보기전에는 오류인지 아닌지 알 도리가 없습니다. assert 문을 쓴다고 해도 가뭄에 콩나 듯
가끔 실행되는 부분이라면 그 부분에 도착할때 까지 프로그램의 버그를 찾아내지 못하게 됩니다.
하지만 SetBreed(5.0) 이라고 적어주면 어떤가요? 컴파일러가 뱉어 버립니다. int 보다 double이
더 넓은 범위의 수를 지원하므로 정밀도의 손실이 일어나니깐 강제로 캐스팅(casting)을 하던가
아니면 포기하라고 윽박지르죠? 얼마나 편합니까. 실수를 미연에 방지할 수 있죠..

그럼 int 대신 BREED 를 썼을 경우엔 어떤가요? 직접해보시면 아시겠지만, 열거형 상수에 포함
되어있지 않은 값 '500' 등을 줬을때 컴파일러가 친절하게 뱉어(?) 줄 것입니다. ^^;
버그의 발생 소지를 상당히 줄여주겠지요..
*/
    BREED GerBreed() const;
    void SetBreed(BREED) ;
    
    //다른 메서드
    //wagTali();
    //BegForFood();
    
protected:
    BREED itsBreed;
};