Eighteeen / CleanCode_Book_Study

📚 클린코드 북 스터디 📚
4 stars 0 forks source link

[함수] - '추상화 수준' 이라는 개념을 좀 더 명확하게 설명하자면 어떻게 설명해야 할까? #5

Closed deepredk closed 3 years ago

deepredk commented 3 years ago

getHtml()은 추상화 수준이 아주 높다. String pagePathName = PathParser.render(pagepath);는 추상화 수준이 중간이다. .append(‘\n’)과 같은 코드는 추상화 수준이 아주 낮다.

책의 위 글로 '추상화 수준'에 대한 감은 어느정도 잡히긴 했는데 그래도 아직 뜬구름 잡는 느낌이야. 누가 "추상화 수준이 뭐야?" 물으면 한참 고민하다 "잘 모르겠어"라고 할 것 같아

그래서 '추상화 수준'이라는 개념을 좀 더 명확하게 하고 싶어졌어.

일단 '추상화'라는 개념부터 잡아야 할 것 같아서 검색했어.

인터넷에서는 추상화의 뜻이 "어떤 종류의 대상들에 대해 그것이 가져야 할 핵심적인 특징들을 가지는 모델을 만드는 것" 이래. 어려운 정의같은데, Person 클래스로 생각하니까 어느정도 이해가 되더라.

"사람이 가져야 할 핵심적인 특징들을 가지는 모델" 여기서 그냥 특징이 아니라 '핵심적인' 특징이라 한 부분이 중요한거같아

뭐 키, 몸무게, 목 길이, 발가락 길이, 코털의 개수 등등 정보를 뽑으려면 무한하게 많지만 그 중 핵심적인 특징인 이름, 나이, 직업 같은거만 뽑아서 멤버변수로 만드는거지. Person이 근로자를 나타내는 어플리케이션이라면 직급, 연봉 등등을 핵심적인 특징으로 간주하고 멤버변수로 넣을 수도 있겠네.

이렇게만 봤을땐, 추상화를 요약하자면 "무한한 특징 중 필요한 몇개만 선별하는 것" 인 것 같아

위처럼 구체적인 대상(사람)에 대해 특징을 멤버변수로 뽑아내는 추상화는 이해가 되는데 책에서는 길고 복잡한 로직을 여러 짧은 메서드로 뽑아내는 추상화를 주로 말하더라.

그래서 뭔가 더 헷갈렸어.

추상화 수준이 아주 낮은 애들은 뭔가 정말 최소 단위. 그냥 덧셈. 그냥 출력. 그냥 추가 식으로 프로그램의 최소 단위 같은 느낌이였고

추상화 수준이 아주 높은 애들은 뭔가 intiailize초기화한다 이런식으로 한 단어로 설명되는데 막상 그 안을 들여다보면 세부적으로 하는 것들이 굉장히 많은 느낌이였어 많은 것들을 하는데 그거를 포괄적으로 묶어서 실행하는 느낌.

아 그래. 책에서 말하는건 '객체의 추상화'가 아니라 '동작의 추상화' 인 것 같아

"설거지"로 요약되긴 하는데 막상 그 동작을 파헤쳐보면 물을 틀고, 그릇을 집고, 그릇에 세제를 묻히고, 흐르는 물에 씻기면서 닦고, 헹구고, 식기건조대에 놓는 아주 복잡하고 많은 일을 하고 있고

'물을 튼다'도 구체적으로 들여다보자면 수도꼭지가 어디있는지 눈으로 보고, 손을 그쪽을 향해 뻗고, 틀기 위한 힘을 적절한 방향으로 주는 동작이 있고 수도꼭지가 어디있는지 눈으로 보는것도 구체적으로 보자면, 안구 근육으로 눈을 이리저리 움직여서 수도꼭지라고 기억하는 것에 초점을 맞추고 손과 팔의 근육을 이용해서....

뭐 이런식으로 구체적으로 파고들자면 엄~청 구체적으로 설명할 수 있는건데 우린 '물을 튼다' '설거지한다' 이렇게 뭉뚱그려서 말하잖아.

이게 책에서 주로 말하는 '추상화'인 것 같네.

그럼 '추상화 수준'은 뭐지? 추상화 수준이 높을 수록 설거지같이 행동을 포괄적으로 표현하는 것 같고 추상화 수준이 낮을 수록 정말 최소 단위의 행동을 말하는거 같아. 뭐 예를 들어 상완요골근 1번 근섬유에 뇌 신호를 보낸다 식으로

