c++ 에서 좀더 안정적인 프로그래밍을 위해, 게임 규모가 대형화 되면서 모던 객체 지향 설계 도입이 필요해졌다.
디자인 패턴을 필두로 안정적인 설계 방법이 연구됨
현재 시점에서 모던(Modern) 하다는 뜻은 아니다.
유지보수와 유연함, 확장성 향상을 위한 객체 지향 프로그래밍 원칙 (SOLID)
Single resonsibility principle (SRP) | 단일 책임 원칙
하나의 클래스는 하나의 책임만 가져야 한다.
Open / closed principle (OCP) | 개방 폐쇄 원칙
클래스 설계를 변경하지 않고 동작을 확장할 수 있어야 한다. 확장에는 열려(open)있고 수정에는 닫혀(close)있는, 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다.
캐릭터 하나 생성한다고 할때, 각각의 캐릭터가 움직임이 다를경우,
움직임의 패턴 구현을 하위 클래스에 맡긴다면,
캐릭터 클래스의 수정은 필요가 없고(close) 움직임의 패턴만 재정의 하면 된다. (open)
Liskov subsituation principle (LSP) | 리스코프 치환 원칙
자식클래스는 부모 클래스를 대체 사용할 수 있어야 한다.
자식 클래스는 부모 클래스의 책임을 무시하거나 재정의 하지 않고, 확장만 수행하도록 해야 한다.
Interface segregation principle (ISP) | 인터페이스 분리 원칙
작고 명확한 인테페이스들로 분리해 관리해야 한다.
한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
하나의 일반적인 인터페이스 보다 여러개의 구체적인 인터페이스가 낫다
Dependency inversion principle (DIP) | 의존 역전 워칙
구현을 배제시킨 상위 정책을 바라보며 설계해야 한다.
의존 관계를 맺을 때 변화하기 쉬운것, 또는 자주 변화하는 것 보다는
변화하기 어려운것, 거의 변화가 없는것에 의존하라는 것이다.
한마디로 구체적인 클래스보다
인터페이스나 추상 클래스와 관계를 맺어야 한다는 것이다.
후발 언어 ( C#, JAVA ) 등이 보완한 새로운 기능
후발 언어 들은 모던 객체지향 설계 원칙을 보다 편리하게 구현할 수 있도록 아래와 같은 기능을 구현하였다.
인터페이스 (Interface) : 객체 설계의 틀을 제공하는 추상 클래스
리플렉션 (Reflection) : 런타임에서 객체의 구조를 파악하고 객체에 메타데이터를 부여
델리게이트 (Delegate) : 프로그램에서 발생한 이벤트를 다수의 객체에 효과적으로 전달하는데 활용
언리얼 엔진의 선택
성능을 위해 기존 c++ 언어를 포기할 수 없었다.
그러면서 모던 객체 지향 설계 원칙을 가능하도록 하기 위해
모던 객체 지향 설계를 위한 새로운 시스템을 구축하였다.
이로서 unreal 은 성능과 유지보수를 모두 잡을수 있었고.
언리얼 오브젝트를 사용해 대규모 게임 제작을 안정적으로 설계하고 구현할 수 있었다. (c++ 학습도 어려운데, 언리얼 c++ 까지 추가로 배워야 한다는 점..)