티스토리 뷰

3과목. 프로그래밍 일반 - 1. 프로그래밍 언어

산업인력공단 시행 사무자동화산업기사 필기이론 정리

 

2020.1.1. ~ 2022.12.31. 출제 기준에 맞게 정리하였으며, 여러 자료를 참고하여 작성하였지만 부족한 부분이 많이 있습니다. 이 자료는 참고용으로 사용하시고 실제 시험을 준비하시는 분들은 모의고사 문제집 위주로 풀어보시길 권해드립니다.

 

1. 프로그래밍설계

 

(1) 구조와 연산

① 프로그래밍 개요

- 알고리즘 : 특정 문제를 해결하는 방법

- 순서도 : 이 방법을 알기 쉽게 시각적으로 표현한 것

- 코딩 : 알고리즘을 프로그래밍 언어로 기술한 것

② 프로그래밍 과정

- 알고리즘 발견 → 순서도 작성 → 코딩(원시프로그램 작성) → 컴파일 → 링크 → 실행

③ 프로그래밍 언어의 분류

- 절차적 언어 : 선언문과 실행문을 포함한 블록구조. 배정문 사용

- 함수형 언어 : 배정문이 없고, 반복문을 사용하지 않고, 재귀적 함수이론에 바탕을 둠

- 논리형 언어 : 자연언어, 인공지능, 추론 컴퓨터 제작시 사용

- 객체지향 언어 : 자료의 추상화(정보 은닉 기법)

④ 연산의 기능

- 산술연산 : 더하기, 빼기, 곱하기, 나누기

- 논리연산 : 논리곱(AND), 논리합(OR), 논리부정(NOT)을 이용한 참 거짓 판별

- 자료의 비교, 판단

- 자료의 이동

- 자료 편집

⑤ 연산의 종류

- 자료의 성격에 따라

‧ 수치적 연산 : 수학적 연산에 사용

‧ 비수치적 연산 : 논리식에 사용

- 입력되는 수에 따라

‧ 단항연산 : 하나의 입력에 하나의 출력이 있는 연산(자료 이동 등)

‧ 이항연산 : 두개의 입력에 하나의 출력이 있는 연산(사칙연산 등)

 

 

(2) 프로그래밍 분석과 설계

① 프로그래밍 언어의 설계

- 좋은 프로그래밍 언어의 조건

‧ 언어의 구조와 개념이 단순 명료하며 통일성이 있을 것

‧ 프로그래밍 언어의 구조가 명료해야 함

‧ 언어의 개념을 확장시키기 쉬워야 함

‧ 응용문제에 있어서 자연스럽게 적용이 가능해야 함

‧ 신뢰성이 있어야 함

‧ 다른 기종과 호환이 되어야 하며, 다른 언어와 이식성이 있어야 함

‧ 추상을 지원할 수 있어야 하고 검증하기 쉬워야 함

‧ 프로그램의 작성, 번역, 실행, 운영 및 유지보수 등 각종 비용이 적게 들어야 함

② 프로그래밍 언어 설계시 고려 사항

- 개념의 명료성- 구문의 명료성

- 문제 해결에 대한 적합성- 프로그램의 추상화 지원

- 프로그램 검증의 용이성- 프로그램의 호환성

- 프로그램 언어의 효율성- 개발 환경이 편의성

- 표기의 일치성

 

 

2. 언어번역

 

(1) 구문

① 기본 구문 요소

- 문자집합, 식별자, 예약어, 핵심어, 연산식, 연산자, 주석, 잡음어, 구분문자 등

- 잡음어 : 특별한 정보를 갖지 않으면서 인간의 판독성 향상을 이해 사용됨

- 구분 문자 : 단지 문장이나 식에서 구문적인 단위의 시작과 끝을 나타내는 요소

② BNF(Backus-Naur Form) 표기법

- 구문형식을 정의하는 가장 보편적인 기법

- 1963년 ALGOL 60 구문 정의시 BNF 표기법이 최초 사용됨

<identifier> ::= <letter> | <identifier><letter> | <identifier><letter>

