SOLID 원칙. 객체 지향 설계를 더 쉽고 유지 관리 하기 쉽도록 하는 5가지 원칙으로 2000년 로버트 마틴1이 그의 논문, Design Principles and Design Patterns에서 최초로 제시한 개념입니다.

물론 지금은 2024년이고, 그 당시 개발 환경과 지금과는 차이가 존재 하기에, SOLID 원칙이 이제는 필요가 없다는 의견도 있습니다.

하지만, 저는 SOLID 원칙이 여전히 객체 지향 개발이 지향 해야 할 방식을 주고 있다고 생각합니다. 그러므로 이번 포스팅에서는, SOLID 원칙에 대해서 배워보며 백준 온라인 저지의 대표적인 OOP 문제인 RPG Extreme를 함께 풀어보겠습니다.

0. 문제 설명

저는 SOLID 원칙을 RPG Extreme을 풀어보며 해결할 것이기 때문에, 먼저 RPG Extreme에 대해 간략히 설명을 해드리겠습니다.

map

RPG Extreme는, 문제 이름에서 유추 할 수 있듯, RPG에 관한 문제입니다. $N \times M$ 크기의 지역에서, 입력으로 주어진 플레이어의 이동을 수행하며 해당 칸에서 상호작용 하여 그 결과를 출력해야 합니다.

칸마다 있을수 있는 것의 종류는 7가지입니다.

0.1. 플레이어

조작하는 플레이어입니다. 맵에서 표기는 @으로 되고, 체력, 공격력, 방어력, 경험치, 레벨, 악세사리 착용 등의 특성을 가집니다.

0.2. 몬스터

플레이어와 같은 칸에 있을시 전투하는 몬스터입니다. 맵에서 표기는 &로 되고 체력, 공격력, 방어력, 얻을 수 있는 경험치의 특성을 가집니다. 해당 몬스터가 제거된다면 칸이 빈칸으로 바뀝니다.

0.3. 보스 몬스터

플레이어와 같은 칸에 있을시 전투하는 보스 몬스터입니다. 맵에서 표기는 M으로 되고, 체력, 공격력, 방어력, 얻을 수 있는 경험치의 특성을 가집니다. 해당 몬스터가 제거된다면 게임이 플레이어의 승리로 종료됩니다.

0.4. 상자

플레이어와 같은 칸에 있을시 상자에 있는 아이템을 주는 상자입니다. 맵에서 표기는 B로 되고, 무기가 주는 공격력, 방어구가 주는 방어력, 악세사리 등의 특성을 가집니다. 상자를 연다면 칸이 빈칸으로 바뀝니다.

0.5. 가시 함정

플레이어와 같은 칸에 있을시 피해를 5(특정 악세사리 소지시 1) 주는 가시 함정입니다. 맵에서 표기는 ^으로 됩니다.

0.6. 빈칸

플레이어가 지나갈 수 있는 빈칸입니다. 맵에서 표기는 .으로 됩니다.

0.7. 벽

플레이어가 지나갈 수 없는 벽입니다. 맵에서 표기는 #으로 됩니다.

대략적으로 알아봤으니, 이제 SOLID 원칙과 함께 구현해보겠습니다.

S. 단일 책임 원칙

한 클래스는 하나의 책임만 가져야 한다.

Single responsibility principle. 단일 책임 원칙입니다.

여기서 의미하는 책임은 기능을 수행하는 것에 대한 책임이라고 생각하면 됩니다. 한가지 클래스는 한가지의 기능만을 수행해야 한다는 의미입니다. 그리고 해당 클래스를 수정하는 이유 또한 한가지여야 합니다.

이 원칙을 지키지 않고, 한 클래스가 여러 책임을 가지게 된다면, 서로 다른 책임들 간에 결합력이 생겨, 한개의 책임을 수정함에도 다른 책임들을 수정해야 할 일이 생기게 될것입니다.

예시를 들어보겠습니다.

  1. 클린 코드(Clean Code)의 저자입니다.