Transcript Chapter 14

입문
2004. 3. 5.
소프트웨어 구분
컴파일러, 에디터
유틸리티
2
시스템 소프트웨어
 컴퓨터 하드웨어 자원 (CPU, Memory, 기타 device …)을 관리/제
어하는 소프트웨어
 예) 운영체제
 일반 사용자들이 사용하는 응용 프로그램들을 개발하고 실행하기
위해 기본적으로 필요한 핵심적인 소프트웨어.
 예) 쉘(사용자 명령 수행기), 에디터, 컴파일러,…
3
응용 소프트웨어
 응용 소프트웨어 (Application Software)
 특정한 응용 분야에 사용되는 프로그램
 예) 워드프로세서, 웹 브라우저, 항공정보시스템, 급여 프로그램, 성적 프로그
램, 인사관리 프로그램, …
4
응용 소프트웨어
 예) 웹 브라우저
5
응용 소프트웨어
 예) 그래픽/멀티미디어 소프트웨어
6
응용 소프트웨어
 예) 이미지 처리/압축 소프트웨어
이미지
변형
이미지
압축
7
Programming Lang. 종류
 기계어machine language
 컴퓨터가 직접 이해가능한 언어
 0과1의 조합
 어셈블리어assembly language
 0과1의 조합을 상징적인 코드로 변환하여 인간의 이해도를 향상
 컴퓨터에서 실행되려면 결국 기계어로 변환되어야 함
 어셈블러(Assembler)라는 소프트웨어 필요
 고급수준언어high-level programming language
 인간이 이해하기 가장 쉬운 언어
 역시, 기계어로 변환시켜 주는 소프트웨어가 필요
 예) FORTRAN, COBOL, PASCAL, BASIC, C, C++, Java...
8
Programming
Programming
Algorithm
작성
+
Coding
9
알고리즘 표현 방법
 논리적 순서 표현
 Flow Chart 방식
1부터 100까지의
숫자를 더하기위한
순서도
start
i <- 0
sum <- 0
i < 101
i<- i+1
sum<-sum+i
T
F
print sum
end
10
알고리즘 표현 방법
 자연어로 표현




결과값을 0으로 초기화
단계값을 1에서 부터 100까지 증가
연속적으로 결과값에 단계값을 더함
단계값이 100에 다다를 때까지
 의사코드 (pseudo code) 방식
 코딩하기 전 프로그램 형태
Sum  0
Step  0
While (step <= 100)
Sum  sum + step
Step  step + 1
Print Sum
11
Programming Language를 익힌다는 것은?
문법 (Syntax)
변수 (variables)
 단위변수, 구조체, 클래스 (객체)
 컴퓨터 내부 자료 표현
흐름제어 (sequence control)
 반복, 분기, 순차
개발환경
컴파일러 (compiler)
편집기 (editor)
디버거 (debugger)
프로그래밍
알고리즘 작성
코딩
12
Chapter 01 컴퓨터와 프로그램
컴퓨터의 구성요소
 컴퓨터
 compute(계산)하는 기계
컴퓨터는 기본적으로 전기적인 On/Off 즉 1과 0
의 두 가지 신호밖에 인식하지 못한다. 따라서 컴퓨
터는 1과 0의 조합으로 구성된 문자, 숫자 등의 데
이터를 처리 계산함으로써 원하는 결과를 생성
 컴퓨터는 사람과는 달리 창조적으로 사고할 수 있는 능력이 없으며,
단순히 주어진 명령들만을 수행
 컴퓨터의 행동을 지시하는 이러한 명령들을 우리는 프로그램
(program)이라고 부르며
 이 프로그램을 이용하여 단순한 ‘사실’(fact)을 의미 있는 ‘정
보’(information)로 변환하는 역할을 수행하는 것이 컴퓨터가 하
는 주요 일
14
하드웨어와 소프트웨어
 하드웨어
(Hardware)
 컴퓨터를 구성하는 물
리적인 장치(device)
를 의미
 소프트웨어
(Software)
 컴퓨터가 수행할 작업
을 지시하는 명령어들
의 집합(프로그램)
 소프트웨어는 응용 소
프트웨어와 시스템 소
프트웨어로 나누며, 시
스템 소프트웨어는 하
드웨어를 작동시키는
기본 소프트웨어
15
컴퓨터의 자료표현
 자료표현 원리
 2진수 체계를 사용
 비트와 바이트
 Bit
 Binary Digit
 0 또는 1의 두 개 정보
표현하는 정보의 최
소 단위
 byte
 연속된 8개의 비트
 워드
 연속된 4 개의 바이트,
총 32비트
 실질적으로 시스템마
