1. 프로그래밍 언어 활용의 개요
- 프로그래밍 언어란 컴퓨터 시스템을 동작 시키기 위한 프로그램 작성 언어를 말한다
- 프로그램은 다소 단순해 보이는 명령어들의 조합으로 구성되는데, 이러한 조합들을 비트(Bit)라고 불리는 0과 1의 값으로 작성되거나 변환되어 컴퓨터가 이해할 수 있도록 한다.
01. 비트(Bit)
- 비트는 컴퓨터를 이해하기 위한 가장 기본적인 용어로, Binary Digit의 약칭이다.
- 0과 1로만 구성된 이진법(ex. 101001)을 이용하며, 컴퓨터 이용 시 흔히 접할 수 있는 1바이트(Byte)는 8비트(Bit)를 의미한다

02. 프로그램의 구성 요소
(1) 자료구조
- 자료 구조는 컴퓨터에 데이터를 삽입, 삭제, 수정하게 해주는 논리적인 공간 구조를 의미하며, 자료의 형태에 따라 단순 구조, 선형 구조, 비선형 구조, 파일 구조로 분류할 수 있다
(2) 알고리즘
- 알고리즘은 넓은 의미에서 자료 구조와 함께 프로그램을 구성하는 요소를 의미하며, 좁은 의미에서는 어떤 문제에 대한 답을 찾는 해법을 의미
2. 용어 정의
- 프로그래밍을 위한 대표적인 용어로 변수, 바인딩, 데이터 타입 등이 있으며, 데이터 타입을 변수에 적용하기 위해서는 다음용어에 대한 이해가 필요하다
01. 변수
- 어떤 값을 주 기억 장치에 기억하기 위해서 사용하는 공간을 의미한다
02. 식별자
- 프로그램의 구성 요소를 구별하기 위한 기준으로 변수명이 식별자에 속한다
03. 바인딩
- 변수와 변수에 관련된 속성을 연결하는 과정으로 정적 바인딩과 동적 바인딩으로 구분된다
(1) 정작 바인딩
- 프로그램 실행 시간 전에 속성을 연결하는 방식이다
(2) 동적 바인딩
- 프로그램 실행 시간에 속성을 연결하는 방식이다
04. 선언
- 변수에 이름, 데이터 타입 등의 속성을 부여하는 작업으로, 명시적 선언과 묵시적 선언으로 구분된다
(1) 명시적 선언
- 선언문을 이용하여 변수 이름을 나열하고 속성을 부여하는 방식이다
(2) 묵시적 선언
- 별도의 선언문 없이 디폴트 규칙에 의해 속성이 부여되는 방식
05. 영역
- 이름이 사용되는 범위를 의미하여, 정적 영여과 동적 영역으로 구분된다.
(1) 정적 영역
(2) 동적 영역
- 변수를 찾을 때 구조보다는 순서에 기반하는 방식
06. 할당
07. 데이터 타입
- 변수가 가질 수 있는 속성값의 길이 및 성질을 의미한다
08. 연산자
- 데이터 처리를 위해 연산을 표현하는 기호로 +, -등과 같은 연산자를 포함한다
09. 명령문
- 프로그램을 구성하는 문장으로, 지시 사항을 처리하는 단위를 의미한다
3. 연산자
- 연산자는 프로그램 실행을 위해 연산을 표현하는 기호로, 프로그램 내에서는 +, -와 같은 연산자가 사용된다
- 연산자에는 산술 연산자, 시프트 연산자, 관계 연산자, 논리 연산자 등이 있으며, 각 연산자는 다음과 같은 종류를 가진다
01. 산술 연산자(Arithmetic Operator)
- 산술 연산자는 +, -와 같이 가장 일반적으로 사용되는 연산자이다.

02. 시프트 연산자(Shift Operator)
- 시프트 연산자는 비트를 이동시키는 연산자이다

03. 관계 연산자(Relation Operator)
- 관계 연산자는 두 피연산자 사이의 크기를 비교하는 연산자이다

04. 논리 연산자(Logic Operator)
- 논리 연산자는 두 피연산자 사이의 논리적인 관계를 정의하는 연산자이다

05. 비트 연산자(Bit Operator)
- 비트 연산자는 0과 1의 각 자리에 대한 연산을 수행하며, 0 또는 1의 결과값을 가진다

