PROGRAM LANGUAGEcslab.cbnu.ac.kr/course/2019.2/cs/07.proglang.pdf · •...
Transcript of PROGRAM LANGUAGEcslab.cbnu.ac.kr/course/2019.2/cs/07.proglang.pdf · •...
2
이번 시간에 배우는 것들
7.1 프로그래밍 언어의 역사
• 초창기 언어, 3세대 언어, 4세대 언어
7.2 주요 프로그래밍 언어
7.3 프로그램의 구현
• 프로그래밍과 개발도구, 프로그램 개발 과정
7.4 전통적 프로그래밍 개념
• 변수와 자료형, 자료구조, 상수와 리터럴, 배정문과 연산자 우선순위, 제어문, 주석
7.5 프로시저 단위
• 프로시저의 구성, 지역변수와 전역변수, 매개변수의 전달
7.6 객체지향프로그래밍
• 객체지향과 절차지향, 클래스와 객체, 생성자를 갖는 클래스, 클래스의3가지 특성
4
1-세대 프로그래밍 언어
기계어(machine language)
• 이진수들로 인코딩된 일련의 명령들로 이루어짐
• 디버깅(debugging) 작업 = 2진수와의 전쟁
- 디버깅 : 오류 찾아서 고치는 과정
156C166D5056306EC000
5
2-세대 프로그래밍 언어
어셈블리어(Assembly language) : 기계 명령을 표현하기 위한 기호체계
• 명령 코드는 기호식 이름으로 표현
• 어셈블러(assembler)라고 불리는 번역 프로그램에 의해 기계어로 변환됨
- 프로그래머는 기계처럼 사고해야 함
- 기계 명령과 어셈블리 명령 사이에는 일대일 대응관계가 존재
• 기계어 대비 획기적인 발전
• 문제점 : 기계 종속적
- 어셈블리어는 컴퓨터마다 다름
- 컴퓨터가 바뀌면 새로 배워야 함
LD R5, Price
LD R6, ShippingCharge
ADDI R0, R5, R6
ST R0, TotalCost
HLT
식별자(identifier): 메모리 주소를 나타내는 의미있는 이름이며, 프로그래머가 정한다
7
3-세대 프로그래밍 언어
절차지향 언어
• 고급 수준의 프리미티브 집합을 가짐
- 하나의 고급 수준 프리미티브가 요청하는 활동을 수행하기 위해 여러 개의기계어 명령을 조합(compile)
- TotalCost = Price + ShippingCharge
• 특징 : 기계 종속성(machine dependency) 일부 해소
- 그래도 기계마다 조금씩 틀림 (예: C의 int) -> 보완책: 표준의 제정 (예: ANSI C)
• 번역기(translator) : high-level P/L -> machine language
- 컴파일러(compiler), 인터프리터(interpreter)
• 가장 널리 알려진 3세대 언어
- FORTRAN(FORmula TRANslator)
- COBOL(COmmon Businsess-Oriented Language)
- C
- ... ...
8
4-세대 프로그래밍 언어
4세대 언어 : 절차지향 언어 이후의 프로그래밍 언어
객체지향 언어(Object oriented language)
• 프로그래밍을 함에 있어서 데이터와 그 데이터를 처리할 메소드를 묶어객체화
• 객체들을 조립하여 목표를 해결
• C++, C#, Java 등
스프레드시트 프로그램
• 표 계산 관련 프로그램을 작성할 수 있음
스크립트 언어
• 웹과 데이터베이스를 쉽게 연결하여 프로그램을 개발할 수 있는 언어
데이터베이스 질의 언어(query language)
• 비절차적 중심 언어 : 프로그래머가 원하는 결과를 얻기 위해서 절차를따를 필요가 없음
• 대용량 데이터를 처리하기 위한 데이터베이스 관련 프로그램을 개발할수 있는 언어
12
FORTRAN
FORmula TRANslator
• 최초의 high-level P/L
• 수학 계산에 아주 강함
• 언어 구조가 단순해 지금도 기술 계산 분야 등에서는 사용
• FORTRAN IV, FORTRAN 77, FORTRAN 90으로 발달
• 특징: 위치에 따라 명령을 구분
14
Basic
Beginner's All-purpose Symbolic Instruction Code
• 1963년에 개발
• 대화형의 영어 단어를 바탕으로 약 200여 개의 명령어들로 구성
• 가장 쉬운 대화형 프로그래밍 언어
• 1980년대에 개인용 컴퓨터의 출현과 함께 기본 개발 언어로 탑재
- 범용적인 언어로 널리 사용
• 마이크로소프트는 베이직을 기본으로 비주얼베이직(Visual Basic)이라는프로그램 언어를 개발
15
Pascal
Blaise Pascal의 이름에서 유래
1971년 Wirth 교수가 개발 (전산학자)
• 잘 정의된 문법 -> 교육용으로 최적
이후, 수많은 language들에 지대한 영향
• C : Pascal의 사투리
C 언어에 비해 엄격한 구조를 요구
현재는 도태되는 분위기
17
C
이름의 유래: BCPL(Basic Combined Programming Language) → B → C
• 개발자: 벨 연구소의 Dennis Ritchie
개발 이유
• O/S 개발용: UNIX system
• compiler 개발용: 이후의 대부분의 compiler
특징
• 하드웨어에 대한 통제가 가능
• 프로그램의 이식성(portability)이 높음 (대부분의 고급 언어들 특징)
• 풍부한 연산자와 데이터 형(data type)을 갖고 있기 때문에 범용프로그래밍 언어로서 널리 보급
• 운영체제, 컴파일러, 통합개발환경 등이 대부분 C 언어로 개발
근황
• C언어는 등장 이후 언어의 역사에 큰 영향을 줌
• UNIX 등의 운영체제의 기능을 사용하는데 편리한 방법을 제공함
• C++의 등장으로 계속 발전
19
C++
이름의 유래: C -> C++
• C+, D 모두 있었음
Bjarne Stroustrup이 OOP를 쓰기 위해 개발
특징: object, class의 도입
• C의 유연성에 객체지향의 편리성을 접목시킴
• 기존의 C언어로 개발된 모든 프로그램을 수정 없이 사용 가능
• C언어에 익숙해지면 C++도 빠른 적응 가능
• 대부분의 운영체제에서 C++를 지원
OOP의 대중화에 기여
근황
• Java와 같은 새로운 객체지향 언어의 기틀이 됨
• 현재 수많은 사용자들을 보유
21
Java vs. C#
Java
• 이름의 유래: 커피 이름
• C++와 비슷하면서, 불필요한 기능 제거
• Sun이 Internet이나, embedded system 용으로 설계
• 운영 체제나 중앙처리 장치에 관계없이 모든 플랫폼에서 사용 가능
• 자바와 플랫폼 사이에 자바 가상 머신이 인터페이스 역할을 수행
C#
• MS가 Java에 대항해서 만든 언어
- 거의 Java 비슷, 몇가지 첨가
• .NET의 중심 (.NET : MS의 XML 기반 웹서비스플랫폼)
22
Python
Python
• 1989년, 크리스마스 주에 연구실이 닫혀 있어서심심한 김에 만들었다 - Guido van Rossum
• 현재 미국의 대학에서 컴퓨터 기초과목으로가장 많이 가르치는 프로그래밍 중 하나
• 인터프리터 언어
• 간단한 문법구조를 가진 대화형 언어
• 동적 자료형(dynamic typing)을 제공
• 변수를 선언하지 않고 사용
• 여러 플랫폼에서 사용되는 다양한 영역에 활용
• 프로그램을 쉽고 빠르게 개발
23
Python
문자열 "Hello World!" 를 출력하는 파이썬 소스
공식 사이트
• https://www.python.org/
• 튜토리얼 https://docs.python.org/3/tutorial
24
UNIX 기반의 언어
ProC
• C언어의 UNIX 확장판
• C언어를 사용한 UNIX의 데이터베이스 관리에 많이 사용함
C
• UNIX의 가장 중심적 언어
• UNIX 자체를 C 언어로 제작하여 UNIX 프로그래밍에 필수임
Shell 프로그래밍
• 여러 가지 Shell 명령어를 순차적으로 수행함
• Shell : UNIX에서 대화형 사용자 인터페이스를 부르는 용어로, 사용자가입력하는 명령어를 이해하고, 실행하는 역할을 수행
25
Linux 기반의 언어
Perl
• 인터넷의 등장과 함께 인기를 누린 스크립트 언어임
• 초보자도 배우기 쉽고 객체지향적인 특징을 지원함
PHP
• 인터넷에서 사용하는 대표적인 스크립트 언어임
• 컴퓨터에서 실행하지 않고 웹 서버에서 실행되는 대표적인 Server Side Script 언어임
Python
• 가장 최근에 등장한 강력하고 배우기 쉬운 언어
• 여러 플랫폼에서 사용되는 다양한 영역에 활용
26
웹 기반의 언어
JSP
• Java Server Pages : 자바 서버 페이지
• HTML 내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를생성하여 웹 브라우저에 돌려주는 언어
• 서블릿(Java Servlet)과는 달리 HTML 표준에 따라 작성되므로 웹디자인하기가 상당히 편리함
ASP
• Active Server Page : 액티브 서버 페이지
• 마이크로소프트사에서 개발한 서버 측의 웹 스크립트 환경
• 마이크로소프트 데이터베이스의 접근이 매우 편리함
28
프로그래밍 개요
프로그램
• 컴퓨터에서 특정 목적의 작업을 수행하기 위해 관련된 명령어와 자료를모아 놓은 것이 프로그램(program)
• 컴퓨터에게 지시할 일련의 처리 작업 내용을 담고 있음
• 컴퓨터에서 특정 목적의 일을 수행하는 프로그램을 만드는 과정을"프로그래밍한다"라고 표현
프로그래머(programmer)
• 프로그램을 만드는 사람
• 넓은 의미로 개발에 참여하는 사람을 개발자(developer)라 할 수 있음
• 코더(coder)
개발 도구(development tools)
• 선정한 언어를 이용하여 프로그램을 개발하기 위한 환경이 필요
29
프로그램 개발 환경
편집기(Editor)
• 프로그램 명령어인 프로그래밍 언어의 내용을 편집
컴파일러(Compiler)
• 개발 도구에서 가장 중요
• 고급 프로그래밍 언어를 컴퓨터가 이해할 수 있는 기계어로 변환
디버거(Debugger)
• 작성된 프로그램에서 발생하는 프로그램 오류를 쉽게 찾아 수정 할 수있도록 도와주는 프로그램
링커(linker)
• 여러 object 파일을 하나의 실행 파일로 만들어 주는 기능
로더(loader)
• 실행 파일을 메모리 셀에 올려주는 기능
30
프로그램 개발 환경
통합개발환경: Integrated Development Environments (IDE)
• 프로그램을 개발하는데 필요한 컴파일러, 디버거, 링커, 에디터 등을통합적으로 제공하는 개발 환경을 통합개발환경
• 마이크로소프트 사의 비주얼 스튜디오 익스프레스(Microsoft Visual Studio Express) 버전
- 무료 배포(www.microsoft.com/ko-kr/download)하는 제품
31
프로그램 구현 과정 : 소스 작성과 컴파일
소스 코드 작성
• 프로그램 언어를 이용하여 원하는작업을 기술한 내용을소스 코드(source code) 또는간단히 코드(code)라 함
컴파일
• 소스(source) 파일(원시 파일)을목적 파일(Object file)로 변환 과정
• 컴파일러
- 컴파일을 해주는 프로그램
33
프로그램 구현 과정 : 소스 작성과 컴파일
컴파일러(Compiler)
• 원시 코드 전체를 읽은 다음 이를 기계어로 번역
• 컴파일러는 한번 컴파일 한 후에는 수정이 없다면 매번 컴파일 할 필요없이 빠른 시간 내에 프로그램 실행이 가능
인터프리터(Interpreter)
• 고급 언어를 기계어로 번역
• 매 실행마다 원시 코드를 한 줄씩 읽어 들여 목적 코드로 바꾸어줌
• 컴파일러에 비해 번역 속도가 느림
• 프로그램을 작성할 때 보다 융통성을 가질 수 있음
35
프로그램 구현 과정 : 소스 작성과 컴파일
컴파일러와 인터프리터의 특징을 모두 갖는 방식
• 자바, C#
• 이들 언어는 컴파일러가 존재하여 컴파일 과정이 필요
• 컴파일 된 실행 파일을 실행할 때는 인터프리터 방식과 같이인터프리터가 필요
36
프로그램 구현 과정 : 링킹(linking)
링커(linker)
• 목적 파일을 실행 가능한 실행 파일(execute file)로 만들어주는 시스템소프트웨어
• 여러 개의 프로그램 각각을 컴파일하여 목적 파일을 만들게 되는데, 링커는 이러한 여러 개의 목적 파일들을 라이브러리 함수와 연결해서하나의 파일로 합치는 작업을 수행
실행 프로그램(executable program)
• 링킹 작업 결과 생성되는 프로그램을 실행 프로그램(executable program)
• (예) test.exe
라이브러리(library)
• 프로그래머들이 많이 사용되는 기능을 미리 작성해 놓은 것
• (예) 입출력 기능, 파일 처리, 수학 함수 계산
38
프로그램 구현 과정 : 디버깅
디버깅(debugging)
• 소스에 존재하는 에러(오류)를 잡는 것
디버거(debugger)
• 프로그램의 명령을 수행함에 있어 컴퓨터의 상태를 보여주거나오류(또는 에러) 발생시 오류를 쉽게 찾을 수 있도록 도와주는 프로그램
처음부터 에러가 없는 프로그램을 작성하기란 거의 불가능
그러므로 디버깅 과정은 매우 중요
39
프로그램 구현 과정 : 디버깅
오류의 종류
• 컴파일 오류 : 대부분 문법적인 오류
- 예) He go to school
• 실행 오류 : 컴파일시는 오류가 없으나 실행하면서 발생하는 오류
- 예) 실행 중에 0으로 나누는 연산
- 예) 잘못된 메모리 주소에 접근
• 논리 오류 : 논리적으로 잘못되어서 결과가 의도했던 대로 나오지 않는오류
- 예) 빵을 구울 때 빈 그릇에 반죽을 넣고 오븐에 넣어야 하는데, 빈 그릇만오븐에 넣은 경우
- int k, i=0;for (i=0; i<10; i++) { k=k+i; } // 1-10까지 합 구하기
오류가 발생하면 소스 프로그램을 수정한 후에 다시 컴파일
41
프로그래밍 개념
프로그램의 구성
• 선언문(declarative statement) : 사용할 변수/메소드 정의
• 명령문(imperative statement) : 실제 작업을 수행
• 주석(comments) : 설명, 내부 문서(internal documentation)
- 프로그램이 수행하는 기능을 사람이 이해하기 쉬운 형식으로 설명함으로써프로그램을 읽기 쉽게 해 줌
42
변수와 자료형
변수(variable)
• 주기억장치(memory)의 번지수 대신 쓰는 이름
• 프로그램에서 일시적으로 데이터를 저장하는 공간
• 변수는 물건을 저장하는 상자와 같으며, 해당 주소 위치의 값은프로그램 실행 중 변경이 가능함
• 많은 프로그래밍 언어에서는 변수들을 다른 곳에서 사용하기 전에선언문을 통해 미리 표시해야 함
int k = 3;
variable
43
변수와 자료형
자료형(data type)
• 데이터 항목들을 어떻게 인코딩할지와, 그러한 데이터에 대해 수행될 수있는 연산 규정
• 자료형마다 필요로 하는 메모리 크기가 다름
• 예) char : 1바이트
프리미티브 자료형(primitive data type)
• 정수(integer) : 2의 보수로 표현한 정수형
• 실수(real) : 부동소수(floating point)로표현한 실수형 (float)
• 문자(character) : ASCII로 표현한 문자형
다양한 자료형이 필요한 이유
• 상자에 물건을 저장하는 것과 같음
• 물건이 상자보다 크면? 물건이 상자보다 작으면?
float Length, Width;int Price, Total, Tax;char Symbol;
int WeightLimit = 100;
44
자료구조
자료구조(data structure)
• 데이터에 대한 개념적 형태나 배치
배열(array): 그 안의 항목들이 모두 동일한 타입인 데이터 블록
• 2차원 배열: 행들과 열들로 이루어짐
• 인덱스(index): 각 원소의 위치를 표시
• 예) 2개의 행과 9개의 열을 가지는 2차원 배열
C
int Scores[2][9];
FORTRAN
INTEGER Scores(2,9)
45
자료구조
집합체(aggregate)
• 타입과 크기가 다를 수도 있는 데이터 항목들의 블록
• 각 항목은 필드(field)라고 함
• 필드에 대한 접근은 이름을 통해 이루어짐
• C의 structure(구조체)
struct {char Name[25];int Age;float SkillRating;
} Employee;
<구조체 Employee의 개념적 구성>
46
상수와 리터럴
리터럴(literal)
• 어떤 값을 그대로 적는 것
• 값이 미리 정해져서 고정된 값
상수(constant)
• 변경되지 않는 특정 값에 서술적 이름을 부여
• 의미가 더 잘 표현되도록
EffectiveAlt = Altimeter + 645;
constant
literal
const int AirportAlt = 645;EffectiveAlt = Altimeter + AirportAlt;
48
연산자
연산자 우선순위(operator precedence)
• 연산자들 간의 우선 순위 관계
• 예: 4 + 7 * 34 + (7 * 3) 또는 (4 + 7) * 3
중복정의(overriding)
• 피연산자(operand)에 따라 연산자(operator)가 다른 의미를 가짐
• 4 + 6 : 정수(integer) 끼리의 더하기
• "abc" + "def" : 문자열(string) 끼리의 연결
• C#, Ada, C++ 등의 언어에서 지원
49
제어문
제어문(control Statement) : 프로그램의 실행 순서 변경
- if-then-else
- while
- switch
- for
대부분의 language 가 가지고 있으나, 형태는 조금씩 틀림
50
제어문 if
Python에서의 if
if (condition):
statementA
else:
statementB
C, C++, C#, Java 등에서의 if
if (condition)
statementA;
else
statementB;
Ada에서의 if
IF condition THEN
statementA;
ELSE
statementB;
END IF;
51
제어문 switch
C, C++, C#, Java 등에서의 switch
switch (variable) {
case 'A': statementA; break;
case 'B': statementB; break;
case 'C': statementC; break;
default: statementD;
}
Ada에서의 switch
CASE variable IS
WHEN 'A'=> statementA;
WHEN 'B'=> statementB;
WHEN 'C'=> statementC;
WHEN OTHERS=> statementD;
END CASE;
52
제어문 while
Python에서의 while
while (condition):
body
C, C++, C#, Java 등에서의 while
while (condition)
{ body }
Ada에서의 while
WHILE condition LOOP
body
END LOOP;
54
주석
주석(comment) : internal documentation
• program의 readability를 높이는 방법
• 특별한 기호로 시작과 끝을 표현
- /* This is a comment */
• 특별한 기호로 시작, 한줄 끝(line end)이 끝
- // This is a comment
56
프로시저
프로시저(procedure)
• 주프로그램(main program)과는 별도로 존재
• 호출(call)/리턴(return) 과정으로 실행되는 프로그램 단위(program unit)
• 다양한 용어가 사용됨:
- 부프로그램(subprogram), 서브루틴(subroutine), 프로시저(procedure), 메쏘드(method), 함수(function)
57
프로시저의 구성
대개 개별 프로그램 단위로 작성
• 프로시저 헤더(procedure's header)
• 프로시저의 세부사항을 정의하는 문장들
- 변수들을 기술하는 선언문
- 프로시저가 수행되어야 할 단계들을 기술하는 명령문
58
지역 & 전역 변수
참조범위(scope)
• 어떤 변수가 참조될 수 있는 프로그램의 부분
• 지역 변수(local variable) : 프로시저 내에서만 사용
• 전역 변수(global variable) : 프로그램 내의 모든 프로시저가 공유
전역 변수의 단점
• 연관된 프로시저를 알기 어려움
• 프로시저의 재사용을 방해
59
매개변수
매개변수 전달(parameter passing)
• 프로시저에 필요한 정보를 주고 받는 방법
ProjectionPopulation(0.03);
// 성장률을 0.03을 사용하여 ProjectionPopulation을 적용
60
형식 매개변수, 실 매개변수
형식 매개변수(formal parameter) : 프로시저 작성시 (이름)
• 프로시저 내부의 일반형 명칭
void ProjectionPopulation(float GrowthRate) {
// do something
}
실 매개변수(actual parameter) : call 될 때의 (값)
• 프로시저가 호출될 때 정해지는 형식 매개변수의 정확한 의미
ProjectionPopulation(0.03);
// 성장률로 0.03을 사용하여 ProjectionPopulation을 적용
61
매개변수 전달 방법
값을 함수 인자로 받기만 하는 경우 (in)
• 값에 의한 전달(call by value)
• 복사본이 전달
값을 함수 내에서 바꾸는 경우 (out)
• 참조에 의한 전달(call by reference)
• C에서는 포인터(pointer)
• C++에서는 레퍼런스(reference)로 해결
64
참조에 의한 전달과 프로시저의 실행
예) swap function
int main(){
int a=3, b=2;swap(a, &b);
}
void swap(int *xp, int *yp) {
int t0 = *xp;int t1 = *yp;*xp = t1;*yp = t0;
}
66
객체지향과 절차지향
절차지향(Procedural) 언어
• 절차지향에서 전체 과정을 나누어 처리하는 단위를 함수(function)라 함
• 절차지향 언어는 문제를 여러 개의 작은 함수로 나누어 그 문제를 해결
• 절차지향이 동사 중심의 프로그래밍 방식
객체지향(Object oriented) 언어
• 객체지향은 명사 중심의 프로그래밍 방식
• 객체는 자료와 일련의 처리 명령을 하나로 묶어 놓은 메소드로 구성
• 프로그램 단위로 함수보다 높은 수준의 모듈화 방법
67
절차지향 프로그래밍 vs 객체지향 프로그래밍
절차적 프로그래밍은 "어떤 처리 함수를 수행하는가?" 에 중점
객체지향 프로그래밍은 "어떤 객체가 동작을 하는가?" 에 중점
객체지향프로그래밍절차지향프로그래밍
69
클래스와 객체
클래스(class)
• 사용자 정의 데이터타입이라 생각하면 편함(일종의 데이터 형 역할)
• 하지만 클래스에는 변수라는 저장공간 외에 기능이라는 프로시저가 포함
• 객체가 가지는 공통된 특성을 기술하는 것
• 클래스에 비유될 수 있는 것 : 핸드폰 설계도
객체(object)
• 클래스 형에 의해 만들어진 실제 사용되는 변수와 메소드
• 구체적인 값을 갖는 실체
• 객체에 비유 될 수 있는 것 : 설계도에 따라 만들어진 핸드폰
class Laserclass {int power;void stop() { ... ... }
};
Laserclass Laser1, Laser2;Laser1.power=30;Laser2.power=50;Laser1.stop();
71
객체의 구성요소
인스턴스 변수(instance variable) : 객체 내부의 변수
• 객체 내부의 정보 저장
메쏘드(method) : 객체 내부의 프로시저
• 객체가 수행할 수 있는 행위를 기술
Laser1.RamainingPower = 50;
Laser1.turnRight();
73
클래스 특성 - 캡슐화
캡슐화(encapsulation)
• 객체의 내부 구성요소에 대한 접근을 제한하기 위한 수단
- 객체를 사용하기 위해서 필요한 부분을 제외한 나머지 부분을 캡슐로 감싸서숨기는 것
• 전용(private) 속성과 공용(public) 속성