<letter> ::= A | B | C | ... | X | Y | Z

<digit> ::= 0 | 1 | 2 | ... | 8 | 9

‧ 생성 규칙 왼쪽에는 정의될 대상(Object)이 표현되며, 오른쪽에는 그 대상에 대한 정의 표현

‧ ::= : 정의한다는 의미로 좌측은 우측과 같으며 문법에서 →와 같음

‧ | : 택일, 또는 의 의미로 나열된 것 중에 하나를 의미

‧ <> 괄호로 묶여진 기호는 논터미널(Nonterminal) 기호라고 하며 BNF 규율로 다시 정의될 대상을 의미

‧ <> 괄호로 묶이지 않은 기호는 터미널(Terminal) 기호라고 하며 터미널 기호에는 각 언어에는 사용되는 문자집합(영문, 숫자, 특수문자)과 예약어가 있음

‧ BNF 표기에 사용된 특수기호들(::=, |, <>)을 메타기호라 하며 언어 표현에 사용됨

③ EBNF(Extended Backus-Naur Form)

- BNF를 확장하여 특수한 의미를 갖는 메타기호를 추가하고 반복되는 부분이나 선택적인 부분을 간결하게 표현

- 사용되는 논터미널 기호의 수를 줄여 구문을 간결하게 표현할 수 있음

- 0번 이상 반복되는 부분 - { }로 표시

- 선택적인 부분으로 생략 가능 - [ ]로 표시

- { }, [ ], |, ( ), ::= 과 같은 메타기호가 언어에서 터미널로 사용되는 경우 혼동을 피하기 위해 터미널 기호를 ‘ ’로 묶어 표현

④ 구문 도표(Syntax Diagram)

- 구문에 대한 형식 정의를 구문 도표로 표현하는 방법으로 순서도와 비슷함

- 구문 도표에서 논터미널은 네모칸, 터미널은 원이나 타원, 이들을 연결하는 지시선으로 표현

- 지시선(→) : 흐름 방향 표시

- 사각형(□) : 논터미널 기호

- 원 또는 타원(○) : 터미널 기호

⑤ 파스 트리(Parse Tree)

- 어떤 표현이 BNF에 의해 바르게 작성되었는지를 확인하기 위한 트리(tree)

- 대상을 근(root)으로 하고 단말 노드들을 왼쪽에서 오른쪽으로 나열하여 검증

- 파스 트리가 존재하면 주어진 BNF에 의해 작성되었음을 의미하고, 파스 트리가 존재하지 않으면 BNF에 의해 작성될 수 없음을 의미

- 파싱(Parsing) : 파스 트리를 발생시키는 과정

 

 

(2) 번역단계

① 번역기의 정의

- 어떤 언어로 작성된 원시프로그램(Source Language)을 다른 언어(목적 프로그램, Object Language)로 변환시키는 프로그램

② 프로그래밍 언어의 번역과정

- 원시프로그램 → 컴파일러 → 목적프로그램 → 링커 → 로더

③ 번역기의 종류

- 컴파일러 : 고급언어를 기계어로 번역

- 어셈블러 : 어셈블리어를 기계어로 번역

- 인터프리터 : 목적 프로그램을 생성하지 않고 필요할 때마다 기계어로 번역

- 링커 : 목적 프로그램에 대해 로드가 가능한(실행가능한) 모듈을 생성

- 로더 : 로드 모듈을 메모리에 적재

- 프리프로세서 : 원시 프로그램을 기준의 고수준 컴파일러 언어로 전환하는 기법

- 크로스컴파일러 : 원시 프로그램을 다른 기종에 맞는 기계어로 번역하는 컴파일러

- 디버거 : 번역된 프로그램의 오류를 찾음

④ 컴파일러와 인터프리터의 비교

구분

컴파일러

인터프리터

사용의 용이도

어렵다

쉽다

번역 단위

프로그램 단위

행 단위(명령 단위)

출력 자료

입력프로그램과 동일한 목적 프로그램

직접 입력 프로그램을 실행