다 워드의 크기는 다
를 수 있음
16
저장단위의 크기
 단위
 현실에서의 기억용량의 단위
17
코드체계
 문자 코드
 N비트의 조합에 일정한 문자를 할당하여 지정한 것을 문자 코드
 국제 표준인 문자 코드는 아스키코드, 엡시딕코드, 유니코드
 아스키 코드
 ASCII(American Standard Code for Information Interchange)
 국제적인 표준으로 사용하는 문자 코드 체계로서 7비트를 사용하여
128개의 문자, 숫자, 특수문자 코드를 규정
 엡시딕 코드
 EBCDIC(Extended Binary Coded Decimal Interchange Code)은 8비
트를 사용하여 문자를 표현하는 코드 표준으로 IBM에서 제정한 표준
 유니 코드
 전 세계의 문자를 모두 표현하기 위한 16비트(2바이트)로 확장된 코드
체계
 자바 언어에서 기본으로 이용
18
아스키 코드
 코드표
 아래의 표에서 행의 4개의 비트는 총 7비트의 하위 4개 비트로 표현
하며, 열의 3개 비트는 상위 3개 비트를 표현
 즉 대문자 A의 코드는 1000001이며, 소문자 a의 코드는 1100001
19
여러 진법
 10진법
 0에서 9까지의 수를 사용하며, 이 10 가지의 수를 한 자리의 기본 단
위로 하는 진법
 2진법
 0과 1의 조합으로 숫자를 표시하는 방법
 컴퓨터의 자료 표현은 한 비트가 두 가지 표현이 가능
20
8, 16진법
 8진법
 0부터 7까지의 8가지의 수를 이용하여 숫자를 표시하는 진법
 16진법
 0에서 9까지 그리고 A에서 F까지(소문자도 이용 가능) 총 16개의 숫
자나 문자를 사용하여 표시하는 진법
 문자 A는 10을 의미하며, B는 11, C는 12, D는 13, E는 14, F는
15를 의미
21
양수의 이진표현
 10진법의 양수를 2진법으로 바꾸는 규칙
단계 1 : 주어진 값을 2로 나누고 그 나머지를 기록한다.
단계 2 : 몫이 0이 아니면 계속해서 새로운 몫을 2로 나누고
그 나머지는 기록한다.
단계 3 : 몫이 0이면 원래 값의 2진 표현은 나머지가 기록되는
순서대로 왼쪽에서 오른쪽으로 나열한다.
 26을 2진수로 바꾸는 과정
 위의 계산 과정을 통하여 26 = 110102
22
소수의 이진 표현
 10진법의 소수를 2진법으로 바꾸는 규칙
 단계 1 :
 10진수에 2를 곱하여 나온 결과에서 정수 부분으로의 자리 올림수와 소수점 아래
부분을 따로 보관한다.
 단계 2 :
 단계 1에서 소수 부분이 0이면 단계 3으로 넘어가고, 아니면 소수점 아래 부분을 다
시 새로운 10진수로 하여 단계 1을 반복한다.
 단계 3 :
 구해진 정수 부분으로의 자리 올림수를 순서대로 나열한다.
 위의 규칙을 이용하여 0.625를 2진수로 바꾸는 과정을 그림으로
표현
23
2진수, 8진수, 16진수간
상호관계
 2진수, 8진수 그리고 16진수 사이의 관계
 8 = 23, 16 = 24 의 관계가 존재하므로 이를 이용하면, 2진수로 표
현된 수를 각각 8진수, 16진수로 표현하는데 쉽게 변환이 가능
 2진수의 4자리씩을 16진수로 변환하면 쉽게 2진수를 16진수로 변
환이 가능
 2진수의 3자리씩을 8진수로 변환하면 쉽게 2진수를 8진수로 변환이
가능
 26.625를 각각 2진수, 8진수, 16진수로 표현하면 다음 그림과 같음
24
보수(complement)
 이진수의 연산에서 1의 보수
(complement) 연산
 이진수의 비트를 각각 0은 1로,
1은 0으로 변환하는 연산
 즉 4비트의 이진수 0100의 1의
보수를 구하면 1011
 2의 보수
 음수를 표현하는 방식 중 가장
많이 사용되는 방식이 2의 보수
 이해를 돕기 위하여 비트의 수
가 4인 경우 2의 보수 표현법을
이용한 음수와 양수를 나타낸
표
25
2의 보수
 음수의 이진수 표기인 2의 보수를 구하는 방법 1
 2n에서 음수의 절대값을 빼는 방법
 여기에서 n은 숫자가 표현되는 비트의 개수
 예를 들어 –4를 4비트로 2의 보수로 표현하자면, 표현되는 비트의 수가
