Search

객체지향 프로그래밍 연습(상속)

C++ 상속 (Inheritance) 정리

1. 기본 개념

상속이란 기존 클래스를 기반으로 새로운 클래스를 만드는 객체지향 개념입니다.
공통된 속성과 동작을 코드 재사용을 통해 자식 클래스에서 활용할 수 있게 해줍니다.
class 부모클래스 { public: void 공통기능() { std::cout << "모든 자식에게 공통!" << std::endl; } }; class 자식클래스 : public 부모클래스 { public: void 고유기능() { std::cout << "자식 고유 기능" << std::endl; } };
C++
복사

2. 상속 키워드 종류

종류
의미
public
부모 클래스의 public/protected 멤버 → 그대로 유지
protected
부모의 public → protected로
private
부모의 모든 public/protected → private로
보통은 **public 상속**을 사용합니다.

3. 단일 상속 예제

#include <iostream> using namespace std; class Animal { public: void Eat() { cout << "먹는다" << endl; } }; class Dog : public Animal { public: void Bark() { cout << "멍멍!" << endl; } }; int main() { Dog d; d.Eat(); // Animal의 함수 호출 d.Bark(); // Dog 고유 함수 호출 }
C++
복사
Dog는 Animal을 상속받아서 Eat()을 사용할 수 있습니다.

4. 상속받은 함수 호출 (이름이 같을떄)

class Animal { public: void Speak() { std::cout << "???"; } }; class Cat : public Animal { public: void Speak() { std::cout << "야옹!"; } };
C++
복사
이 경우 함수 이름은 같지만 동작은 다릅니다.

5. virtual 함수와 다형성 (Polymorphism)

