먼저 추상화란 실세계의 복잡한 상황을 간결하고 명확하게 핵심 위주로 단순화시키는 작업이다. 불필요하고 너무 구체적인 세부사항이나 흔한 공통사항 등을 제거한다. 단순화, 간추리기, 일반화, 개념화 등으로 대체해볼 수 있다. 좋은 추상화는 복잡성을 줄이고 개발자가 더 쉽고 적은 버그로 코드를 변경할 수 있도록 해준다.
예를 들어, '다른 사람에게 인사하기' 라는 메서드가 있다고 하면, 이 추상화를 구현하는 방법은 여러 가지가 있을 수 있다. 문자로 '안녕하세요' 라고 보낸다거나, '좋은 아침입니다' 라고 전화를 한다거나, 손편지를 쓰는 등의 방식이다. 내부 방식이 어떻든 이 방식들의 핵심만 뽑아본다면 '다른 사람에게 인사하기' 인 것이다.
세부적인 내용들이 나열되어 있는 코드를 일일이 한 줄 한 줄씩 다 읽는 것은 생산성이 떨어진다. 추상화를 하기 위해서는 구체적인 방법 (how) 를 숨기고, 먼저 무엇을 하는 것인지 (what) 를 보여줄 수 있는 코드를 작성하는 연습을 해야한다.
그럼 추상화 레벨은 무엇일까? 한 줄로 정의해보자면 추상화 레벨은 시스템을 보거나 프로그래밍 하는 데 사용되는 복잡성의 정도이다. 레벨이 높을 수록 디테일이 떨어진다. 레벨이 낮을 수록 더 자세한 정보를 제공한다. 가장 높은 추상화 레벨은 전체 시스템이고, 그 다음 수준의 추상화는 각각의 구성 요소가 될 것이다. 그리고 가장 낮은 수준의 추상화는 수백만 개의 개체일 것이다. 클린코드 라는 책에서는 다음과 같이 나와 있다.
지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다. 어쨌거나 우리가 함수를 만드는 이유는 큰 개념을(다시 말해, 함수 이름을) 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서가 아니던가. - CleanCode
영어 원문으로는 "one level of abstraction per function" 이라고 표현한다. 여기서 function (함수) 은 abstraction of computation 이다. 사용자가 진짜로 하고 싶은 요구사항의 추상화가 function 이고, 이 function 을 실제로 구현해서 컴퓨터에게 시킬 수 있도록 만든 것이 computation 이다.
어떤 함수들은 추상화를 한 번만 해도 되는 computation 이 있는가 하면, 여러 번에 걸쳐서 추상화 작업을 해야하는 computation 도 존재한다. 이렇게 추상화 작업을 해야 하는 횟수를 추상화 레벨 (level of abstraction) 이라고 부른다. 만약 level 이 여러개이면 추상화 작업을 한 번에서 끝내는 것이 아니라 여러 번 해야 하고, 더 많은 인적 비용이 들 것이다. 그렇기 때문에 CleanCode 에서도 "지정된 함수 이름 아래에서는 추상화 수준이 딱 하나" 이어야 한다고 주장하는 것이다.
메서드문의 모든 구문은 동일한 추상화 레벨에 속해야 한다. 더 낮은 추상화 레벨에 속하는 구문이 있으면 이 구문이 포함된 다른 메서드로 다시 이동시켜야 한다.
출처 :
'TIL' 카테고리의 다른 글
ArraysList.asList() vs List.of() (22.09.11 TIL) (0) | 2022.09.11 |
---|---|
약간의 뽀모도로를 곁들인 (22.09.10 TIL) (0) | 2022.09.10 |
JUnit5 살펴보기 (22.09.08 TIL) (0) | 2022.09.08 |
Gradle 이란? (22.09.07 TIL) (0) | 2022.09.07 |
replace() 와 replaceAll() 의 차이 (22.09.06 TIL) (0) | 2022.09.06 |
댓글