4개이므로 24 – 4 = 12 = 1100
 2의 보수를 구하는 방법 2
 예를 들어 –4를 4비트로 2의 보수로 표현하자면
26
정수의 연산
 음수는 보수 표현으로
 2의 보수를 이용한 음수의 표현 방법을 이용하여 정수의 빼기를 계산
하면 그 연산이 매우 간단
 즉 4비트의 정보를 표현하는 방법에서 다음과 같이 4-4를 4+(-4)로
표현하여, 각 수를 이진수로 계산하면 간단히 0000이 계산
27
컴퓨터의 정수 표현
 정보의 표현
 컴퓨터는 양수와 음수를 표현하는데, 이진수와 2의 보수 방법을 이용
 8비트의 메모리로는 28 가지(256)의 정보를 표현
 양수와 음수를 모두 표현하면 -(27)에서 (27 - 1)까지의 범위를 표현
 n비트의 표현
 결과적으로 2의 보수를 이용하여 n개의 비트를 가지고 정수를 표현
하면, 수의 범위는 -(2n-1)에서 (2n-1 - 1)까지의 정수
28
표현범위와 오버플로우
 표현범위
 다음은 저장공간의 비트 크기에 따른 정수 표현 범위의 최대 값, 최소 값을 나
타낸 표
 오버플로우
 n개의 비트들로는 표현의 한계가 있으므로 이 범위를 넘는 수는 값을 표현
할 수 없다는 의미를 가지며 이러한 현상을 오버플로우
 한 예로 M = 00112= 3, N = 01102 = 6일 때,
 M + N = 00112 + 01102 = 10012 인데, 이 수는 –7이라는 결과가 나온다. 이는 우리
가 원했던 9와는 상이한 답
29
프로그램과 소프트웨어
 프로그램
 프로그램은 컴퓨터에게 어떤 일의 수행을 지시하는 명령어(instruction) 집합
 소스
 특정한 프로그램 언어로 이 명령어의 집합을 모아 놓은 파일을 프로그램 소스
(source)
 실행파일
 이 소스 파일로부터 만들어진 실행 파일은 컴퓨터가 이해할 수 있는 기계어로 명령
어를 모아 놓은 파일
 소프트웨어
 소프트웨어는 보통 ‘프로그램’이라고 부르는 것 외에도 데이터와 문서까지
를 포함하는 포괄적인 개념
30
프로그램 소스
 C 언어로 작성한 프로그램 소스의 예
 1에서 10까지 더한 결과를 출력하는 명령어를 가지는 C 프로그램
31
소프트웨어의 개발단계
 소프트웨어의 생명주기
구현 단계는 흐름도 또는 의사
코드를 컴퓨터가 이해할 수 있
는 프로그래밍 언어로 번역
(translation)하는 단계
32
분석 설계 단계
 문제의 분석 단계
 시스템을 사용할 사용자의 요구사항을 파악하여 분석하는 단계
 사용자의 요구사항은 보통 ‘명세서’를 통하여 제시
 예를 들어, 어떤 정수를 입력 받아 해당 정수까지 덧셈을 수행해야 한다면
이러한 내용에 대한 기술이 명세서
 설계 단계
 분석단계가 끝나면 프로그래머는 소프트웨어 설계에 들어가는데, 알
고리즘(algorithm)을 이용하여 설계
 사용자 요구사항이 많을수록 알고리즘이 복잡해지며, 이를 지원하기
위하여 사용하는 툴(tool)로서 흐름도(flow chart)나 의사코드(pseudo
code) 등을 사용
 흐름도는 데이터의 흐름과 수행되는 연산들의 수행순서를 시각적인
기호를 이용하여 나타내는 방법
33
흐름도
 하나의 정수 n을 입력 받아서 1부터 n까지 더하는 과정을 계산하는
흐름도
34
의사 코드
 1부터 10까지 더하는 과정을 나타내는 의사코드
/* 1부터 10까지 더하는 의사코드 예 */
프로그램 시작
변수 선언 및 기본값 저장
옆 조건을 만족하면 계속 반복 (i <= 10) {
sum = sum + I
i=i+1
}
출력 sum
프로그램 종료
35
구현 단계
 흐름도 또는 의사코드를 컴퓨터가 이해할 수 있는 프로그래밍
언어로 번역(translation)하는 단계
 위 분석단계의 흐름도 예를 C 언어를 이용한 프로그램