4. 명령문
- 명령문은 프로그램을 구성하는 문장으로, 지시 사항을 처리하는 단위이다.
- 기본적인 문법들의 종류가 매우 많은 것은 아니며, 각 언어마다 유사한 문법 체계를 사용한다
- 기본적인 명령어로는 조건문과 반복문이 있는데, 각가의 유형은 다음과 같다
01. 조건문
- 조건문은 조건의 참, 거짓 여부에 따라 실행 걍로를 달리하는 if문과 여러 경로 중에 하나를 선택하는 case문, switch문으로 구분한다

- if문의 경우에는 단순 if문, 중첩 if문의 유형으로 구분할 수 있다.
- 단순 if문은 어떤 문장을 수행할지 여부를 결정할 때 사용하며,
- 선택 if문은 경로를 선택할 때 사용한다
- 중첩 if문은 수행 결로가 2개가 넘어갈 때 사용하는데, else 구문을 추가하여 작성할 수 있다
- else 구문은 조건식이 거짓인 경우에 수행되는 구문으로, 프로그래밍 언어마다 차이가 있으나 else if와 같은 방식으로 분기를 추가할 수 있다
- case문은 다중 if문과는 다르다
- if문은 살술 또는 논리적으로 비교가능하나 case는 조건이 동일한지의 여부만 확인한다
02. 반복문
- 반복문은 특정 부분을 조건이 만족할 때까지 실행하도록 하는 명령문으로 while문과 for문, do문이 있다

- 반복문을 사용할 때 특별한 조건이 없으면 무한 처리를 반복하게 된다
- 이를 무한 루프라고 하며, 무한 루프를 방지하기 위해 break와 continue를 사용할 수 있는데, break는 반복문을 중지하도록 하는 명령어이고, continue는 다음 반복으로 넘어갈 수 있도록 하는 명령어이다
5. 사용자 정의 자료형 개요
- C/C++, JAVA와 같은 프로그래밍 언어에서는 사용자가 직접 자료형을 만드는 것이 가능하다
- 이렇게 직접 만드는 자료형을 사용자 정의 자료형이라고하며, C++의 경우 열거체, 구조체, 공용체로 구분하여 사용자 정의 자료형의 작성이 가능하다
- 열거체
- 괄호안에 연속적인 값이 들어가는 자료형이다
- 특정 값을 넣어 주지 않으면 1씩 늘어나기 때문에 상수 배열이라고 부르기도 한다

- 구조체
- 괄호 안에 멤버 변수를 사용하는 자료형이다
- 내부에 멤버 변수 자료형을 마음대로 선언할 수 있으며 멤버 함수의 작성도 가능하다

- 공용채
- 구조체와 거의 유사하나 조금 더 범주가 크다고 볼 수 있다
- 열거체나 구조체와 달리 공용체명을 작성하여야 하며, 구조체를 멤버로 사용할 수 있다

6. 추상화와 상속
- 사용자 정의 자료형은 추상화 상속의 개념을 이용한다
- 추상화와 상속에 대한 내용은 다음과 같다
- 추상화
- 복잡한 문제의 본질을 이해하기 위해 세부 사항은 배제하고 중요한 부분을 중심으로 간략화하는 기법으로 기능 추상화, 자료 추상화, 제어 추상화로 구분할 수 있다

- (1) 기능 추상화
- 입력 자료를 출력 자료로 변환하는 과정을 추상화하는 방법이다
- (2) 자료 추상화
- 자료와 자료에 적응할 수 있는 오퍼레이션(Operation)을 함께 정의하는 방법이다
- (3) 제어 추상화
- 외부 이벤트에 대한 반응을 추상화하는 방법이다
- 상속과 구체화 상속
- 상속은 상위 수준 그룹의 모든 특성을 하위 수준 그릅이 이어받아 재사용 또는 확장하는 특성을 의미하고, 구체화란 하위 수준 그룹이 상위 수준 그룹의 추상적인 부분을 구체화시키는 것을 의미한다
- 단일 상속과 다중 상속이 있으며, 상위 수준의 그룹이 하나만 존재할 때 이를 단위 속성이라고 부른다

7. 프로그래밍 언어의 언어별 특성
- 프로그래밍 언어는 컴퓨터 시스템의 역사와 함께하고 있으며 프로그래밍 언어가 개발된 시대적인 패러다임에 따라 유사한 특성을 가지고 있다
- 프로그래밍 언어의 발전 과정과 각 언어별 특성은 다음과 같다
01. 프로그래밍 언어의 발전 과정
- 프로그래밍 언어는 1940년 대 컴퓨터의 발전과 함께 발전하였다
- 세계 최초의 프로그래밍은 내장 방식의 프로그램으로, 이후에 현재까지 지속적으로 발전하고 있다

