내가 앞으로 적으려고 하는 내용의 가장 중요한 목적지는 "함수는 한 가지 일만 해야 한다"는 것이다.
한가지 일이라는게 무엇인지(어떤 것 까지 한 가지 일이라고 하는지)를 파악하며 글을 읽어 보자.
로버트 C. 마틴의 클린 코드에서 가장 강조하는 말 중 하나는 다음과 같다.
함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만을 해야 한다.
이 원칙은 단순해 보이지만 실제로 적용하려면 중요한 개념이 하나 있다. 바로 추상화 수준을 나누는 것이다.
추상화 수준의 예시 – "밥 먹고 올게"
일상적인 문장도 추상화 수준을 달리해서 쪼개볼 수 있다.
예를 들어 "밥 먹고 올게"라는 행동을 살펴보자.
- 메뉴 정하기
- 밥 먹으러 가기
- 밥 먹기
- 다시 돌아오기
우리가 흔히 말하는 "밥 먹고 온다"는 사실 많은 행동을 추상화한 결과인 것을 알 수있다. 이렇게 구체적인 행위로 적어보면 생각 보다 더 많은 행위들이 숨어 있는 것을 알 수 있다.
큰 함수와 작은 함수의 역할
이 과정을 함수에 비유해보자.
def 밥먹고오기():
메뉴정하기()
가다()
밥먹다()
돌아오다()
밥먹고오기라는 함수는 순서대로 함수들을 호출한다는 의미에서 큰 추상화로 하나의 함수를 만들 수 있다.
이 함수의 역할은 메뉴정하기() 와 가다() 사이에 전화주문하다() 같이 큰 틀에서 변경이 일어나면 책임지고 변경이 일어나는 부분이다.
즉, 밥먹고오기()는 여러 하위 함수를 순서를 정하고 호출해서 밥을 먹고 돌아온다라는 하나의 큰 목적을 달성한다. 이 함수가 하는 일은 하나의 시나리오를 완성하는 것이다.
이렇게 함수는 자신의 추상화 수준에서 단일 책임을 가져야 한다.
여기서 수저통열기()가 여기에 들어간다면 너무 구체적인 행위라, 밥먹고오기()의 추상화 수준과 맞지 않는다. 이렇게 되면 가독성과 유지 보수성이 떨어지게 된다.
또한 호출 스택이 깊어질수록 추상화 수준이 점점 낮아져야한다. (즉 점점 구체적인 행위를 담는 함수가 호출 되어야한다.)
추상화의 단계 쪼개기
밥을 먹는 과정만 놓고 봐도 여러 단계로 나눌 수 있다.
- 밥 먹기 전: 수저 꺼내기, 메뉴 주문하기
- 밥 먹는 중: 숟가락으로 밥을 떠서 먹기, 씹기
- 밥 먹은 후: 계산하기, 물 마시기
이처럼 높은 추상화에서 낮은 추상화로 내려오면서, 각 단계(함수)는 자신이 맡은 한 가지 일만 수행해야 한다.
마무리
정리하면, 좋은 함수는 한 가지 일만 한다는 원칙은 단순한 규칙이 아니다.
- 추상화 수준을 지키고,
- 함수마다 책임을 분리하며,
- 읽는 사람이 “이 함수는 무슨 일을 하는지” 즉시 이해할 수 있도록 만들어야 한다.
더 구체적인 규칙들은 2탄에서 이어서 작성하도록 하겠다.
'개발 > 책' 카테고리의 다른 글
| 함수만 잘 짜도 중간은 간다 - 2 [Clean Code] (0) | 2025.09.28 |
|---|---|
| 소프트웨어 설계가 꼬이는 이유? ADP, SDP, SAP로 풀어보기[Clean architecture] (1) | 2025.09.08 |
| 프로그래밍 패러다임 : 빼앗긴 덕분에 얻은 것들 [Clean architecture] (1) | 2025.09.02 |