추상화가 중요하다는 것을 주입식으로 머리에 넣어왔는데, 최근에 좀 더 명확히 이해하게 된 것 같습니다. 추상화가 중요하다는 것 이전에, 추상화
개념을 다시 한번 정립해 보기 위해 카페에서 고양이를 만났다는 상황을 생각해 보았어요.
일행 중 한 사람이, “저 고양이 너무 귀엽다!!”라고 말합니다. 이때 단순히 무늬로 구분하여 보고 있는 고양이를 표현했을 뿐이지, “치즈무늬에 흰 장갑을 끼고, 뱃살이 조금 통통하고, 3살쯤으로 추정되며, 코리안 숏헤어인 저 고양이 너무 귀엽다!!”라고 모든 정보를 풀어서 말하지 않아요.
이처럼 우리가 보고 표현하는 정보는, 그들이 갖고 있는 모든 정보에 비해서 아주 단편적인 정보일 뿐이에요. 하지만 그럼에도 우리는 서로 같은 것을 생각하고 대화하는 데 아무 문제가 없죠. 우리는 알게 모르게 ‘맥락’에 맞춰 축약된 정보만을 사용하여 생각을 공유했던 거예요. 그것이 추상화였던 것이죠.
컴퓨터와의 대화긴 하지만, 프로그래밍 언어로 개발하는 것도 결국 사람의 생각을 담아 만들고 사용하는 도구란 것을 다시금 깨달았습니다. 때문에 우리는 실세계에서의 사고방식 즉, 추상화를 통해 코드를 작성해야 하는 것이었어요.
동물의 울음소리를 실행시키는 기능을 개발해야 하는 상황이 있습니다. Animal
이라는 추상 클래스는 makeSound()
라는 메서드를 갖고 있어요. 그리고 Animal을 상속받은 Dog
과 Cat
클래스가 있습니다. bark()
나 meow()
메소드를 makeSound() 안에 오버라이드 하고 있죠. 우리는 현재 ‘동물의 울음소리를 실행시키자’라는 맥락을 가지고 있습니다.
그런데, 우리는 어떤 동물인지를 반드시 선택해야 해요. Animal로는 어떤 울음소리를 내는지 알 수 없죠. ‘동물 중 어떤 동물의 울음소리를 내게 해야 하지?’, ‘만약 고양이라면 어떤 소리를 내게 해야 하지?’라고 구현의 흐름을 좆아가야만 합니다. 복잡하죠.
하지만 만약 어떤 동물 중 하나를 반환하는 getAnimal()
를 구현하여 인스턴스를 만들었다면 단순히 인스턴스.makeSound()로 동물의 울음소리를 실행시킬 수 있겠죠. 어떤 특정한 동물과 그 동물의 울음소리를 찾을 필요 없이.
이처럼 추상화를 잘 이루었다면, 우리는 객체의 세부 사항과 구현에 구애받지 않고 원하는 기능을 맥락
에 맞춰 유연하게 사용할 수 있어요. 실세계에서 고양이의 모든 정확한 정보를 알지 않아도 특정 고양이를 지칭할 수 있듯이 말이죠. 추상화를 잘해야 하는 이유를 이제 나름대로 머릿속에 정립한 것 같아요.
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 3월 18일 오후 3:06