이걸 프로그래밍 관점에서 보자면 추상화 수준이 아주 높은건 '문제의 답을 구한다.' 정도일거같고 추상화 수준이 적당히 높은건 '정렬한다.' 'dfs를 한다.' 'bfs를 한다.' 정도가 있을거같고 추상화 수준이 아주 낮은건 더하기, 빼기, 곱하기, 출력하기 같은 프로그램의 정말 기본 실행단위같은 것들이 있을 것 같아

즉, 추상화 수준이 높은건 '동작을 뭉뚱그린 것' 추상화 수준이 낮은건 '최소 프로그램 실행단위에 가까운 것'

추상화 수준이 얼마나 높냐는 '얼마나 뭉뚱그렸느냐' 추상화 수준이 얼마나 낮냐는' 얼마나 덜 뭉뚱그렸냐' => 제일 덜 뭉뚱그린건 최소 프로그램 실행단위

추상화 수준이 서로 같은지는 = 뭉뚱그린 것의 정도가 같은지

이정도로 요약될 것 같네 좀 더 감이 잡히는 느낌이야.

근데 뭉뚱그린 것의 정도가 같은지를 어떤 기준으로 생각해야 되는가를 생각하면 또 잘 모르겠네

'설거지한다'와 '물을 튼다'가 추상화 수준이 같냐 안 같냐를 따지자면? 일단 위의 예시에서는 물을 튼다가 추상화 수준이 낮았지. 왜냐면 설거지한다에 포함되는 동작이니까

그럼 뭐

추상화 수준이 높냐 낮냐를 따지는 기준으로 생각이 드는건 '다른 동작에 포함되는 동작인가', '더 구체적인(최소단위의) 동작이냐' 정도인 것 같네

============

쓰다보니까 의식의 흐름으로 쓰게 됐는데 내 생각을 요약하자면

추상화: 객체의 추상화, 동작의 추상화가 있고 둘은 조금 다름 객체의 추상화: 필요한 특징만 따는 것 동작의 추상화: 동작을 뭉뚱그리는 것

(동작의 추상화에서) 추상화 수준: 뭉뚱그림의 정도 가장 낮은 추상화 수준은 프로그램의 최소 실행 단위

인 것 같아.

너네 생각은 어때? '추상화 수준'이라는 개념을 명확하게 설명하려면 뭐라고 해야할까?

sookyeonghwang commented 3 years ago

"추상화" 이해하려고 검색해보았을 때

사소한 요소를 제거하고 핵심만 뽑아내는 것이다. 목적을 명확히 하여 복잡한 것을 숨기고 핵심만 드러낸다.

이라는 말들이 가장 도움이 되었습니다.

위의 @deepredk 의 예시처럼 추상화 수준은 높음, 중간, 낮음으로 분류할 수 있습니다.

(p. 46) 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 단계 낮은 함수가 온다.

이 말은 '각 함수는 다른 함수를 소개하고, 디테일한 부분은 다른 함수로 넘긴다.' 라는 말로 생각해보았습니다.

결국, 추상화 수준은 어디까지 디테일한 부분을 숨겼느냐로 설명할 수 있습니다.

요약하자면

추상화 수준이 높다 : 디테일을 많이 숨겼다. 추상화 수준이 낮다 : 디테일을 많이 드러냈다.

로 간단하게 말할 수 있을 것 같습니다.

그리고 추상화 수준을 도식화해서 잘 설명한 사람이 있어서 링크 첨부할게요! 이거보고 도움이 많이 됐어요!

함수의 추상화 수준이란?

WinningBean commented 3 years ago

일단 @sukyeongh 이 링크한 블로그 게시물이 생각 정리에 많은 도움이 되었습니다. 👍👍 저희와 비슷한 생각을 한 사람이 또 있었네요.

하지만 해당 게시글 마지막 부분에서

그러니까.....저자인 로버트 C 마틴은 추상화 수준이 높지도 낮지도 않은 중간은 지양한다고 말하는것 같다.

라는 문장은 책에서 근거를 찾을 수 없었습니다.

책에서

getHtml()은 추상화 수준이 아주 높다. ... .append(‘\n’)과 같은 코드는 추상화 수준이 아주 낮다.

라는 부분에서 '아주' 높다, '아주' 낮다는 말을 사용한 것을 보면, 추상화 수준은 세밀하게 나뉠 수 있다는 것을 알 수 있죠.

또한 내려가기 규칙을 설명하는 곳에서도 책에서는

한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다. 즉, 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다.

라고 말하는 것을 보아, 추상화 수준은 충분하게 여러가지 단계로 나뉠 수 있다고 말하는 것으로 판단됩니다.