장점

반복문이나 부프로그램 호출이 많은 경우

큰 기억장치를 요구하지 않음

단점

생성된 목적 프로그램이 큰 기억장치를 요구

실행되는 동안 디코딩 시간을 많이 요구

활용

실행시간의 효율성(Efficiency)을 중시하는 프로그래밍 언어에서 사용

사용자의 유연성(Flexibility)을 중시하는 언어에서 사용

프로그램 크기

크다

작다

수행속도

빠르다

느리다

번역속도

느리다

빠르다

언어의 성격

정적(Static)

동적(Dynamic)

대표적 언어

포트란, 코볼, 파스칼, C/C++, Ada

BASIC, LISP, APL. Peril, Postscript

 

 

(3) 형식 변환 모델

① 형식 문법의 분류

문법 계층

언어

인식기(Recognizer)

Type 0

Recursively Enumerable Set

튜링기계(Turing Machine)

Type 1

Context-Sensitive Language

LBA(Linear Bounded Automata)

Type 2

Context-Free Language

푸시다운오토마타(Push Down Automata)

Type 3

Regular Language

유한상태오토마타(Finite Automata)

② 정규 문법과 문맥 자유 문법

- 정규 문법(Regular Grammar)

‧ 어휘 분석 단계에서 사용

‧ 토큰의 구조가 표현 대상

- 문맥 자유 문법(Context-Free Grammar)

‧ 구문분석 단계에서 사용

‧ 프로그래밍 언어의 구조가 표현 대상

③ 어휘 분석-토큰 생성

- 원시 프로그램을 토큰이라는 문법적 단위로 분석

- 스캐너라 불리는 어휘 분석기에 의해 이루어짐

- 프로그래머가 쓴 주석을 처리

④ 구문분석(Parsing)

- 어휘 분석 과정에서 인식된 합성문자 토큰의 그룹을 단위로 하여 구문의 타당성을 검사하는 과정으로 이 과정에서 잘못된 구문을 발견하면 오류 정보를 출력함

⑤ 파싱 기법

- Universal 파싱

‧ Universal 파싱은 비효율적이어서 실제 프로그래밍 언어의 컴파일러로 사용하기에 부적합

‧ 실제적 파싱은 하향식과 상향식 두가지 기법을 사용함

- 하향식 파싱(Top-Down Parsing)

‧ 파스 트리의 루트(Root)로부터 시작하여 파스 트리를 만들어 감

‧ 좌측 유도

- 상향식 파싱(Bottom-Up Parsing)

‧ 파스 트리의 리프(Leaf)로부터 위쪽으로 파스 트리를 만들어 감

‧ Shift Reduce 파싱

 

 

3. 자료형

 

(1) 형과 객체의 특징

① 자료의 일반

- 자료형의 분류

‧ 자료형 : 값의 집합 + 연산자의 집합

‧ 기본자료형 : 더 이상 다른 구조로 나눌 수 없는 자료형

‧ 구조적 자료형 : 기본 자료형을 복합하여 만든 자료형

- 형 선언(Type Definition)

‧ 프로그래머가 자료의 크기나 구조를 정의하는 과정

‧ 모든 언어에서는 기본 자료형을 제공하며 기본 자료형을 이용하여 확장된 자료형을 만들 수 있음

② 변수와 상수

- 변수(Variable)

‧ 변수는 이름, 속성의 집합, 참조, 값 등 4요소로 구성

‧ 변수의 속성은 실수, 정수 등과 같이 변수가 가질 수 있는 값들의 자료형을 의미

‧ 변수는 프로그램이 동작하는 동안 값이 수시로 변경될 수 있음

‧ 변수의 속성은 컴팡리 시간에 한번 정해지면 그 다음부터는 일반적으로 변할 수 없음

- 변수의 종류

‧ 지역(Local) 변수 : 블록 안에서 선언하고 선언된 불록 안에서만 사용되는 변수

‧ 전역(Global) 변수 : 블록 밖에서 선언하고 프로그램 내 모든 블록에서 사용되는 변수

