13. 소프트웨어 위기의 주요한 위기는 컴퓨터 성능이 몇 수십 배나 더 강력해
졌기 때문입니다! 심하게 말하면, 컴퓨터가 없었을 때는 프로그래밍에는
전혀 문제가 없었습니다. 느린 컴퓨터 몇 개 뿐이었을 때는 프로그래밍이
조금 문제가 되었고, 이제는 거대한 컴퓨터에 프로그래밍도 따라서 거대
한 문제가 되었습니다.
- 에츠허르 데이크스트라
14.
15.
16. ● Projects running over-budget.
● Projects running over-time.
● Software was very inefficient.
●
Software was of low quality.
● Software often did not meet requirements.
●
Projects were unmanageable and code difficult to
maintain.
● Software was never delivered.
Software Crisis
26. 명령형 프로그래밍
전산학에서 명령형 프로그래밍(Imperative programming)은 선언형 프로그래밍과 반대되는
개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는
프로그래밍 패러다임의 일종이다. 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명
령으로 표현하듯이, 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이
다.
27. 절차적 프로그래밍
절차적 프로그래밍(procedural programming)은 절차지향 프로그래밍 혹은 절차지향적 프
로그래밍이라고도 불리는 프로그래밍 패러다임의 일종으로서, 때때로 명령형 프로그래밍과
동의어로 쓰이기도 하지만, 프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러
다임을 의미하기도 한다. 프로시저는 루틴, 하위프로그램, 서브루틴, 메서드, 함수(수학적
함수와는 다르고 함수형 프로그래밍에 있는 함수와는 비슷한 의미이다.)라고도 하는데, 간
단히 말하여 수행되어야 할 연속적인 계산 과정을 포함하고 있다. 프로그램의 아무 위치에
서나 프로시저를 호출될 수 있는데, 다른 프로시저에서도 호출 가능하고 심지어는 자기 자
신에서도 호출 가능하다.
절차적 프로그래밍은 복잡도가 지나치지 않고 유지보수하기 쉽기 때문에 단순한 순차적 프
로그래밍이나 비구조적 프로그래밍보다 여러 상황에서 장점이 많다. 다음과 같은 것들이
있다:
복사해서 붙이지 않고도 같은 코드를 다른 장소에서 다시 사용할 수 있게 해 준다.
GOTO문이나 JUMP문을 쓰는 것보다 프로그램의 흐름을 더 쉽게 따라갈 수 있게 해준다.
(GOTO문이나 JUMP문을 많이 쓰면 크고 복잡한 프로그램이 일명 스파게티 코드가 될 수도
있다.)
모듈화를 하거나 구조화를 할 수 있다.
29. 10 if A = 0 then print "1" : goto 500 : print
"2"
20 print "line 20"
500 print `"end"
ld a,38h ; function set command
ld b,4
again: ld c,cwadr
ld d,command
out (c),d ; select the instruction
register
ld d,write
out (c),d ; reset RW pin for writing
to LCD
out (paadr),a ; place the command into
portA
ld d,enable
out (c),d ; enable the LCD
ld d,disable
out (c),d ; disable the LCD
call delay ; wait for a while
djnz again ; loop till the command is
sent 4 times
Z80 Assembler
Basic
30. integer n
n = 1
10 if (n .le. 100)
then
n = 2*n
write (*,*) n
goto 10
endif
Fortran
Common Lisp
PROCEDURE DIVISION.
START.
OPEN INPUT INP-DATA AND OUTPUT RESULT-
FILE.
READ-DATA.
READ INP-DATA AT END GO TO PRINT-LINE.
ADD PRICE TO TOT.
ADD 1 TO COUNT.
MOVE PRICE TO PRICE-OUT.
MOVE ITEM TO ITEM-OUT.
WRITE RESULT-LINE FROM ITEM-LINE.
GO TO READ-DATA.
PRINT-LINE.
MOVE TOT TO SUM-OUT.
MOVE COUNT TO COUNT-OUT.
WRITE RESULT-LINE FROM SUM-LINE.
CLOSE INP-DATA AND RESULT-FILE.
STOP RUN.
Cobol
(defmacro for (init continue next &body body)
(unless (consp init)
(error "Syntax error - init form must be a list")) ; Thrown at compile-time
(let ((looplabel (gensym)) ; We use a gensym to avoid using a name that is in the body
(exitlabel (gensym))
(var (first init))
(initval (second init)))
(unless (symbolp var)
(error "Syntax error - variable must be a symbol")) ; Thrown at compile-time
`(prog ((,var ,initval)) ; Here begins the code template; prog is like (let () (tagbody ...))
,looplabel ; In a tagbody/prog, you can jump to symbols used as labels
(unless ,continue ; If the condition is not true...
(go ,exitlabel)) ; ...then exit the loop
,@body ; Splice in the body of the loop
,next ; Update the counter
(go ,looplabel) ; Loop
,exitlabel))))
31. 구조적 프로그래밍
구조적 프로그래밍(structured programming)은 구조화 프로그래밍으로도 불리며
프로그래밍 패러다임의 일종인 절차적 프로그래밍의 하위 개념으로 볼 수 있다. GOTO문을 없애
거나 GOTO문에 대한 의존성을 줄여주는 것으로 가장 유명하다.
역사적으로 구조적 프로그램을 작성하기 위하여 몇가지 다른 구조화 기법과 방법론이 개발되어
왔다. 가장 일반적인 3가지는 다음과 같다.
잭슨의 구조적 프로그래밍 : 자료구조를 프로그램 구조에 맞추는 것에 중점을 두었다.
데이크스트라의 구조적 프로그래밍 : 프로그램의 논리 구조는 제한된 몇 가지 방법만을 이용하여
비슷한 서브 프로그램들로 구성된다. 프로그램에 있는 각각의 구조와 그 사이의 관계를 이해하면
프로그램 전체를 이해해야 하는 수고를 덜 수 있어, SoC에 유리하다.
데이크스트라의 관점에서 파생된 관점 : 하위 프로그램의 시작점은 한 군데이지만 끝점은 여러 개
일 수 있다.
대부분의 사람들이 구조적 프로그래밍이라고 할 때 첫 번째 것을 제외한 둘 중에 하나를 말하는
것이며, 이것이 여기서 말하고자 하는 것이다.
32. 객체 지향 프로그래밍
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의
하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나
여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를
주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모
소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보
수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친
프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.
33.
34.
35. Fundamental features
● Dynamic dispatch
● Encapsulation
● Subtype polymorphism
● Object inheritance (or delegation)
● Open recursion
Additional concepts
● Classes of objects
● Instances of classes
● Methods which act on the attached objects.
● Message passing
● Abstraction
36. Values
● Communication
● Simplicity
● Flexibility
Principles
● Local Consequences
● Minimize Repetition
● Logic and Data Together
● Symmetry
● Declarative Expression
● Rate of Change