블로거의 생각을 정확히 이해한 건지 약간 헷갈리지만, 게시글 내용만 봐서는 '추상화 수준은 높음, 중간, 낮음 세가지로만 나뉘고 중간은 지양한다.' 라고 생각한다고 받아들여 지는데, 추상화 수준을 크게 높음, 중간, 낮음 으로 나뉜다고는 할 수 있지만 오직 세가지로만 나뉠 수는 없고, 여러 단계가 나오기 때문에 중간을 지양할 수도 없고, 지양할 근거도 없다고 생각합니다.

블로그 게시물이 링크되어 해당 게시물에 대한 생각도 정리해봅니다!

WinningBean commented 3 years ago

일단 객체의 추상화와 동작의 추상화는 다르지 않다고 생각합니다. 객체와 동작 모두 필요한 특징을 뽑아서 객체, 함수로 만들고 특징을 뽑는다는 행동 자체(추상화)가 무언가를 뭉뚱그려서 기준을 세워 특징을 뽑는다고 생각하여 둘은 결국 같은 말을 하는 것이라고 생각합니다.

이어서 말해보자면 추상화 수준이 가장 낮은 것은 더 이상 나뉠 수 없으며 나뉘어도 더 이상 나뉘는 의미가 없는 기준값이라고 생각하며, 추상화 수준이 가장 높은 것은 더 이상 뭉뚱그릴 수 없는 (포장할 수 없다? 라고 생각하면 될 것 같습니다.) 기준값이라고 생각됩니다.

쉽게 접할 수 있는 정보로 예제를 들어보겠습니다.

객체의 추상화 수준

  1. Animal 은 추상화 수준이 아주 높음
  2. Dog, Cat 은 추상화 수준이 높음
  3. Poodle, Persian 은 추상화 수준이 중간
  4. ToyPoodle, ExoticShorthair 는 추상화 수준이 낮음
  5. HomeToyPoodle, NatureToyPoodle 은 추상화 수준이 아주 낮음

다른 기준으로 객체들이 나뉠 수 있지만, 여기서 예제로 볼 프로그램에서는 객체들이 이렇게 정리되어 있다고 가정합시다.

함수의 추상화 수준

  1. 먹는다(), 뱉는다() 는 추상화 수준이 높음
  2. 씹는다() 는 추상화 수준이 중간
  3. 입을 벌린다(), 입을 닫는다() 는 추상화 수준이 낮음

이제 제가 어떤 말을 하는지 감이 잡혔을 거라고 생각합니다.

객체의 추상화 수준 예에서는 Animal을 더 이상 포장할 수 있는 기준이 없습니다. (물론 생물, 지구생물 등등.. 더 뭉뚱그려 포장할 수는 있지만 Animal 이상의 포장은 현재 프로그램에서 필요없다고 가정합시다.) HomeToyPoodle과 NatureToyPoodle에서는 더 나뉠 수가 있을까요? 저는 여기서는 더 이상 생각나지 않네요. 만약 더 나뉠 것이 생긴다면 추상화 수준의 단계가 늘어난다고 생각하면 될 것 같습니다.

함수의 추상화 수준 예도 똑같습니다. 먹는다(), 뱉는다() 를 더 이상 포장할 수 있는 기준이 없습니다. 입을 벌린다(), 입을 닫는다() 를 더 이상 나눌 수 있는 기준도 없습니다.

이제 제 생각을 정리해보도록 하겠습니다. 추상화 수준은 추상화하는 기준의 정도입니다. 여기서 말하는 기준이란 추상화를 정리하는 작업 자체를 말합니다. 그리고 기준의 정도로 추상화 수준을 결정합니다. 그 기준의 정도가 가장 높은 것은 더 이상 포장할 수 없을 때, 가장 낮을 때는 더 이상 나눌 수 없을 때입니다. 이 기준으로 그 사이에 추상화 수준 단계들이 나뉘게 됩니다.

WinningBean commented 3 years ago

결론

1. 객체의 추상화와 동작의 추상화 객체의 추상화와 동작의 추상화는 결국 같은 행위이지만, 그 방법은 다르다. 객체의 추상화 : 어떤 대상들의 특징들을 뽑아내는 것 동작의 추상화 : 어떤 동작들을 포괄하는 것

2. 추상화 수준이란? 추상화 수준은 추상화하는 기준의 정도이다. 그 기준의 정도가 가장 높은 것은 더 이상 포장할 수 없을 때, 가장 낮을 때는 더 이상 나눌 수 없을 때이다. 이 기준으로 그 사이에 추상화 수준 단계들이 나뉘게 된다. A가 B를 포장할 수 있다면 A의 추상화 수준이 B보다 높고, D가 C에서 나뉘어졌다면 D의 추상화 수준이 C보다 낮다.