세가지 프로그래밍 패러다임은 프로그래머에게서 권한을 박탈한다. 프로그램은 순차, 분기, 반복, 참고로 구성된다.
구조적 프로그래밍 → 함수
구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
goto 문의 무분별한 흐름 이동 X
go to문 → if/then/else 또는 do/while/until 같은 구조로 대체
모듈을 더 작은 모듈로 나누는데 goto문은 문제를 일으킴 → 유클리드 계층 구조로 분리 불가능
현대의 언어는 goto 문이 거의 사라짐 (java의 break나 예외처리가 goto랑 비슷할 수는 있지만 제약이 있다는 점이 다름. 이전은 굉장히 자유롭게 흐름이동이 가능했음)
구조적 프로그래밍을 통해 기능을 더 작은 기능으로 끊임없이 분해 가능
객체 지향 프로그래밍 → 컴포넌트 분리
객체 지향 프로그래밍은 제어 흐름의 간접적인 전환에 대해 규칙을 부과한다.
함수 호출 스택 프레임을 힙으로 옮기면 함수 호출이 반환된 이후(함수가 종료된 이후)에도 지역 변수가 오랫동안 유지될 수 있음 → 클래스의 생성자
지역 변수 → 인스턴스 변수, 중첩 함수 → 메서드
함수 포인터 특정 규칙에 따라 사용하는 과정을 통해 → 다형성이 등장
캡슐화
데이터가 은닉되고 일부 함수를 통해 이를 사용할 수 있다
C++에서 클래스를 헤더 파일에 선언할 것이 요구됨(c++ 컴파일러는 클래스의 인스턴스 크기를 알 수 있어야 함.) → 사용자가 헤더파일에서 클래스 내부의 데이터를 확인할 수 있으므로 은닉성이 깨짐
상속
원래도 c로 상속 비슷하게 흉내내며 살고 있음. 하지만 c++과 자바에서 휠씬 자유롭게 사용가능.
다향성
하나의 객체가 여러가지 타입을 가질 수 있음
의존성 역전 : 저수준 함수가 고수준 함수를 호출가능
다형성을 안전하고 편리하게 제공한다 → 소스 코드 의존성을 어디에서든 역전시킬 수 있다
소스 코드 의존성을 원하는 방향으로 설정 가능
배포 독립성 : 코드 변경이 된 컴포넌트만 다시 배포할 수 있음
개발 독립성 : 서로 다른 팀에서 각 모듈을 독립적으로 개발 가능
저수준의 세부사항 모듈 → 중요도가 낮은 플로그인 모듈, 고수준의 정책을 포함한 모듈 → 독립적으로 개발 배포