프로그래밍을 하다 보면 '추상화'라는 말을 자주 들었다. 하지만 상황에 따라 그 의미가 조금씩 달라 헷갈릴 때가 있었다.
이 문서에서는 추상화라는 개념을 두 가지로 나누어 설명하고, 각각의 예시를 통해 어떻게 이해할 수 있는지 소개한다.
글을 끝까지 읽으면, '복잡성 은닉'과 '일반화'라는 두 시선으로 추상화를 구분하고, 대화나 코드 리뷰에서 그 맥락을 파악하는 데 도움이 되는 기준을 얻을 수 있다.
우테코에서 크루들과 함께 얘기하거나 코드 리뷰에서, 정말 자주 듣고 보게 되는 말이 있다.
"추상화 수준이 적절하네요", "여기 추상화 계층이 조금 어색한 것 같아요", "이건 추상화를 잘해서 사용하기 좋네요."
그러다 어느 순간,'추상화'가 같은 단어이지만 맥락마다 의미가 조금씩 다르게 느껴지는 순간들이 있었다.
그런 고민을 하던 중, 시지프와의 대화에서 인터페이스 개념을 접하면서 왜 다르게 느꼈는지 알게 되었다.
우리는 '추상화'라는 단어를 다양한 의미로 사용하고 있었기 때문이다.
그래서 이 글에서는, 내가 이해한 바를 바탕으로
프로그래밍에서의 '추상화'를 두 가지로 정리하고, 각각이 어떤 상황에서 사용되는지 살펴보려고 한다.
코드 리뷰와 다양한 개발 경험을 돌아보며, 나는 프로그래밍에서의 추상화를 다음 두 가지로 정리했다.
복잡한 내부 구현을 숨기고 간단한 인터페이스를 제공하는 것
예를 들어 스마트폰은 내부적으로 복잡한 회로와 동작 원리를 갖고 있지만, 사용자는 버튼만 누르면 된다.
마치 우리가 HTTP 요청을 보낼 때 내부 TCP 연결이나 핸드셰이킹 과정을 신경 쓰지 않아도 되는 것처럼.
이런 식의 추상화는 복잡성 은닉(Complexity Hiding)이라고 부를 수 있다.
공통적인 핵심적인 요소를 뽑아 일반화하는 것
바퀴가 달리고 사람이 타는 물체를 ‘탈 것’이라 부르는 것처럼,
비슷한 동작을 수행하는 여러 함수나 객체에서 중복을 제거하고 공통 부분을 묶는 것도 추상화다.
이것은 일반화(Generalization)라고 할 수 있다.
fetch(url)
만 호출하면 된다 Vehicle
이라는 추상 클래스를 만들고, drive()
라는 공통 메서드를 정의할 수 있다이 글에서는 추상화를 '복잡성 은닉'과 '일반화'라는 두 시선으로 나누어 살펴보았다. 혼란스러웠던 추상화라는 개념도, 상황에 따라 달리 쓰이는 단어였다는 점을 이해하면서 더 명확해졌다.
이 글이 코드 리뷰나 개발 대화 속에서 '추상화'라는 말이 어떤 맥락에서 쓰였는지 더 쉽게 파악될 수 있도록, 도움이 되었으면 좋겠다.