오늘은 객체지향 프로그래밍 중 상속과 다형성에 대해 배웠다.
- 상속
자동차를 만든다고 가정해보자.
각 자동차마다 세부 스펙은 다르지만, 모든 자동차가 공통적으로 가지는 속성이 있다. 여러가지 있지만 그 중 대표적으로 속도와 색상이 있다고 하자.
이러한 공통적인 특성을 매번 모든 자동차에 개별적으로 구현하는 대신 하나의 기본 클래스(Class)를 정의하고 공통 속성을 구현하여 이를 활용하면 유지보수가 쉬워지고 코드의 중복을 막을 수 있다.
먼저 위와 같이 Vehicle로 클래스를 정의하고
위와 같이 자전거와 트럭 파생(자손) 클래스를 만들 수 있다.- 부모 클래스(Vehicle)은 다음과 같은 특성이 있다.
- 데이터는 색상과 속도이다.
- 속도와 색상은 생정자를 통해 초기화 할 수 있다.
- 색상을 getter와 setter로 설정할 수 있다.
- move 함수를 호출하면 현재 속도를 출력한다.
- Bicycle, Truck 클래스
- 생성자는 멤버 초기화 리스트를 통해 멤버 변수들을 초기화할 수 있다.
멤버 초기화 리스트는 생성자 코드모다 먼저 수행된다.- 자식 클래스의 생성자는 부모 클래스의 생성자를 호출할 수 있다.
Bicycle(string c, int s, bool basket) : Vehicle(c, s)
- Bicycle 클래스는 ringBell 메서드는 통해 벨을 울릴 수 있다.
- Truck 클래스는 loadCargo 메서드를 통해 짐을 실을 수 있다.
- Biclyle 클래스는 생성자에서 색상, 속도, basket의 존재 여부를 인자로 받는다.
Biclyle 클래스와 Truck 클래스의 생성자는 속도와 색상 값 초기화 시 부모 클래스인 Vehicle 클래스의 생성자를 사용한다.
Truck 클래스는 생성자에서 색상, 속도, 실을 수 있는 짐의 수용량을 인자로 받는다.
- 모든 동물에 울음 소리를 갖고 있다.
- 예를 들어 사자는 “ahaaaaaa” 소리를 내고, 늑대는 “ohhhhh” 소리를 낸다.
- 동물마다 고유한 울음소리를 출력할 수 있도록 lion과 Wolf 클래스는 설계
- 각 동물 객체를 함수 인자로 받아 해당 동물의 울음소리를 출력 할 수 있도록 구현
- 위 코드는 다형성이 적용되지 않았다.
- 위 코드는 다형성이 적용되었다.
- 새로운 동물이 생길 때마다 관리해야 할 클래스가 많아진다.
Lion, Wolf, Dog 같은 각 동물 유형을 개별 클래스로 작성해야 하기 때문이다.- 이 문제를 해결하는 핵심 개념이 다형성이다.
다형성이란, 기본이 되는 클래스를 만들어 함수의 인터페이스를 정의하고 실제 구현은 자손 클래스에서 담당하게 하는 기법이다.- 동적 바인딩을 통해 실제 호출된 객체의 타입에 따라 적절한 파생 클래스의 함수가 실행되도록 하려면 함수 앞에
virtual키워드를 붙여야 한다.virtual키워드를 붙이면 가상 함수 테이블이 생성된다. 그리고 이 가상 함수 테이블에는 기본 클래스에서virtual로 선언된 함수가 파생 클래스에서 재정의된 경우 그 위치가 기록되어 동적 디스패치가 가능해진다.
- 순수 가상 함수
- 사자의 울음소리는 있다. 개의 울음소리도 있다. 하지만 동물이라는 개념에는 특정한 울음소리가 없다. 그럼에도 불구하고, 인터페이스 제공을 위해 받드시 포함해야 한다. 이런 경우(인터페이스는 필요하지만 기본 클래스에서 구현할 필요가 없는 경우) 순수 가상 함수로 선언한다.
- 순수 가상 함수 정의는 간단하다. 가상 함수를 정의하고
= 0을 붙여주면 된다. 예를 들어,virtual int memFunc() = 0;을 하면 순수 가상 함수가 된다. 추상 클래스는 직접 인스턴스를 생성할 수 없고, 포인터 혹은 참조를 통해서만 사용할 수 있다.
추상 클래스는 직접 인스턴스를 생성할 수 없고, 포인터 혹은 참조를 통해서만 사용할 수 있다.

기본 문법을 바탕으로 여러 상황을 구현하는 방법을 배우기 시작했다. 점점 더 깊이 빠져들수록 어려워지고 있다. 하나 하나 개념을 이해하면서 다음 단계로 나아가야겠
템플릿, STL 등 프로그래밍 관련 개념, 3, 4번째 과제(인벤토리 만들기, 연금술 공방)를 위한 개념 숙지