class Animal { public: virtual void Speak() { std::cout << "Animal Sound" << std::endl; } }; class Dog : public Animal { public: void Speak() override { std::cout << "멍멍!" << std::endl; } }; void MakeAnimalSpeak(Animal& a) { a.Speak(); // virtual이 없으면 Animal 버전만 실행됨 } int main() { Dog d; MakeAnimalSpeak(d); // "멍멍!" }
C++
복사
virtual 키워드를 사용하면 부모 포인터/레퍼런스를 통해도 자식의 오버라이딩된 함수가 호출됩니다.
이걸 동적 바인딩 또는 런타임 다형성이라고 합니다.

6. 순수 가상 함수 (Abstract Class)

class Shape { public: virtual double Area() const = 0; // 순수 가상 함수 }; class Circle : public Shape { double radius; public: Circle(double r) : radius(r) {} double Area() const override { return 3.14 * radius * radius; } };
C++
복사
= 0이 붙은 함수는 구현이 없는 순수 가상 함수입니다.
이걸 포함한 클래스는 추상 클래스가 되며, 객체를 직접 생성할 수 없습니다.

7. 상속 관련 주의사항

소멸자는 반드시 virtual ~Base()로 선언하여 자식 객체 소멸 보장
생성자/소멸자는 상속되지 않음 → 자식에서 명시 호출 필요 가능
private 멤버는 자식에서 접근 불가 (접근은 protected or public만)

핵심 요약

개념
요약
public 상속
일반적으로 사용, 부모 멤버 그대로 유지
virtual 함수
다형성(오버라이딩)을 가능하게 함
= 0
순수 가상 함수 → 추상 클래스가 됨
virtual ~Base()
메모리 해제시 자식까지 소멸시키기 위해 필요
필요하시다면 이 내용을 PDF 또는 수업자료용 슬라이드로 정리해드릴 수 있습니다.
또는 방금 만든 20문제 중 하나를 골라서 위 개념을 바탕으로 완성 예제로도 제공 가능해요.
원하시는 방식이 있으신가요?

C++ 상속 연습문제 20선 (동적할당 X)

문제 1. 동물 소리 출력

int main() { Dog d("Baekgu"); Cat c("Nabi"); d.Speak(); // Baekgu barks! c.Speak(); // Nabi meows! }
C++
복사
요구사항:
Animal 클래스를 기반으로 Dog, Cat 클래스를 상속합니다.
이름을 멤버로 가지고, Speak() 함수는 각 동물에 맞게 다형적으로 동작해야 합니다.

문제 2. 도형 면적

int main() { Circle c(3.0); Rectangle r(4.0, 2.0); std::cout << c.Area() << std::endl; // 28.26 std::cout << r.Area() << std::endl; // 8.00 }
C++
복사
요구사항:
Shape 클래스를 기반으로 Circle, Rectangle 클래스를 구현하세요.
Area() 함수를 통해 면적을 반환합니다. 소수점 둘째 자리까지 출력하세요.

문제 3. 직원 급여 계산

int main() { Manager m("Kim", 5000); Developer d("Lee", 3000); m.ShowSalary(); // Kim: 7500 d.ShowSalary(); // Lee: 3300 }
C++
복사
요구사항:
Employee 클래스를 기반으로 Manager, Developer를 상속합니다.
급여 계산 로직은 각각 다르게 적용되며, ShowSalary()로 출력합니다.

문제 4. 악기 연주

int main() { Piano p; Guitar g; p.Play(); // Piano: ding ding! g.Play(); // Guitar: strum strum! }
C++
복사
요구사항:
Instrument 추상 클래스를 만들고, Play() 함수를 구현합니다.
Piano, Guitar는 각각 다르게 연주 소리를 출력합니다.

문제 5. 게임 캐릭터

int main() { Knight k("Arthur"); Mage m("Merlin"); k.Attack(); // Arthur slashes with sword! m.Attack(); // Merlin casts a spell! }
C++
복사
요구사항:
Character 클래스를 상속받아 Knight, Mage를 구현합니다.
이름을 저장하고, 각 캐릭터의 Attack() 방식이 다르게 동작해야 합니다.

문제 6. 스마트기기 명령

int main() { SmartLight light; SmartSpeaker speaker; light.Execute("turn on"); speaker.Execute("play music"); }
C++
복사
요구사항:
SmartDevice를 상속받아 각각 명령 처리하는 SmartLight, SmartSpeaker 클래스를 만드세요.
문자열 명령에 따라 동작이 다르게 출력되어야 합니다.

문제 7. 유닛 이동

int main() { Warrior w("Thor"); Archer a("Robin"); w.Move(); // Thor charges forward a.Move(); // Robin moves silently }
C++
복사
요구사항:
Unit 클래스를 상속받아 Warrior, Archer를 만듭니다.
각각의 Move()는 이름과 함께 고유의 메시지를 출력합니다.

문제 8. 알림 시스템

int main() { EmailNotification e("kim@example.com"); SMSNotification s("010-1234-5678"); e.Send(); s.Send(); }
C++
복사
요구사항:
Notification 추상 클래스를 만들고, Send() 함수를 구현합니다.
이메일, SMS 각각 다른 형식으로 전송 메시지를 출력합니다.

문제 9. 운동 기록

int main() { Running run(30); Cycling cycle(60); run.PrintCalories(); // Running: 300 kcal cycle.PrintCalories(); // Cycling: 500 kcal }
C++
복사
요구사항:
Exercise 클래스를 기반으로 Running, Cycling을 상속합니다.
운동 시간에 따른 칼로리 계산 및 출력 기능을 구현하세요.

문제 10. 도서관 아이템

int main() { Book b("C++ Guide"); DVD d("Inception"); b.PrintInfo(); d.PrintInfo(); }
C++
복사
요구사항:
LibraryItem 클래스를 기반으로 Book, DVD를 상속합니다.
각각 아이템 정보를 출력하는 PrintInfo()를 오버라이드 하세요.

문제 11. 교통수단

int main() { Bus b; Train t; b.Move(); t.Move(); }
C++
복사
요구사항:
Vehicle 클래스를 상속하여 Bus, Train을 만드세요.
Move() 함수는 각 교통수단의 고유한 이동 방식 메시지를 출력합니다.

문제 12. 동물 병원

int main() { Dog d("Bori"); Bird b("Chirpy"); d.Vaccinate(); b.Vaccinate(); }
C++
복사
요구사항:
Pet 클래스를 상속하여 Dog, Bird를 구현하세요.
이름과 종류에 맞는 백신 메시지를 출력하는 Vaccinate()를 만드세요.

문제 13. 전자기기 전원

int main() { Laptop l("Lenovo"); Tablet t("iPad"); l.PowerOn(); t.PowerOn(); }
C++
복사
요구사항:
Device 클래스를 기반으로 Laptop, Tablet을 상속합니다.
각각 제품 이름과 함께 전원이 켜지는 메시지를 출력하세요.

문제 14. 결제 수단

int main() { CreditCard c("Kim", "1234"); PayPal p("lee@mail.com"); c.Pay(10000); p.Pay(5000); }
C++
복사
요구사항:
PaymentMethod 추상 클래스를 만들고, CreditCard, PayPal을 구현하세요.
금액과 계좌 정보에 맞게 결제 메시지를 출력합니다.

문제 15. 학교 구성원

int main() { Student s("Jisoo"); Teacher t("Minho"); s.Introduce(); t.Introduce(); }
C++
복사
요구사항:
Person 클래스를 상속받아 Student, Teacher를 만드세요.
Introduce() 함수는 각각 “I'm student ___”, “I'm teacher ___” 형식으로 출력합니다.

문제 16. 전투 피해량 계산

int main() { Swordman s(100, 20); Mage m(100, 30); s.DealDamage(); // Swordman deals 20 m.DealDamage(); // Mage deals 30 }
C++
복사
요구사항:
Fighter 클래스를 상속받아 Swordman, Mage를 만드세요.
공격력만큼 피해를 주는 DealDamage() 함수를 구현하세요.

문제 17. 세금 계산기

int main() { Employee e("Kim", 5000); Freelancer f("Lee", 3000); e.CalculateTax(); // 500 f.CalculateTax(); // 300 }
C++
복사
요구사항:
TaxPayer 클래스를 상속하여 Employee, Freelancer를 구현하세요.
각각 다른 세율로 세금을 계산하고 출력하세요.

문제 18. 주문 시스템

int main() { Burger b(5000); Pizza p(8000); b.PrintPrice(); // 5000원입니다 p.PrintPrice(); // 8000원입니다 }
C++
복사
요구사항:
MenuItem 클래스를 상속받아 Burger, Pizza를 만들고,
각각 가격을 출력하는 PrintPrice() 함수를 작성하세요.

문제 19. 전시회 작품

int main() { Painting p("Mona Lisa"); Sculpture s("David"); p.Display(); s.Display(); }
C++
복사
요구사항:
ArtWork 클래스를 상속하여 Painting, Sculpture를 만드세요.
이름과 유형에 맞는 메시지를 출력하는 Display()를 구현하세요.

문제 20. 운동 시뮬레이터

int main() { Pushup p(20); Squat s(30); p.Show(); // Pushups: 20 reps s.Show(); // Squats: 30 reps }
C++
복사
요구사항:
Workout 클래스를 상속받아 Pushup, Squat을 구현합니다.
횟수를 저장하고, Show() 함수에서 형식에 맞게 출력하세요.
필요하다면 이 문제들을 기반으로:
PDF / DOCX 형태 문제지 제작
각 문제별 해설 또는 구현 예시 제공
난이도별 정렬 또는 교육용 수업 자료화
도 가능합니다. 원하시나요?