2부 - 패러다임의 개요
구조적 프로그래밍
기능적 분해 . 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있다.
객체지향 프로그래밍
-
캡슐화
데이터와 함수가 응집력 있게 구성된 집단을 서로 구분 짓는 선을 그을 수 있다.
구분선 밖에선 데이터는 은닉되고, 일부 함수만이 외부에 노출된다.
→그러나, OO 언어는 오히려 C가 표현했던 완전한 캡슐화를 약화시켰다. ( 사용자가 멤버변수의 존재를 알게 된다. )
-
상속
어떤 변수와 함수를 하나의 유효범위로 묶어서 재정의 하는 일이다.
→ OO 언어가 고안 되기 전부터 상속과 유사한 기법이 사용되었다.
OO언어가 완전히 새로운 개념을 만들지는 못했지만 데이터 구조에 가면씌우는 일에 편리한 방식을 제공했다.
- 다형성
1.함수를 가리키는 포인터 응용한 것이 다형성이다.
→ OO로 다형성을 새로 구현한게 쉽게만들어 준 것이다.
→ 쉽게 만든 부분 : 원래 C에서 관례 ( 포인터 초기화 해야한다. ) 을 완화시켜주었다.
2. 장치적 의존성을 없애주었다. 프로그램이 각각의 장치들에서 장치들에 대해서도 동일하게 해야한다는 의존성을 제거 해 주었다.
ex) 드라이버가 새로 복사 프로그램을 Plugin 하는 것과 같다. (이미 있는 복사프로그램 안만든다.)
Plugin Architecture : 의존성을 없앤다.
-
OO가 있기 전 : 의존성은 제어흐름에 따라 결정된다. 제어흐름은 시스템의 흐름에 의해 그리고 소스코드 의존성은 제어흐름으로 결정된다.
-
OO가 있은 후 : 소스의 의존성을 인터페이스 추가를 통해 "의존성 역전"과정을 거친다. \
→ OO 언어는 소스코드 의존성 전부에 대해 방향 결정이 가능하다.
소사 코드의 의존성을 원하는 방향으로 바꾼다.
3. 배포 독립성을 실행 할 수 있다.
→ 개발 독립성을 보장해준다.
다형성을 이용해 시스템의 모든 소스코드 의존성에 대한 절대적인 제어 권한을 획득하는 능력
함수형 프로그래밍
** 다음 아키텍쳐 문제들 → 가변 변수 때문에 하게 된다.
- 경합 : 데이터 갱신 시 발 생
- 교착상태 : 데드락
- 동시 업데이트 : 데이터 갱신시
이러한 문제들은 불변성을 보장해야 한다.
이는 가능한 것이나 자원이 무한한 경우, 즉, 저장공간이 한없이 크고 속도가 빠른 경우에만 가능하다. (단순한 불변을 무한 반복하는 방식으로 가능하다. )
-
불변 컴포넌트와 가변 컴포넌트를 나눈다.
→ 상태변경 : 컴포넌트 동시성 문제를 발생시킨다.
→ 트랜잭션 메모리 같은 실천법을 사용해서 동시업뎃 경합 조건으로 부터 가변 변수를 보호한다.
-
변수를 변경하려는 컴포넌트를 분리해야한다.
-
가능한 많은 불변 컴포넌트와 가능한 적은 가변 컴포넌트로 구성 해야한다.
-
이벤트 소싱 방식으로도 구현이 가능하다.
→ 상태가 아닌 트랜 젝션을 저장한다. 상태가 필요한 경우에 시작점부터 모든 트랜젝션을 처리하는 방식이다.