현재 읽고있는 도서는 Clean Architecture이며, 총 6부작으로 구성되어있다.
1부는 생략하고 2부부터 읽고 느낀점을 쓰고자 한다.
패러다임이란 프로그래밍을 하는 방법으로, 대체로 언어에는 독립적이다.
패러다임은 어떤 프로그래밍 구조를 사용할지, 그리고 언제 이 구조를 사용해야 하는지를 결정한다.
현재까지 이러한 패러다임에는 3가지 종류가 있다.
그리고 이런 패러다임은 무엇을 해야할지를 말하기 보다는 무엇을 해서는 안되는지를 말해준다.
책에서는 goto문을 사용하지 말고 if/then/else와 do/whwile/until로 프로그래밍 제어를 하라고 애기한다.
goto문을 사용하면 원하는 위치로 프로그램 제어를 이동시킬 수 있다. 코드 여기저기를 이동하기 떄문에 분리해야 될 지점을 잡기도, 코드의 제어 순서를 파악하는데도 어려움이 많아 작은 모듈로 나누기가 쉽지않다.
그래서 goto문을 사용하지 않고 순차, 분기, 반복만을 이용한다. 그러면 작은 단위의 모듈로 나눌 수 있다.
구조적 프로그래밍을 지키면 우리는 이제 코드를 마음껏 분리할수 있는데, 바로 이 분리는 다음과 같은 특징을 지닌다.
구조적 프로그래밍이 오늘날까지 가치 있는 이유는 마지막 특징인 "테스트 가능한 세부적인 단위로 분리를 통한 반증가능성" 때문이다.
보통 객체 지향이란 표현은 캡슐화, 상속, 다형성을 말하곤한다.
책에서는 이 3가지를 이렇게 표현한다.
캡슐화 : 데이터와 함수를 쉽고 효과적으로 캡슐화하는 방법을 객체지향 언어에서 제공한다. 그렇지만 이러한 개념이 객체지향 언어에만 한정된 것은 아니다.
(C언어에서도 완벽한 캡슐화가 가능하다.)
상속 : 상속이 객체지향 언어에서 새롭게 등장한 방식은 아니지만, 나름 편리하게 사용할 수 있도록 제공해준다.
다형성 : 다형성도 새롭게 등장한 방식은 아니지만, 좀 더 안전하고 더욱 편리하게 사용할 수 있게 해준다.
일반적으로 제어 흐름은 시스템의 제어 행위에 따라 결정되며, 소스 코드의 의존성은 제어 흐름에 따라 결정된다. 그래서 제어 흐름의 방향은 항상 고수준 로직 -> 저수준 로직으로 향하게된다.
하지만 다형성을 두게되면 조금 다른일이 벌어진다. 다형성이란 고수준 로직에서 저수준 로직으로 흘러가는 흐름 사이에 추상 로직을 두는 것을 말한다. 이렇게 하면 프로그램의 제어 로직이 다음과 같이 바뀐다.
기존 : 로직 -> 저수준
다형성 적용 후 : 고수준 로직 -> 추상 로직 <- 저수준 로직
"->" 으로만 흘러가던 제어 흐름에 "<-"이 등장했다. 이를 "의존성 역전"이라고 부른다. 제어 흐름의 방향에 역전이 생긴 것이다.
이러한 접근법을 사용한다면, 객체지향 언어로 개발 된 시스템의 소스 코드 의존성 전부에 대해 방향을 결정할 수 있는 권한을 지니게 된다.
즉, 소스 코드 의존성이 제어흐름의 방향과 일치되도록 제한되지 않는다는 것이다.
책에서는 객체지향을 아래와 같이 표현한다.
"객체지향이란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력이다"
동시성 애플리케이션에서의 모든 문제는 가변 변수 때문에 발생한다. 즉, 가변 변수를 사용하지 않으면 이런 문제들이 아예 발생하지 않는다.
그렇다면 모든 변수를 가변 변수로 사용하면 되지않을까? 라는 생각이 들수도 있지만 현실적으로 메모리같은 자원이 한정되어 있기 때문에 불가능하다.
그렇기 때문에 어느 정도 타협을 봐야한다.
불변 컴포넌트와 가변 컴포넌트를 분리하고, 가능한 한 많은 처리는 가변 컴포넌트에서 불변 컴포넌트로 옮겨야 한다.
지금까지 나는 3가지 프로그래밍 방식중 어떤 방법으로 해왔을까?
구조적 프로그래밍에 제일 가깝다고 본다.
앞으로는 3가지 방식의 장점을 섞어서 코딩 습관을 들여야겠다.