[Clean Architecture] Clean Architecture chap 2 정리

Date:     Updated:

카테고리:

태그:

3장과 4장은 프로그래밍의 패러다임에 대해서 설명합니다. 구조적 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍을 설명하며 이야기를 합니다.

구조적 프로그래밍

최초로 적용된 패러다임으로 1968년 에츠허르 비버 데이크스트라가 발견했습니다. 무분별한 점프문 (goto 문장)은 프로그램 구조에 해롭다는 사실을 제시하였습니다. 이것들을 if/then/else와 do/while/until과 같이 더익숙한 구조로 대체하였습니다. 이것들을 한마디로 요약하면 제어흐름의 직접적인 전화에 대해 규칙을 부과한다 라고 할 수 있습니다.

객체지향 프로그래밍

두번째로 도입된 패러다임은 구조적 프로그래밍보다 사실 2년 앞선 1966년 올레 요한 달, 크리스텐 니가드에 의해 등장하였습니다. 이들 두 프로그래머는 알골 언어의 함수 호출 스택 프레임을 힙으로 옮기면, 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오랫동안 유지될 수 있음을 발견하였습니다. 바로 이러한 함수가 클래스의 생성자가 되었고, 지역변수는 인스턴스 변수, 그리고 중첩 함수는 메서드가 되었습니다. 함수포인터를 특정 규칙에 따라 사용하는 과정을 통해 필연적으로 다형성이 등장하게 되었습니다. 한마디로 객체지향 프로그램은 제어흐름의 간접적인 전환에 대해 규칙을 부과한다라고 할 수 있습니다.

함수형 프로그래밍

세번째 패러다임은 비교적 최근에 들어서야 겨우 도입되기 시작했습니다. 하지만 놀랍게도 세 패러다임 중 가장 먼저 만들어졌습니다. 또한, 더 놀라운것은 컴퓨터 프로그래밍 자체보다 먼저 등장하였습니다. 알론조 처치는 앨런 튜링도 똑같이 흥미를 느꼈던 어떤 수학적 문제를 해결하는 과정에서 람다 계산법을 발명했는데, 함수형 프로그래밍은 이러한 연구 결과에 직접적인 영향을 받아 만들어졌습니다. 한마디로 요약하자면, 할당문에 대해 규칙을 부과한다라고 할 수 있습니다.

패러다임

프로그래밍 패러다임을 보게되면, 개발자에게서 권한을 박탈하도록 구성되어 있습니다. 어느 패러다임도 새로운 권한을 부여하는것이 아닙니다. 기존에 있는 프로그래밍이라는 체제에서 특정 행동을 지향하도록 강요하는 것입니다. 더 놀라운것은 이러한 패러다임은 프로그래밍이 만들어진지 10년만에 다 만들어졌다는 사실입니다.

객체지향 프로그래밍은 무엇이 다른가

현대 프로그래밍 언어들을 보면 대부분 객체지향 언어들이 주를 이룹니다. 그렇다면 객체지향을 사용하는 이유가 무엇일까요? 저를 포함해 객체지향을 깊게 공부하지 않았다면 다음과 같이 답을 할것입니다. “다형성, 캡슐화, 상속등의 객체지향적 특성을 사용하는것이 장점입니다.”

하지만 이것은 객체지향 프로그래밍만의 특성이 아닙니다. 저도 책을 읽으면서 처음 알게 되었는데, 다형성, 캡슐화, 상속 등의 특성들은 언어 자체에서 명시하고 있지는 않았지만, 객체지향 언어가 아닌 C에서도 구현할 수 있습니다.

그렇다면 객체지향만이 가지고 있는 강점은 무엇일까요? 바로 SOLID 원칙에서 명시하고 있는 의존성 역전의 원칙과 관련이 있습니다.

일반적인 구조적 프로그래밍에서는 제어의 흐름이 일방입니다. Main 함수가 고수준의 함수를 호출하고, 고수준의 함수는 다시 중간수준의 함수, 저수준의 함수 순으로 호출하게 됩니다.

제어 순서도

하지만 객체지향 언어에서는 이것을 역전 시킬 수 있습니다. 보통 인터페이스나 추상 클래스를 이용하여 구현하게 됩니다. 인터페이스나 추상클래스를 사용하게 되면 아래로 향하던 의존성의 방향이 반대가 됩니다.

의존성 역전

위 사진을 보면 인터페이스를 사용하여 ML1 모듈이 해당 인터페이스를 상속받게 만듭니다. 그러면, ML1 모듈은 인터페이스에 의존적이게 됩니다. 원래 아래로 향하던 제어의 흐름이 역전된것을 볼 수 있습니다.

즉, 객체지향 프로그램의 가장 큰 장점은 바로 소스코드의 의존성을 원하는 방향으로 설정할 수 있다.라는 것입니다. 이 특성덕에 대부분의 프레임워크에서는 개발자가 구조를 만들 필요 없이 프레임워크 제작자가 만들어둔 틀 안에서 클래스 하나를 작성하고, 특정 인터페이스를 상속받는것 만으로도 기능을 구현할 수 있게 됩니다. 이것을 개발 독립성이라고 부릅니다.

Clean Architecture 카테고리 내 다른 글 보러가기

댓글 남기기