02. 프로그래밍 언어별 특성
- 프로그래밍 언어는 각각의 특성들을 가지고 있으며, 주요 내용은 다음과 같다
-1. FORTRAN
- 1954년에 초기 버전이 개발된 언어로 시스템 의존적이고, 프로그램 작성을 위해서는 컴퓨터 시스템 관련 지식이 많이 필요하다는 특징을 가지고 있다
- 1977년 FORTRAN77이 등장하였으나 그 이후에 등장한 언어와 비교하여 자료 구조가 제한적이었다
- 재귀 함수, 구조체, 포인터 등은 제공되지 않았으며, FORTRAN90이 등장하고 나서야 포함되었다
-2. COBOL
- 1960년에 미국 국방성에 의해 개발되었다
- 단순한 입출력 구현 시에도 많은 형식적인 문장이 필요하며, 비교적 프로그램 크기가 크고 구분이 복잡하다.
- 순차적 방식의 언어로 웹 응용 프로그램과 쉽게 통합할 수 있다는 점이 유용하며, 자료 구조의 선언 부분과 프로그램의 실행 부분을 분리하였다는 특징이 있다
- FORTRAN과 마찬가지로 대문자로만 작성된다
-3. PASCAL
- 1971년 개발되어 1980년대 말까지 많이 쓰인 언어이다
- 잘 짜인 구조와 간결성으로 인해 프로그래밍 언어로써 성공하였으나, 분리 컴파일과 문자열의 적절한 처리 등을 제공하지는 못하였으나, 분리 컴파일과 문자열의 적절한 처리등을 제공하지는 못하였다
- 사용자 정의 추상화 기능은 제공하나 정보 은닉 기능이 없어 현재의 프로그래밍 기법을 적용하기에는 다소 부족하다는 단점을 가지고 있다
-4. C
- 1972년에 개발된 언어로, UNIX 운영체제 구현에 사용되는 언어이다.
- 범용 언어로 개발되었으나 문법의 간결성, 효율적 실행, 효과적인 포인터 타입 제공이라는 특징으로 인해 가장 많이 사용되는 시스템 프로그래밍 언어가 되었다
-5. C++
- C언어를 발전시킨 언어로 클래스, 상속 등을 제공하는 객체지향 프로그래밍 언어이다
- 대형 프로젝트 수행 시 모듈별 분리가 가능하여 개발과 유지 관리에 적합하다
-6. JAVA
- C++에 비해 단순하고 분산 환경 및 보안성을 지원한다.
- JAVA 언어는 컴파일을 거쳐야 하며, 컴파일을 통해 생성된 class 파일을 가상 머신을 통해 실행하여야 한다
-7. JAVASCRIPT
- 1995년에 개발된 객체 지향 스크립트 언어로 웹 페이지 동작을 구현할 수 있다
- 빠른 시간에 코드를 완성할 수 있고 확장성이 좋으며 배우기 쉽다는 장점이 있으나, 보안이 나 성능이 다른 언어에 비하여 부족하다는 단점이 있다
-8. PERL
- 텍스트 처리에 주안점을 두고 개발된 인터프리터 언어로 CGI용으로도 많이 사용된다
- 변수를 명시적으로 선언할 필요가 ㅇ벗고, 모든 변수가 지정되지 않았을 경우에는 기본 초기값을 가진다
-9. PYTHON
- 배우기 쉽고 이식성이 좋은 언어로 최근 트렌드와 잘 맞는다
- 다양한 함수들도 많이 제공되어 스타트업과 글로벌 기업에서도 많이 사용한다
- PERL 언어처럼 인터프리터 언어이면서 객체 지향 언어, 스크립트 언어이다
-10. C#
- 2000년에 .NET환경에 맞춰 설계된 언어이다
- C와 C++의 발전된 형태로 VISUAL BASIC과 같이 사용자 인터페이스를 쉽게 만드는 컴포넌트 기능을 제공하기도 한다
- .NET환경에서 실행되기 때문에 ,NET 환경이 설치되어야하고, C# 컴파일러를 필요로 한다
-11. GOLANG
- 2009년 Google에서 만든 언어로 짧게 GO라고 부른다
- C언어와 직접적인 연관을 가지며, 내장 라이브러리가 많이 지원된다
- 대체로 C언어의 문법과 유사하나 if, for, switch를 포함한 제어 구조를 가지며, 하드웨어 사양이 낮더라도 빠른 컴파일이 가능하다는 특징을 가진다
-12. DART
- JAVASCRIPT와 JAVA의 영향을 받아 개발되었으며, 객체지향적인 언어이다
- 백그라운드에서 작송한다는 점에서 JAVASCRIPT와 차이를 가지고 있으며, JAVASCRIPT와 유사하나 단순화하였다
- 별도의 라이브러리 설치 없이 HTML 페이지를 수정할 수 있다는 특징을가진다
-13. CEYLON
- JAVA에 기반을 둔 언어로 모듈성을 주요 특징으로 가진다
- 코드를 패키지와 모듈로 정리하여 가상머신에서 컴파일을 수행하며, CEYLON Herd라는 저장소에서 모듈을 발행한다
8. 프로그래밍 언어의 유형 분류
- 프로그래밍 언어는 개발 편의성에 따라 저급 언어와 고급 언어로, 실행하는 방식에 따라 명령형, 함수형, 논리형, 객체지향형 언어로 구현 기법에 다라 컴파일 방식의 언어, 인터프리터 방식의 언어, 혼합형 언어로 분류할 수 있다.
01. 개발 편의성에 따른 분류
-1. 저급 언어
- 기계가 이해할 수 있도록 만들어진 언어로 기계어, 어셈블리어가 저급 언어에 속한다
-2. 고급 언어
- 개발자가 소스코드를 작성할 때 쉽게 이해할 수 있도록 작성딘 언어로 C, C++, JAVA 등이 고급 언어에 속한다
02. 실행하는 방식에 따른 분류
-1. 명령형 언어
- 컴퓨터에 저장된 명령어들이 순차적으로 실행되는 프로그래밍 방식으로 절차형 언어라고도 불리며, FORTRAN, COBOL, PASCAL, C 등이 명령형 언어에 속한다
-2. 함수형 언어
- 수학적 수식과 같은 함수들로 프로그램을 구성하여 호출하는 방식으로 LISP 등의 프로그래밍언어가 함수형 언어에 속한다
-3. 논리형 언어
- 규칙에 대한 활성화 조건이 만족되면 연관된 규칙이 실행되는 구조로, 추론과 관계 규칙에 의해 원하는 결과를 얻어 내는 방식이다
- PROLOG 등이 논리형 언어에 속한다
-4. 객체 지향 언어
- 객체 간의 메시지 통신을 이용하여 프로그래밍하는 방식으로, JAVA와 C++ 등이 객체 지향 언어에 속한다.
03. 구현에 기법에 따른 분류
-1. 컴파일 방식의 언어
- 고급 언어를 기계어로 번역하는 방식의 언어를 의미하며, FORTRAN, PASCAL, C, C++ 등이 컴파일 방식의 언어에 속한다
- 컴파일 방식은 실행에 필요한 정보가 컴파일 시간에 계산되어 실행 속도가 높다는 특징을 가지고 있다
-2. 인터프리터 방식의 언어
- 고급 언어 명령문을 하나씩 번역하고 실행하는 방식의 언어를 의미하며, BASIC, PROLOG, LIPS, SCOBOL 등이 인터프리터 방식의 언어에 속한다
-3. 혼합형 방식의 언어
- 고급 언어를 컴파일 하여 중간 언어로 변환한 후, 인터프리터에 의해 번역을 실행하는 방식의 언어를 의미하며 JAVA가 이에 속한다
9. 컴파일러와 인터프리터
- 고급 언어로 작성된 프로그램의 경우에는 컴퓨터 시스템이 바로 이해할 수 없기 때문에 번역을 필요로 하며, 컴파일러 또는 인터프리터를 이용해 번역을 수행한다
01. 컴파일러(Compier)
- FORTRAN, C 등과 같은 고급 언어를 기계어로 번역하는 도구로, 컴파일 방식의 언어는 모두 컴파일러를 필요로 한다
- 컴파일러는 프로그램의 한 종류로 볼 수 있다
02. 인터프리터(Interpreter)
- 프로그램 문장을 하나씩 번역하고 실행할 수 있도록 하는 프로그램이다
- 컴파일 과정이 없기 때문에 개발하는 과정에서 사용하면 유용하며, 인터프리터 방식의 언어는 모두 인터프리터를 필요로 한다
- 실행 속도가 느리고 메모리 사용이 비효율적이라는 단점이 있다
10. 객체지향 프로그래밍
- 프로그래밍은 크게 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 구분할 수 있다
- 이는 프로그래밍 언어 구조에 따라 구분한 것으로 객체지향 프로그램의 개념이 절차 지향 프로그래밍보다 뒤늦게 등장하였으나 절차 지향프로그래밍을 알아야 객체 지향 프로그래밍을 알 수 있는 관계는 아니다
01. 절차지향 프로그래밍과 객체지향 프로그래밍
- 절차지향 프로그래밍은 객체라는 개념이 등장하기 이전에 모듈, 변수, 함수를 사용하여 개발하는 방법이다
- 프로그램을 순차적으로 수행시키는 방법으로 자료 구조와 명령 중심으로 프로그램을 구성한다
- 객체지향 프로그래밍의 경우에는 객체와 객체 간의 통신을 통해 프로그램이 구현된다
- 객체와 속성, 메소드로 구성되는데 절차 지향에서의 모듈은 객체에 대응되고, 변수는 속성에 대응되며, 함수는 메소드에 대응된다
02. 객체지향 프로그래밍의 구성 요소
- 객체지향 프로그래밍은 객체, 클래스, 메시지를 이용하여 개발하는 방식으로, 각 구성 요소에 대한 내용은 다음과 같다
-1. 객체(Object)
- 개체, 속성, 메소드로 구성된 클래스의 인스턴스를 의미한다
-2. 클래스(Class)
- 객체의 타입을 정의하고 객체를 생성하는 틀을 의미한다
-3. 메시지(Message)
03. 객체의 구성 요소
- 객체는 현실 세계에서 개체(Entity)를 데이터 속성(Attribute)과 메소드(Method)를 결합 시킨 형태로 표현한 것을 의미하며, 각 구성 요소에 대한 내용은 다음과 같다
-1. 개체(Entity)
-2. 속성(Attribute)
- 자료 저장소 역할을 하며, 절차 지향 프로그래밍의 변수와 대응된다
-3. 메소드(Method)
- 호출 단위를 의미하며, 절차 지향 프로그래밍의 함수와 대응된다