- 상수(Constant)

‧ 수명시간 동안 고정된 하나의 값과 이름을 가진 자료 객체

‧ 상수는 프로그램이 동작하는 동안 값이 절대로 바뀌지 않는 공간을 말함

③ 선언문(Declarations)

- 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 문장

- 자료의 속성 : 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등

④ 배정문(대입문)

- 변수의 내용을 변경하는 원시 연산이며 프로그램에서 가장 일반적으로 나타나는 연산문

- 예시 : A = B(포트란), MOVE B TO A(코볼), A := B(ALGOL), A ← B(APL)

- L-Value : 지정 연산자의 왼쪽 변수로 메모리 주소를 의미함

- R-Value : 지정 연산자의 오른쪽 변수로 값을 의미함

- 모든 변수 이름은 L-Value를 가지고, 상수는 R-Value만을 가짐

 

(2) 기본 자료형

① 논리형

- 논리합(OR) : 두 피연산자가 모두 거짓일 때만 거짓, 그 외에는 참

- 논리곱(AND) : 두 피연산자가 모두 참일 때만 참, 그 외에는 거짓

- 부정(NOT) : 참은 거짓, 거짓은 참

- 조건(Implies) : 첫번째 피연산자가 참이고 두번째 피연산자가 거짓일 때만 거짓

- 동치(Equivalence) : 두 피연산자가 모두 참이거나 거짓일 때 참, 두 피연산자의 값이 다르면 거짓

② 문자형

- 범용 고급 언어에서 문자열 처리에 대한 많은 특성을 가짐

- 문자열에 순서를 부여하여 문자열 비교에 보편적으로 사용

- 문자열을 분해하거나 조립하는 연산자를 제공하는데 어려움이 있음

- 문자열의 연산 결과는 컴파일 시간에 결정되므로 기억 장소를 동적으로 할당‧회수

③ 숫자형

- 종류 : 정수, 유리수, 실수, 정밀도 실수, 복소수 등

- 일반적으로 하드웨어에 의존하기 때문에 변경할 수 없는 자료형

- 수의 연산이 기계어로 바뀌기 때문에 실행 속도가 매우 빠름

- 기계어 표현이 하드웨어마다 다를 수 있어 프로그램 이식에는 어려움이 있음

- 정수나 실수는 기계어로 직접 표현이 가능하므로 보통 설명자(Descriptor)가 필요없음

 

 

(3) 구조와 자료형

① 배열(Array)

- 같은 자료형이 묶인 자료구조

- 배열을 특징짓는 요소 : 배열의 이름, 배열의 차원, 배열의 자료형, 첨자의 형과 범위

② 레코드(Record), 구조체(Structure)

- 다른 자로형의 자료구조

- COBOL, Pascal, C 등의 언어에서 제공

- 레코드는 포인터를 원소를 가질 수 있으므로 연속적인 레코드 나열이 가능

- 레코드 구조는 주기억 장치 내 하나의 블록으로 구성

- 기억장치의 구성 및 접근을 위해서 각 원소의 크기 및 변위(Offset)가 먼저 결정되어야 함

- 한 원소가 기억 장치 내에서 자신의 위치를 결정하려면 앞에 정의된 원소들의 크기를 알고 있어야 함

③ 포인터형

- 포인터란 객체에 대한 참조(Reference)를 말함

- 포인터 변수는 객체를 참조하기 위해 해당 객체의 주소를 값으로 가짐

- ALGOL, Pascal, C 등의 언어에서 포인터를 제공

- 프로그램이 실행되면 동적인 객체를 생성

- 객체 간의 다양한 관계를 쉽게 구현

- 필요없는 객체는 제거하여 주기억 장치의 효율성을 높임

- 다양한 방법의 연결에 비해 통일된 방법으로 객체 접근이 가능

 

4. 순서제어

 

(1) 묵시적, 명시적 순서 제어

① 묵시적 순서제어

- 프로그래머가 명시적 제어를 하지 않으면 해당 언어에서 정의한 순서대로 제어함

