"

Cpp - 좔상 클래슀

2022. 5. 7. 12:22ㆍC++

πŸ’‘ 좔상 클래슀

 

좔상 클래슀(abstract class)

: κΈ°λŠ₯이 ꡬ체적으둜 μž‘μ„±λ˜μ§€ μ•Šμ€ 클래슀. 즉 ν•˜λ‚˜ μ΄μƒμ˜ 순수 가상 ν•¨μˆ˜(pure virtual function)을 μ§€λ‹Œ 클래슀λ₯Ό μ§€μΉ­ν•œλ‹€.

μƒμ„±ν•˜κ³ μž ν•˜λŠ” 객체듀이 λ°˜λ“œμ‹œ μ–΄λ–€ κΈ°λŠ₯을 κ°€μ Έμ•Όν•œλ‹€λ©΄, κ·Έ κΈ°λŠ₯을 좔상 클래슀의 순수 가상 ν•¨μˆ˜λ‘œ μž‘μ„±ν•΄λ†“κ³ , ν•΄λ‹Ή 클래슀λ₯Ό μ΄μš©ν•΄ λ§Œλ“  μžμ‹ν΄λž˜μŠ€(μƒμ„±ν•˜κ³ μž ν•˜λŠ” 객체)μ—μ„œλŠ” 이 가상 ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•΄ κΈ°λŠ₯을 κ΅¬ν˜„ν•œλ‹€.

좔상 ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ λͺ©μ μ˜ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλΌ 상속을 ν†΅ν•œ λ‹€μ–‘ν•œ 클래슀의 생성을 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€μΈ μ…ˆ.

좔상 ν΄λž˜μŠ€λŠ” κΈ°λŠ₯이 μ •μ˜λ˜μ§€ μ•Šμ€ 순수 가상 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  있기 λ•Œλ¬Έμ— λΆˆμ™„μ „ν•œ 클래슀둜 λ³Ό 수 μžˆλ‹€. λ”°λΌμ„œ 좔상 ν΄λž˜μŠ€μ— λŒ€ν•œ κ°μ²΄λŠ” μƒμ„±λΆˆκ°€λŠ₯.

 #include <iostream>
 β€‹
 class Test {
 private:
 int num;
 public:
 virtual ~Test() {}
 virtual void func() = 0;
 };
 β€‹
 int main() {
 //COMPILE ERROR! 
   Test *test = new Test;
 }

그럼 μ–΄λ–»κ²Œ 객체λ₯Ό μƒμ„±ν•˜μ§€? 좔상 클래슀λ₯Ό 상속 받은 μžμ‹ν΄λž˜μŠ€λ₯Ό λ§Œλ“€κ³  μžμ‹ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©μ„ 톡해 순수 κ°€μƒν•¨μˆ˜λ₯Ό μ‹€μ œλ‘œ κ΅¬ν˜„ν•΄μ„œ μΈμŠ€ν„΄μŠ€ μƒμ„±ν•œλ‹€.

좔상 클래슀의 νƒ€μž…μ˜ 포인터와 μ°Έμ‘°λŠ” μ„ μ–Έ κ°€λŠ₯함.

μ œν•œ 사항

  1. 좔상 클래슀둜 객체 생성 λΆˆκ°€
  2. ν•¨μˆ˜μ˜ 인자둜 μ‚¬μš© λΆˆκ°€
  3. ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ μ‚¬μš© λΆˆκ°€
  4. λͺ…μ‹œμ  λ³€ν™˜ ν˜•μ‹ λΆˆκ°€
  5. 일반 λ³€μˆ˜λ‚˜ 멀버 λ³€μˆ˜λ‘œ μ‚¬μš© λΆˆκ°€

예제

 #include <iostream>
 β€‹
 class Animal {
 public:
 virtual ~Animal() {} //가상 μ†Œλ©Έμž μ„ μ–Έ
 virtual void cry() = 0; //순수 가상 ν•¨μˆ˜ μ„ μ–Έ
 };
 β€‹
 class Dog : public Animal {
 public:
  virtual void cry() {
  std::cout << "bark!" << std::endl;
  }
 };
 β€‹
 class Cat : public Animal {
 public:
 virtual void cry() {
 std::cout << "meaw~" << std::endl;
 }
 };
 β€‹
 intmain() {
 Cat cat;
 Dog dog;
 β€‹
 cat.cry();
 dog.cry();
 
 return (0);
 }