04. 클래스(Class)
- 클래스는 객체 지향 프로그래밍에서 객체를 표현하는 추상 데이터 타입으로 객체를 생성하는 틀이다
- 기존 언어에서 지원하던 사용자 정의 자료형 및 서브프로그램의 개념을 발전시켜 JAVA, C++ 등에서 클래스를 통해 추상화된 자료형을 제공한다
11. 라이브러리(Library)
- 라이브러리는 효율적인 프로그램 개발을 위해 필요한 프로그램을 모아 놓은 집합체로서, 프로그래밍 언어에 따라 일반적으로 도움말, 설치 파일, 샘플 코드 등을 제공한다
01. 라이브러리의 개념
- 라이브러리란 영어로 도서관을 의미하며, 필요할 때 찾아서 쓸 수 있도록 ㅁㅗ듈화 되어 제공되는 프로그램을 말한다
02. 라이브러리의 구성
- 라이브러리는 도움말, 설치 파일, 샘플 코드 등으로 구성된다
-1. 도움말
- 라이브러리를 사용할 수 있도록 하는 도움말 문서이다
-2. 설치파일
- 라이브러리를 적용하기 위해 제공되는 설치파일이다
-3. 샘플 코드 : 라이브러리를 이해하고 손쉽게 적용하기위해 제공되는 샘플 소스코드이다
12. 표준 라이브러리와 외부 라이브러리
01. 표준라이브러리
- 표준 라이브러리는 프로그래밍 언어가 기본적으로 가지고 있는 라이브러릴 의미한다
- 각 프로그래밍 언어의 표준 라이브러니는 여러 종류의 모듈과 패키지를 가지며 표준 라이브러리를 이용하여 별도의 파일 설치 없이 날짜와 시간 등의 기능을 이용할 수 있다
02. 외부 라이브러리
- 외부라이브러리는 표준라이브러와 달리 별도의 파일을 설치하여야 한다
- 외부라이브러리는 누구나 개발하여 설치할 수 있으며, 인터넷 등을 이용하여 공유할 수도 있다
13. 모듈(Module)과 패키지(Package)
- 라이브러리는 모듈과 패키지를 총칭하며, 모듈이 개발 파일이라면 패키지는 파일들을 모아 놓은 폴더라고 볼 수 있다
01. 모듈(Module)
import (모듈명)
02. 패키지(Package)
- 여러 개의 모듈을 한개의 폴더에 묶어서 기능을 제공한다
- 패키지 명과 모듈명을 import 하여 불러올 수 있다
import (패키지 명).(모듈명)