/* file : addn.c */
#include <stdio.h>
int main(void)
{
int i, n;
int sum = 0;
}
printf("정수를 입력하세요 : ");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum = sum + i;
}
printf("1부터 %d까지의 합은 %d입니다.\n", n, sum);
return 0;
36
검사 단계
 다음 단계는 프로그램의 검사 및 디버깅(debugging) 단계
 디버깅이란 오류를 찾아내고 이를 수정하는 것을 의미
 오류에는 구문 오류(syntax error)와 논리 오류(logic error) 두 가지
 구문 오류
 구문 오류는 문법적인 오류가 있을 때 발생
 예를 들어 위의 C프로그램 소스 코드에서 문장 마지막에 위치하는 세
미콜론(;)이 빠지면 구문 오류가 발생
 논리 오류
 반면, for(i = 1; i <= n; i++) 대신 for(i = 1; i < n; i++)로 입력하는 경우에
는 논리 오류가 발생
 이 경우, 1에서 n-1까지의 합을 구하는 오류가 발생
37
유지 보수
 마지막 단계는 프로그램의 문서화 및 유지보수 단계
 프로그램에 대한 관리를 쉽게 하기 위해서는 체계적인 문서화가 필요
 사용자의 요구사항이 변화했을 경우에는 프로그램을 적절하게 변경시
켜야 하는 등 유지보수 작업이 중요
38
소프트웨어 공학
 Software engineering
 소프트웨어 공학은 1970년대 “소프트웨어 위기(Software Crisis)”로 인한 문제
점을 해결하기 위한 방안으로 등장
 소프트웨어의 품질, 유지관리 등과 관련한 총체적인 어려움을 지칭하는 용어
 소프트웨어 공학은 신뢰성 있고 실제 기계에서 효과적으로 작동하는 소프트웨
어를 경제적으로 얻기 위해서 올바른 공학적 원리들을 체계화시키고 이용한 것
 소프트웨어 공학의 목표
 소프트웨어를 경제적으로 개발하며, 신뢰성을 갖춘 소프트웨어의 개발, 소프트
웨어의 품질 향상, 개발자의 생산성 향상 및 직무만족도 제고
 이러한 목표는 앞에서 언급한 ‘소프트웨어 위기’로 인하여 발생하는 문제점에
대한 해답이라고 볼 수 있음
 장점
 프로그램 개발에 있어 소프트웨어 공학을 도입함으로써 단순한 프로그래밍으
로부터 탈피할 수 있고, 오류의 사후처리가 아닌 사전예방이 강화될 수 있음
 아울러 소프트웨어의 재활용 가능성이 높아지는 이점
 소프트웨어 공학은 비단 소프트웨어 개발에만 사용되는 것이 아니라, 소프트웨
어의 생산성 및 품질을 측정하는 데 있어서 중요한 측정수단
 아울러 소프트웨어의 유지/보수에 활용함으로써 보다 효율적인 작업이 가능
39
프로그램 개발환경
 개발환경
 프로그램을 개발하기 위해서는 기본적으로 에디터(editor), 컴파일
러(compiler), 링커(linker), 로더(loader), 디버거(debugger) 등
이 필요
 IDE
 이러한 도구를 통합적으로 제공하는 개발 환경을 통합 개발 환경
(Integrated Development Environments)
 개발환경 주요 구성요소
 Compiler
 고급언어로 작성된 프로그램을 기계어로 바꾸어주는 프로그램
 링커
 이러한 여러 개의 목적 코드들을 하나의 프로그램으로 합치는 작업을 수
행
 디버거
 프로그램의 명령을 수행함에 있어 컴퓨터의 상태를 보여주거나 오류 발생
시 오류를 쉽게 찾을 수 있도록 도와주는 프로그램
40
컴파일러
 프로그램을 만들기 위한 특수한 프로그램
 고급언어로 작성된 프로그램을 기계어로 바꾸어주는 프로그램
 컴파일러에 의해 처리되기 전의 프로그램을 원시 코드(source code)
 컴파일러에 의해 기계어로 번역된 프로그램을 목적 코드(object code)
 이러한 원시 코드와 목적 코드가 저장된 파일이 각각 소스 파일, 목적 파일
41
인터프리터와 컴파일러
 인터프리터
 컴파일러처럼 고급언어를 기계어로 번역해주는 역할을 수행
 컴파일러와의 차이
 컴파일러는 원시 코드 전체를 읽은 다음 이를 기계어로 번역해 주는
데 비하여, 인터프리터는 원시 코드를 한 줄씩 읽어 들여 목적 코드로
변환
 프로그램 언어 베이직(BASIC)이 인터프리터를 사용하는 대표적인
