소프트웨어 공학 공부를 하다보면 추상화에 대한 얘기가 반드시, 자주 등장한다. 얼마 전 함께자라기 세미나를 진행하다가 어떻게하면 쉽게 설명할 수 있을까 고민하게 되었고 그러다 좋은 예시가 생각나서 적어보고자한다.
처음 가는 학교 처음 보는 교실 처음보는 수학 선생님을 만나 수업을 들은 경험이 있는가? 우리는 곧바로 가르침을 받을 수 있다. 그 선생님이 누구인지, 어떤 사람인지, 얼마나 잘하는지는 내 관심사가 아니다. 의심하지 않고 바로 협력할 수 있다. 내가 아는 선생님(추상화)은 가르침(행위)를 할 수 있기 때문이다.
이번엔 다른 친구한테 수학을 가르쳐달라고 한 경험을 보자. 처음 보는 친구에게 할 수 있는가? 아니다. 이 친구가 나보다 수학을 잘하는 사람인지(상태) 가르쳐주는걸 할 수 있는 사람인지(행위)에 대해 알아야한다. 즉, 친구에(구현체) 의존적이다.
다음 교시가 되고 과학시간(요구사항 변경)이다. 과학 선생님이 왔다. 그럼 바로 수업이 가능한가? 당연히 가능하다. 이 사람도 선생님이기 때문이다. 수학 선생님이 은퇴(레거시)하고 새로운 선생님이 왔다. 바로 수업이 가능한가? 당연하다.
그럼 친구는? 갑자기 모르는 과학문제가 생긴다면? 수학을 가르쳐주던 친구가 전학을 가고 새친구가 온다면? 곧바로 수업이 가능할까? 아니다. 이 친구가 나보다 과학을 잘하는지, 새 친구가 나보다 공부를 잘하는 사람인 지 다시 알아야한다.
이것이 추상화다. 수업이라는 프로그램을 만든다고 생각해보자.
가르침 받는 사람 A 와 가르치는 사람 B가 있을 것이다. 그럼 A 는 B 의 함수를 실행해서 응답을 받고 정보를 습득한다. 가르치는 사람 B 가 이제 은퇴 할 나이(레거시 코드)가 되거나 다른 지식을 가르쳐야 한다(요구사항 변경)면 새로운 C 를 찾아 가르침을 받도록 A 의 코드를 수정해야한다.

이번엔 추상화해보자.
가르침(행위)를 가진 사람을 선생님(I)이라고 하자. I 를 구현하는 B’ 가 존재한다. A가 가르침을 받기 위해서는 B’ 를 알아야하는가? 그렇지 않다. I 만 알면된다. 즉, 선생님인지만 알면 가르침을 받을 수 있다.
B’ 가 레거시 코드가 되거나 요구사항 변경되면 B’ 대신 C’ 로 바꿔끼운다. 그럼 수업은 곧바로 가능하다.

쉽게 변경가능한 소프트한 스프트웨어가 만들어진다. 이것이 추상화의 장점이고 의존성 역전이다.
추상화로 할 수 있는 일부분에 대해서만 알아보았다.
추상화는 엄청나게 새로운 개념이 아니다. 오래전부터 우리는 새로운 걸 찾거나 만들면 이름을 붙인다.
이런저런 특징을 가지는 것을 “슈슈슈슈퍼베르”라고 하자.
그럼 다음부터 “슈슈슈슈퍼베르”를 보면 당연히 이렇겠지 기대하게되고 이걸 사용해 어떤 문제를 해결하게 될 것이다. 즉, 쉽게 협력할 수 있으며 문제를 유연하게 해결할 수 있다.
갑자기 유발하라리 사피엔스의 가상의 실제가 떠오른다.
돈, 제국, 종교처럼 가상의 실제는 서로 효율적인 협력이 가능하게 만들어준다.
추상화, 객체지향 또한, 객체가 책임을 가지고 역할에 맞게 동작하여 다른 객체와 유연한 협력이 가능하게 해준다. 비슷한 맥락이 아닐까 싶다.