왜 생겨났을까? "역할"과 "구현"의 분리코딩을 하다 보면 비슷한 기능을 가진 여러 클래스를 만들어야 할 때가 많습니다. 예를 들어, 게임에 등장하는 몬스터를 만든다고 가정해 봅시다. 고블린, 오크, 드래곤은 모두 '공격'이라는 기능을 가지고 있죠.초보 개발자라면 아마 각 클래스에 attack()이라는 메서드를 개별적으로 만들 겁니다. 하지만 이렇게 하면 문제가 생깁니다.고블린의 공격 방식은 단검 던지기, 오크는 몽둥이 휘두르기, 드래곤은 불 뿜기 등 각각의 구현 내용이 다릅니다.만약 게임의 새로운 규칙을 추가해서 '모든 몬스터는 독에 걸릴 수 있다'는 기능을 넣으려면, 모든 몬스터 클래스에 poison() 메서드를 추가해야 합니다. 몬스터 종류가 많아질수록 수정해야 할 곳이 기하급수적으로 늘어나겠죠.이..