프로그래밍 언어
프로그래밍 언어 개요
알고리즘
- 컴퓨터를 이용한 문제 해결 과정
- 알고리즘 작성 : 문제 해결 방법에 대한 풀이 과정
- 프로그램 작성 : 알고리즘을 컴퓨터가 이해할 수 있는 언어로 기술한 것
- 문제 정의와 분석 ->
[알고리즘 작성 -> 프로그램 작성]
(프로그래밍)
알고리즘의 중요성
- 프로그램의 성능과 알고리즘
- 스파게티 Code로 작성되면.. 코드를 이해하는 것이 힘들다..
- 모듈화시키고, 가독성 있게 유지보수성을 높이는 것이 중요하다.
100만명을 대상으로 각자가 낸 납세액이 전체 납세액에서 차지하는 비율은 얼마인가?
(1)
1. 100만 명의 납세액을 입력받는다. (1초)
2. 대상자의 납세액을 읽어온다. (1/100만 초)
3. 100만 명의 납세액 총액을 구한다. (100만 * 1/100만 초 + (100만 - 1) * 1/ 100만 초)
4. 2의 값을 총합으로 나누어 납세 비중을 구한다 (1/100만 초)
5. 아직 남은 대상자가 있으면 2~4의 과정을 반복한다.
총 소요시간 : 1 + (1/100만 + 2 + 1/100만) * 100만 = 약 200만 초
(2)
1. 100만 명의 납세액을 입력받는다. (1초)
2. 100만 명의 납세액 총액을 구한다. (100만 * 1/100만 초 + (100만 - 1) * 1/ 100만 초)
3. 대상자의 납세액을 읽어온다. (1/100만 초)
4. 3의 값을 2에서 계산한 값으로 나누어 납세 비중을 구한다 (1/100만 초)
5. 아직 남은 대상자가 있으면 3~4의 과정을 반복한다.
총 소요시간 : 1 + 2 + (1/100만 + 1/100만) * 100만 = 약 5초
1보다 2가 훨씬 효율적이다.
이 것이 알고리즘의 중요성이다.
프로그래밍 언어의 필요성
- 사람과 컴퓨터가 서로 의사교환을 하기 위함
- 사람이 컴퓨터에게 지시할 명령어를 기술하기 위함
- 주어진 어떤 문제를 해결하기 위해 인간과 컴퓨터 사이에서 의사소통을 가능하게 하는 인공적인 언어를 말함
프로그래밍 언어를 공부해야 하는 이유
- 효율적인 알고리즘을 개발할 수 있는 능력의 향상
- 현재 사용하는 프로그래밍 언어의 능력을 향상
- 주어진 과제를 해결하는 최적의 언어를 선택
- 새로운 언어를 쉽게 배울 수 있음
저급 언어와 고급 언어
- 기계에 친숙하면 저급 언어 (기계어, 어셈블리어) : 컴퓨터가 이해하기 쉬움
- 인간에 친숙하면 고급 언어 (Java, C++, BASIC) : 인간이 이해하기 쉽고 친근한 언어
저급 언어 (Low Level Language)
- 컴퓨터의 주기억장치, 레지스터, 마이크로프로세서, 입출력 포트등의 하드웨어를 직접 통제 가능함
- 저급 언어를 사용하기 위해서는 하드웨어에 대한 충분한 지식이 요구됨
- 고급 언어에 비하여 언어 자체가 어렵기 때문에 전문가라 하더라도 프로그램의 생산성이 낮음
기계어 | 어셈블리어 |
---|---|
* 0과 1로 표현 * 컴퓨터가 직접 이해할 수 있는 유일한 언어 * 연산 코드와 피연산자로 구성 * 프로그래밍 하기가 상당히 어려움 * 컴퓨터 하드웨어에 대한 강력한 통제가 가능 |
* 복잡한 기계어를 간략하게 기호화함 * 기계어의 연산코드와 피연산자를 프로그래머가 이해하기 쉬운 기호형태로 일대일 대응시킨 언어 * 하드웨어 장치에 대한 강력한 통제 가능 |
순서 | 기계어 | 어셈블리어 | 의미 |
---|---|---|---|
명령어1 | 0101000000000100 | LDA A | 메모리 A의 내용을 누산 레지스터(AC)에 저장 |
명령어2 | 0111000000000110 | ADD A | 메모리 B의 내용과 누산 레지스터(AC)의 값을 더하여 누산 레지스터 (AC)에 다시 저장 |
명령어3 | 0100000000000111 | STA C | 누산 레지스터(AC)의 값을 메모리 C에 저장 |
명령어4 | 0011000000000000 | HLT | 프로그램 종료 |
고급 언어 (High Level Language)
- 우리가 알고 있는 그 것
- 웹 이벤트제어 : Javascript
- 시스템 프로그래밍 : C
- 범용 및 인터넷 프로그램 : Java
프로그램 구현
프로그램이란?
- 컴퓨터에서 특정 목적의 작업을 수행하기 위해 관련된 명령어와 자료를 모아 놓은 것
- 컴퓨터에게 지시할 일련의 처리 작업 내용을 담고 있음
- 컴퓨터에서 특정 목적의 일을 수행하는 프로그램을 만드는 과정을
프로그래밍한다
라고 표현
프로그래머
- 프로그래머 (Programmer) : 프로그램을 만드는 사람
- 개발자 (Developer) : 넓은 의미로, 개발에 참여하는 사람
프로그램 개발 환경
-
개발도구
- 편집기 (Editor)
- 프로그램 명령어인 프로그래밍 언어의 내용을 편집하는 편집기
-
컴파일러
- 개발 도구에서 가장 중요한 것은 작성한 고급 프로그래밍 언어를 컴퓨터가 이해할 수 있게 기계어로 변환
-
디버거
- 작성된 프로그램에서 발생하는 프로그램 오류를 쉽게 찾아 수정할 수 있도록 도와주는 프로그램
-
링커
- 여러 목적 파일을 하나의 실행 파일로 만들어 주는 기능
통합 개발 환경 (Intergrated Development Environments)
프로그램을 개발하는데 필요한 컴파일러, 디버거, 링커, 에디터 등을 통합적으로 제공하는 개발 환경 (Visual C++, Eclipse등..)
프로그램 구현 과정
소스작성 : 프로그램 언어를 이용하여 원하는 작업을 기술한 내용을 소스코드(Source Code) 또는 간단히 코드(Code)라 함
컴파일러 : 소스(Source)파일(원시파일)을 목적파일(Object File)로 만들어주는 프로그램
어셈블러 : 어셈블리 언어의 프로그램을 기계어로 변환
링커 : 목적 파일을 실행 가능한 실행 파일로 만들어주는 프로그램
원시 코드에서 실행파일이 되어 실행되는 과정
원시코드 => (어셈블러, 컴파일러, 인터프리터) => 목적코드 => (링커) => 실행파일 => (로더) => 메모리 => 실행파일
디버거 (Debugger)
- 프로그램의 명령을 수행함에 있어 컴퓨터의 상태를 보여주거나 오류(또는 에러)발생시 오류를 쉽게 찾을 수 있도록 도와주는 프로그램
에러 또는 오류
- 컴파일(시간) 에러, 실행(시간) 에러
디버깅 (Debugging)
- 컴파일 에러나 실행 에러를 수정하는 과정
인터프리터 (Interpreter)
- 고급 언어를 기계어로 번역해주는 역할을 수행
- 원시 코드를 한 줄씩 읽어 들여 목적 코드로 바꾸어 줌
- 컴파일러에 비해 번역 속도가 느릴 수 밖에 없지만, 프로그램을 작성할 때보다 융통성을 가질 수 있음
컴파일러 (Compiler)
- 원시 코드 전체를 읽은 다음 이를 기계어로 번역
- 컴파일러는 한 번 컴파일한 후에는 수정이 없다면 매번 컴파일 할 필요 없이 빠른 시간 내에 프로그램 실행이 가능
인터프리터 | 특징 | 컴파일러 |
---|---|---|
실행되는 줄(라인)단위 번역 | 번역 방법 | 프로그램 전체 번역 |
번역 과정이 비교적 간단하고 대화형 언어에 편리함 | 장점 | 한 번 컴파일 한 후에 매번 빠른 시간 내 전체 실행 가능 |
실행할 떄마다 매번 기계어로 바꾸는 과정을 다시 수행해야 하기에 항상 인터프리터가 필요함 | 단점 | 프로그램 일부를 수정하는 경우에도 전체 프로그램을 다시 컴파일 해야 함 |
즉시 실행 | 출력물 | 목적 코드 |
BASIC, Javascript | 언어 | C, COBOL.. |
컴파일러와 인터프리터의 특징을 모두 갖는 방식
자바 언어와 C# 언어
- 컴파일러가 존재하여 컴파일 과정이 필요함
- 컴파일된 실행 파일을 실행할 때는 인터프리터 방식과 같이 인터프리터가 필요함
- 모든 시스템에서 독립적인 프로그램 언어를 개발하기 위함
고급 프로그래밍 언어 종류
포트란 (FORTRAN)
- FORmula TRANslating system
- 과학과 공학 및 수학적 문제들을 해결하기 위해 1950년대 중반에
IBM 704 컴퓨터 시스템에 이용할 목적으로 IBM의 존 배커스 (John Backus)에 의해
고안된 제3세대 프로그래밍 언어
코볼 (COBOL)
- COmmon Business Oriented Language
- 코볼은 포트란에 이어 두 번째로 개발된 고급언어
- 기업의 사무처리에 적합한 프로그래밍 언어로 개발
- 장점은 컴파일러만 있으면 컴퓨터 기종에 관계없이 사용가능, 작성이 쉽고 이해하기 쉬움
- 단점은 양이 많고 길어서 용량이 크고 프로그램 작성이 불편하다.
파스칼
- 교육용으로 제작된 프로그래밍 언어이기 때문에 모든 명령어가 갖추어져 있음
- 제어 구조(조건문)가 있어 구조적 프로그래밍에 적합
BASIC
- 초보자도 쉽게 배울 수 있도록 만들어진 대화형 프로그래밍 언어
- 200여개의 명령어들로 구서오딘 가장 쉬운 대화형 프로그래밍 언어
- 1980년도에 PC의 출현으로 기본 개발 언어로 탑재되어 범용적 사용
- 장점은 초보자가 배우기 좋다.
- 단점은 객체 지향 기능이 C#, JAVA등에 비해 약함
C
- 켄 톰슨이 개발한 B 언어에서 발전된 언어
- 시스템 PDP-11에서 운용되는 운영체제 유닉스를 개발하기 위한 시스템 프로그래밍 언어로
미국전신전화국인 AT&T의 벨 연구소의 데니스 리치가 개발
C++
- C 언어에서 발전된 언어
- 객체지향 프로그래밍을 지원하기 위해 C언어가 가지는 장점을 그대로 계승하면서
객체의 상속성(inheritance) 등의 개념을 추가한 효과적인 언어
C언어 계열의 장점과 단점
- 어셈블리어 같은 저급 언어와 유사한 기능을 포함함
- 구조적 프로그래밍 기능이 있어 프로그램 읽기와 작성이 쉬움
- 프로그램의 융통성과 이식성이 상대적으로 뛰어남
- 기존 C언어로 개발된 프로그램들을 거의 수정없이 C++ 언어로 확장할 수 있으므로
대부분의 운영 체제에서 사용할 수 있음 - 전 세계의 수많은 C 프로그래머들이 자연스럽게 C++ 프로그래머로 전환이 가능하여
전문 인력 부족 문제를 해결 가능
JAVA
- C++의 강력함을 제공하면서도 규모는 더 작고 안전성은 강화된 언어
- 웹 환경에 적합하며, 월드 와이드 웹의 보급 확대와 보조를 맞춰 발전
- 간단하며 친숙한 언어
- 객체지향 언어
- 견고하고 보안에 강함
- 플랫폼에 독립적
- 동적 링킹
- 멀티스레드 지원
- 자바 가상 기계는 바이트코드가 실행될 수 있도록 돕는 가상 컴퓨터
프로그래밍 언어와 구성 요소
주석과 문장
주석
- 프로그램 언어의 문접에 관련 없이 프로그램 내부에 기술되는 부분으로,
프로그램을 설명하는 내용이나 기타 프로그래머가 기술하고 싶은 내용
문장
- 문장이 모여서 하나의 프로그램이 만들어지므로,
프로그램 언어에서 일을 수행하는 문법상의 최소 단위 - C, JAVA : 문장의 끝을 ;(세미콜론)으로 표시
- BASIC : 한 줄에 하나의 문장을 기술
블록
: 여러 문장의 모임
변수
- 프로그램에서 임시로 자료 값을 저장할 수 있는 저장 장소
- 대부분의 언어에서 변수는 반드시 사용하기 이전에 먼저 선언을 해야 함
- 이 선언은 시스템에게 적당한 공간을 메모리에 확보하라는 것을 의미함
- 언어에 따라 할당하려는 값의 타입마다 다른 변수 키워드를 사용
- C 언어에서 선언된 변수에 저장 값을 수정하려면 “=” 기호의 대입연산자를 이용함
제어 구조
- 프로그램 언어에서 프로그램의 실행 순서를 결정하는 주요 구문의 구조
- 순차 구조, 선택 구조, 반복 구조
순차 구조
- 위에서 아래 순서로 문장을 실행하는 구조
선택 구조
- 주어진 조건이 만족되는 경우와 그렇지 않은 경우의 처리 내용을 달리 처리하고자 할 때 사용
반복 구조
- 어떤 일을 반복적으로 수행할 때 이용되는 구문의 구조
객체지향 프로그래밍
객체지향 개요
- 1960년대 말에 시뮬라라는 프로그램 언어에서 처음 소개됨
- 객체지향은 많은 분야에서 발전됨
- 프로그램 언어, 소프트웨어 개발 방법론, 데이터베이스
객체
- 현실 세계의 사물이나 개념을 시스템에서 이용하기 위해 현실 세계를
자연스럽게 표현하여 손쉽게 이용할 수 있도록 만든 소프트웨어 모델
객체지향의 특징
- 추상화 (Abstraction) : 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 상속성 (Inheritance) : 상위 개념의 특징을 하위 개념이 물려 받는 것
- 캡슐화 (Encapsulation) : 데이터 구조와 데이터를 다루는 방법들을 결합시켜 묶는 것
- 다형성 (Polymorphism) : 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 사용되는 것
객체의 구성
- 속성 (Attributes, Propertieis) : 객체의 특성을 표현하는 정적인 성질
- 행동 (Message, Behaviors) : 객체 내부의 일을 처리하거나 객체들 간의 서로 영향을 주고받는 동적인 일을 처리하는 단위
프로그램 방식에 따른 언어의 분류
-
절차지향 언어
- 전체 과정을 나누어 처리하는 단위를 함수라 함
- 문제를 여러 개의 작은 함수로 나누어 그 문제를 해결함
- 절차지향이 동사 중심의 프로그래밍 방식
-
객체지향 언어
- 명사 중심의 프로그래밍 방식
- 문제를 구성하는 객체를 만들어 이 객체들 간의 메시지 교환으로 문제를 해결
- 객체는 자료와 일련의 처리 명령을 하나로 묶어 놓은 메소드로 구성되는 프로그램 단위로
함수보다 높은 수준의 모듈화 방법이라 할 수 있음