상속과 관련된 과제를 진행했다! 동료평가...! 42서울의 장점을 다시 한 번 느꼈다. 누군가에게 내가 배운 것을 전달할 수 있다는 것 자체가 정말 좋은 기회다.
"배움은 누가 챙겨주지 않고, 내가 훔쳐 먹는 것이다." by 김태리
클러스터에 가는 길에 김태리 수상소감을 봤다. 공감가는 말이다. CPP 공부를 하고 있다. 다른 사람들이 정리해 놓은 다양한 정보를 서칭하고 다른 사람에게 물어보며, 이해가 잘되는 내용으로 공부하며 배운다. 이 부분이 훔쳐 먹는다는 표현과 어울린다고 생각했다.
42서울에는 동료 평가를 하며 내가 배운 것을 설명한다. 다른 사람에게 내가 배운 것을 전달하는 건 훔쳐 먹은 것을 넘어서, 소화시켜 진정한 내 것으로 만들기 가장 좋은 방법 중 한가지인 것 같다.
이번 평가를 통해 헷갈렸던 부분을 바로 잡을 수 있었다.
오버로딩과 오버라이딩
virtual class 와 virtual function
오버라이딩은 부모 클래스가 갖고 있는 메서드를 클래스에서 재정의 하는 것을 이야기한다.
오버로딩은 메서드 이름이 같지만 매개 변수의 유형과 개수에 따라 다른 기능을 하게 덮어쓰는 것을 이야기한다.
아래 코드를 예로 들면, DiamondTrap
클래스는 FragTrap
클래스를 상속 받는다. 그리고 FragTrap
과 DiamondTrap
은 void attack(const std::string &target);
이라는 같은 멤버 함수가 있다. 이럴 때 DiamondTrap
이 FragTrap
의 attack
함수를 오버라이딩했다고 할 수 있다.
빨간 박스가 모두 오버로딩 됐다고 볼 수 있다. ClapTrap
이라는 같은 함수이지만, 다른 매개변수와 개수를 갖는다!!
https://private.tistory.com/25
가상 클래스는 다이아몬드 상속의 문제를 해결하기 위해 생겼다. 아래 그림을 보면 DiamondTrap
은 ScavTrap
과 FragTrap
의 상속을 받는다. 그리고 ScavTrap
과 FragTrap
은 같은 부모 ClapTrap
의 상속을 받는다. 그리고 virtual
옵션이 붙어있다.
virtual
이 없으면 왜 안되는 걸까? virtual
이 없으면 아래 그림의 2번처럼 이뤄진다. 즉, 불필요하게 메모리를 차지하게 되는 것이다. 그래서 virtual
을 붙여줘야한다.
virtual
옵션이 없을 때 어떻게 되는지 보자. Diamond
클래스에서 에러가 발생한다.
가상 함수는 자식 클래스에서 오버라이딩할 때 발생할 수 있는 문제를 해결하기 위해 생겼다. 아래 그림처럼 Animal
클래스의 상속을 받아 Dog
클래스가 상속을 받았다. 이때 makeSound
을 오버라이딩하고 있다.
이때 Dog 클래스로 만들어진 객체가 makeSound
를 호출했을 때, Dog
클래스의 makeSound
호출을 확실히 하기 위해서 Animal
클래스의 makeSound
함수 앞에 virtual
을 선언한다. 다르게 이야기하면, 부모 클래스의 멤버 함수에 virtual
이 선언되어있다면 자식 클래스에서 해당 함수를 재정의 할 것이다라고 암시할 수 있는 것이다.