추상화

OOP 기본 ’추상화’ Java 코드를 숱하게 접하면서 가장 기본적인 개념이 부족함을 많이 느낀다.

보다 세련된 코드를 작성하거나 세련된 코드를 독해하기 위해서는 객체지향에 녹아있는 철학과 소스코드에 점철된 여러 디자인 요법들에 대해 알아두면 도움이 된다.

이번에는 많은 객체지향 도서중에서 도입부에 설명을 하지만 주의깊게 살펴보지 않았던 ‘추상화’에 대해서 살펴보려고 한다.

추상화 개념에 대해 검색을 하면서 여러가지 설명을 볼 수 있었다.

‘특정 개체의 공통된 특징을 파악하고 정의하는 행위’ ‘프로그램을 구성하는 모듈의 중요한 특성이 무엇인지, 무엇을 하는지 파악’

말은 다르지만 의미는 모두 같다.

즉, 추상화란 데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의해나가는 과정이면서 동시에 각 개별 개체의 구현에 대한 상세함을 감추는것.

우리가 흔히 사용하는 반복문 (for, forEach, while 등) 역시 추상화한 결과라고 볼 수 있다.

실제로 이것들은 CPU의 이동 명령을 통해서 구현이 되겠지만(상세한 구현) 이 구현으로부터 ‘반복’이라는 개념을 뽑아내서(추상) for, while 등으로 정의한 것이다.

비슷하게 OS는 그래픽 기능을 위한 API를 제공하는데 이러한 API들은 서로 다른 그래픽 카드들의 공통된 기능을 추상화한 결과물이다. 추상화를 하게되면 상세한 구현이 아닌 공통된 개념과 관계에 집중을 할 수 있는데 추상화란 결국 개발자의 뇌를 위한 것

로그 분석 기능을 생각해보면 큰 덩어리로 ‘로그 파일을 읽어와 파일을 한줄 한줄 파싱한 뒤 계산해서 내용을 DB에 저장한다’일 것이다. 이런 상세함을 한 번에 다 머리속으로 생각할 수 있는 사람은 많지 않다. (물론, 정말 똑똑한 사람은 한 번에 다 생각할 수 있겠지만..) 그래서 필요한 게 생각이 가능한 수준의 덩어리로 나눠서 생각하는 것이다.

상세한 구현을 생각이 가능한 수준의 덩어리로 만들어나가는 과정이 추상화 과정이며, 이를 통해 개발자는 구현의 상세함 속에서 허우적거리지 않고 (머리속에서) 관리 가능한 수준으로 프로그램과 구현을 다룰 수 있게 된다.