[42seoul] 4 circle - CPP Module 04

하이초·2023년 1월 6일
0

42seoul

목록 보기
5/11
post-thumbnail

CPP04 github 😋

1. ex00

👀 cpp04는 cpp03에 이어 계속해서 상속에 대해 알아가는 과제이지만 03보다 좀 더 다형성에 집중한 그런 느낌? 가보자고 폴리모피즘~

🥨 다형성

  • 다형성이란 여러 개의 서로 다른 객체가 같은 이름의 함수를 서로 다르게 활용할 수 있는 그런 것이다..!
  • ex00에서는 makeSound()라는 함수가 그러하다.
  • 고양이가 왈왈하고 울면 안되니까.. 그것이 고양이니까.. 😺 같은 부모를 상속한 클래스들이 같은 함수에 대해서 다시 오버라이딩해서 각자에 맞는 기능을 하게끔 하는 것이 바로 다형성이다.
  • cpp03에서 살펴본 것과 같이 함수를 오버라이딩할 경우 virtual 키워드를 사용하여 의도한 바에 맞는 함수가 호출 될 수 있도록 하자!
  • 이 virtual 키워드를 사용하지 않는 경우가 wronganimal 예제!

2. ex01

👀 ex01은 동물들이 드디어 뇌를 가지게 되었다!

🥨 깊은 복사

  • 이번부터는 dog와 cat클래스가 brina* 변수를 가지게 된다. 포인터 변수를 갖게 되는 만큼 깊은 복사를 신경써야 한다!

3. ex02

👀 ex02는 추상 클래스에 대해서 알아보는 문제였다.

🥨 추상 클래스

  • 자바 같은 경우는 클래스 자체에 abstract 클래스를 명시하여 추상 클래스임을 알려주게 되어있는데, c++같은 경우는 순수 가상 함수가 한 개 이상 포함된 클래스가 바로 추상 클래스이다.
  • 추상 클래스의 경우 인스턴스화 할 수 없다.
  • 단일 상속만 가능하다.
  • 일반 변수를 가질 수 있다.
  • 이를 상속한 파생 클래스에서는 순수 가상함수를 모두 재정의해야 한다.
  • 추상클래스도 오쏘독스캐노니컬폼을 맞춰야 하는가에 대한 생각을 해보았는데, 결국 상속받은 파생 클래스가 생성될 때 추상 클래스(부모 클래스)도 생성되는 것을 보아 하는 것이 맞는 것 같다.

🥨 순수 가상 함수
- 그렇다면 순수 가상 함수란 무엇인가? 함수에 = 0;을 붙인 것이 가상함수다..!
- 그를 통해 해당 클래스에서는 그 함수를 구현하지 않을 것이며, 이 클래스를 상속받는 곳에서 재정의 할 것이라는 것을 알려주는 것이다.
- 이때 부모에 선언된 순수 가상 함수는 vtable에 잡혀있을 지 궁금한데,, 그건 잘 검색이 되지 않네 🤔

4. ex03

👀 ex03은 추상클래스에 더하여 인터페이스에 대해 알아보는 과제였다.

🥨 AMateria - Materia

  • character가 갖는 AMateria inventory 배열은 포인터 변수로 가지고 있어야 한다. AMateria는 추상클래스로 인스턴스화 될 수 없기 때문이다..!
  • 따라서 복사생성자나 대입연산자 사용 시 "COPY"에 대해 Deep copy를 진행하여야 한다. 이는 서브젝트에도 명시되어있다. 만약 기존에 materia 요소를 가지고 있을 경우 이를 할당해제하고 새로 딥카피하여 넣어줘야 한다.

🥨 인터페이스

  • 캐릭터와 메레티아소스가 바로 인터페이스를 활용하는 클래스다.
  • 캐릭터는 메테리아소스로 만들어놓은 메테리아를 활용하여 해당 메테리아를 착용, 착용 해제, 사용 등을 할 수 있다.
  • 메테리아소스는 메테리아를 기반으로 메테리아를 학습하고 만들 수 있다.

🚨 이번 과제에서 특히 주의할 점은 소멸자와 복사 생성자인 것 같다.
아 그리고 AMateria <-> ICharacter, IMateriaSource간 상호 인클루드가 안되어서 방법을 찾아보니 ICharacter, IMateriaSource는 AMateria를 인클루드하고, AMateria.hpp에서는 선언만 해두고 실제 인클루드는 AMateria.cpp에서 ICharacter가 아닌 Character.hpp를 인클루드 하는 것으로 방법을 찾았다.

🚴 CPP 가보자고!

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글