프로그램
42
프로그램 제작과정
 링커(linker)
 이러한 여러 개의 목적 코드들을 하나의 프로그램으로 합치는 작업
 디버거(debugger)
 프로그램의 명령을 수행함에 있어 컴퓨터의 상태를 보여주거나 오류 발생시 오류를 쉽게
찾을 수 있도록 도와주는 프로그램
 로더(loader)
 작성된 프로그램을 컴퓨터의 주기억장치에 로드(load)함으로써 프로그램을 실행 가능하게
하는 역할을 수행
 라이브러리
 자주 사용하는 프로그램들은 프로그램을 작성할 때마다 새로 작성하는 것이 아니라 미리
만든 다음 컴파일하여 저장해놓는데, 이러한 파일들을 라이브러리(library)
43
프로그래밍 언어
 프로그래밍 언어의 필요성
 사람과 컴퓨터가 서로 의사교환을 하기 위하여 만든 것이 프로그램
언어
 프로그램 언어는 사람이 컴퓨터에게 지시할 명령어를 기술하기 위하
여 만들어진 언어
 프로그래밍 언어의 분류
 기계어
 0과 1로 표현되는 프로그래밍 언어로서 컴퓨터가 직접 이해할 수 있는 유
일한 언어
 어셈블리어
 기계어의 연산코드와 피연산자를 프로그래머가 좀 더 이해하기 쉬운 기호
형태로 일대일 대응시킨 프로그래밍 언어
 고급언어
 사람이 이용하는 언어와 유사하여 사람에게 더욱 친근한 프로그램 언어
44
프로그램 언어
 프로그램 언어의 발달
 프로그램 언어 분류
45
객체지향과 절차적 언어
 고급 언어의 분류
 고급 언어로 분류하는 여러 방법 중의 하나가 절차지향(Procedural)
언어와 객체지향(Object oriented) 언어로 나누는 방법
 절차지향 언어와 객체지향 프로그래밍 언어의 특징
46
고급 언어의 종류
 포트란
 포트란(FORTRAN)은 FORmula TRANslating system(수식 번역 시스템)의
약자
 과학과 공학 및 수학적 문제들을 해결하기 위해 고안된 프로그래밍 언어
 베이직
 베이직(BASIC)은 Beginner’s All-purpose Symbolic Instruction Code의
약어
 초보자도 쉽게 배울 수 있도록 만들어진 대화형 프로그래밍 언어
 코볼
 코볼(COmmon Business Oriented Language)은 기업의 사무처리에 적합
한 프로그래밍 언어
 파스칼
 PASCAL은 프랑스의 수학자인 파스칼(Pascal)의 이름에서 따온 언어
 프로그램의 작성 즉, 구조적 프로그래밍 및 알고리즘 학습에 적합하도록 개발
된 프로그래밍 언어
47
고급 언어의 종류
C
 C는 유닉스(UNIX)의 운영체제 작성을 위한 시스템 프로그래밍 언어로 설계
된 언어
 컴파일러나 수많은 소프트웨어 도구(Tool)들도 C언어로 개발
 C언어는 프로그램을 기계어 명령에 가까운 형태로 작성할 수 있으므로 다른
고급언어에 비하여 하드웨어에 대한 보다 확실한 통제가 가능
 특정 컴퓨터 기종에 의존하지 않으므로 프로그램의 이식성(portability)이 높
음
 풍부한 연산자와 데이터 형(data type)을 갖고 있기 때문에 범용 프로그래밍
언어로서 널리 보급되었으며, 응용 소프트웨어의 개발에 널리 이용
 C++
 C++은 객체지향 프로그래밍(OOP Object-Oriented Programming)을 지
원하기 위해 C언어가 가지는 장점을 그대로 계승하면서 객체의 상속성
(inheritance) 등의 개념을 추가한 효과적인 언어
 C++는 C언어의 확장이라고 볼 수 있으므로 기존의 C언어로 개발된 모든 프
로그램들을 수정 없이 그대로 사용 가능
48
고급 언어의 종류
 자바
 자바(JAVA)의 시초는 1992년 미국의 SUN 사에서 가전 제품들을
제어하기 위한 언어에서부터 비롯됨
 운영체제나 CPU와는 독립적으로 실행 가능한 프로그래밍 언어
 자바는 C++언어의 기초 위에 객체지향 개념을 구현하도록 설계된
언어
 분산 네트워크상에서의 프로그래밍이 용이
 자바 프로그램의 실행은 운영체제의 가상 머신(Virtual Machine) 위
에서 인터프리터 방식으로 작동하므로 프로그램의 속도가 떨어진다
는 단점도 지적
49
C, C++, Java
 프로그래머에게 매우 중요한 언어
 기본은 모두 C 언어
50