- 일반 언어에서 순서를 명시적으로 제어하는 문장이 없으면 문장 나열 순서로 제어

- 수식에서 괄호가 없으면 연산자 우선순위에 의해 수식이 계산됨

② 명시적 순서제어

- 해당 언어에서 각 문장이나 연산의 순서를 프로그래머가 직접 변경

- GOTO문이나 반복문을 사용해서 문장의 실행 순서를 변경

- 수식의 괄호를 사용해서 연산의 순서를 변경

 

(2) 수식에서의 순서제어 & (3) 비수치적 연산식에서 순서제어

① 연산자 우선 순위

 

높음 --------------------------------------------> 낮음

C언어

(), [], ., ->

++, --

*, /, %

+, -

<<, >>

<, <=

==, !=

&

^

&&

② 수식 표기법

- 전위(Prefix) : 연산자가 피연산자 앞에 표시 (예: + 2 5)

- 중위(Infix)

‧ 연산자가 피연산자 가운데 표시 (예: 2 + 5)

‧ 일반적으로 가장 많이 사용

‧ 이항연산에 적합

- 후위(Postfix) : 연산자가 피연산자 뒤에 표시 (예: 2 5 +)

 

 

(4) 문장에서의 순서제어

① GOTO문 사용의 장단점

- 장점

‧ 간결한 GOTO문의 제어구조를 하드웨어로 제공

‧ 완전한 범용성을 가짐

‧ 이론적으로 거의 모든 알고리즘을 GOTO문만으로 표현 가능

‧ 많은 제어 구조들을 대신해서 사용할 수 있음

‧ 프로그램 언어에서 제어 구조용으로 사용됨

- 단점

‧ 관련된 프로그램의 분산을 초래함

‧ 프로그램이 빈약하게 디자인됨

‧ 디버깅이 어려움

‧ 프로그램을 이해하기 어려움

‧ 프로그램의 유지보수가 어려움

② 부프로그램(Subprogram)

- 주프로그램 또는 다른 부프로그램에 의해 사용되는 독립된 단위의 프로그램

- 특징

‧ 프로그램의 크기가 작아져 기억장소의 낭비를 방지

‧ 프로그램 자체의 실행속도는 느림

‧ 프로그램 재사용

‧ 프로그램의 이해와 유지보수가 쉬워짐

③ 서브루틴(Subroutine)

- 호출될 때마다 그 코드를 처음부터 다시 실행

- 반환 문장이 존재함

- 되부름이 허용하지 않는 루틴에서는 제어를 위한 기억장소 하나만 필요

- 제어를 위한 기억 장소는 자신이 완전히 실행되고 제어를 넘겨주는 위치임

④ 코루틴(Coroutine)

- 호출되면 자신이 가장 최근에 수행하고 있던 곳에서부터 다시 수행

- 제어를 반환한 코루틴은 일시 정지됨

- 반환 문장이 없음

- 동시실행 코루틴간에는 대칭관계

- 하나의 코루틴이 끝나면 전체 프로그램이 끝남

- 제어를 위한 기억장소는 코루틴이 다시 제어를 받을 때의 시작위치임

⑤ 부작용(Side Effect)

- 프로그래밍 언어에서 하나의 서브루틴이나 함수가 자신의 지역 변수에 속하지 않는 전역 변수나 매개변수의 값을 변경시키는 일

- 참조 호출(Call by Reference)과 이름 호출(Call by Name)에서 발생

- 전역 변수의 단점을 보완하기 위해 매개 변수 전달 기법을 사용

⑥ 별명(Aliasing)

- 한 단위 프로그램에서 동일한 기억 장소를 참조하는 변수에 두 개 이상의 이름이 붙은 것

- 실제 변수는 하나뿐이므로 한 변수의 값을 변화시키면 그 변수와 같은 기억 장소를 참조하는 다른 변수값도 같이 변하게 됨

 


PDF 다운받기

(사무자동화산업기사) 필기이론-3과목.pdf
0.27MB

PDF파일은 3과목 전체가 포함되어 있습니다

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday