"프로그래밍"의 두 판 사이의 차이
(새 문서: '''컴퓨터 프로그래밍'''이란 알고리즘을 특정한 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술이다. ==개요==...) |
잔글 |
||
(사용자 5명의 중간 판 72개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | ''' | + | [[파일:프로그래밍1.jpg|썸네일|350픽셀|'''[[프로그래밍]]'''(Programming)]] |
+ | [[파일:프로그래밍.jpg|썸네일|1000픽셀|'''[[프로그래밍]]'''(Programming)]] | ||
− | + | '''프로그래밍'''(programming)이란 [[프로그램]]을 짜는 행위를 말한다. 즉, 수식 또는 작업을 [[컴퓨터]] 처리 방식에 맞게 정리하여 순서를 정하고, 특유의 [[명령어]]로 고쳐 쓰는 작업이다. '''컴퓨터 프로그래밍'''(computer programming)이라고 한다. | |
− | 프로그램 | ||
− | |||
− | == | + | == 개요 == |
− | + | 프로그래밍이란 [[프로그램]] 작성에 관한 전반적인 사항, 즉 프로그램의 설계, [[코딩]], [[테스트]], [[디버깅]] 등 프로그램의 설계를 시작해서 완전한 프로그램이 작성될 때까지의 일련의 작업을 말한다. 명령 코드를 쓰는 작업은 [[코딩]]이라고 하는데, 컴퓨터가 처음 나타난 초기까지의 프로그래밍은 숫자를 나열한 명령코드를 쓰는 [[기계어]]였다. 그러나 기계어는 틀리기 쉽고, 또한 틀린 곳을 발견하기가 어렵다는 단점이 있어서 인간이 외우기 쉬운 언어·수식 등을 사용해 프로그램을 쓰고, 그것을 컴퓨터에 넣어서 컴퓨터가 자신의 명령코드로 고쳐 계산을 실시하는 방식이 고안되었다.<ref>〈[https://terms.naver.com/entry.nhn?docId=1159441&cid=40942&categoryId=32837 프로그래밍]〉, 《네이버 지식백과》</ref> | |
− | |||
− | |||
− | |||
− | 절차적 프로그래밍 | + | == 역사 == |
− | 이 방식이 등장하기 전에는 다른 사람이 만든 코드를 이용하는 것이 쉬운 일이 아니었다. 각 코드를 기능별로 객체화해서 완성해 두었기 때문에 보다 많은 코드들이 재사용될 수 있게 되었고 이는 | + | [[컴퓨터]]의 [[인스트럭션]]은 0과 1로 이루어져 있다. 이런 형태의 인스트럭션을 [[기계어]]라 한다. 0과 1은 컴퓨터 내부의 전기 신호 중 하나로 0또는 1 중 하나의 값을 갖는다고 해서 ‘이진’이라고 한다. 그리고 그 값을 [[비트]]라고 한다. |
+ | |||
+ | * '''1940년~50년대''' : 컴퓨터의 기판 상에 있는 작은 전선들을 조작해서 연결이 이루어진 곳은 1을, 연결이 없는 곳은 0을 나타나게 해놓았고, 이 전선 연결의 조합이 당시의 프로그래밍이었다. 이런 형태의 배선은 만드는 데 아주 오랜 시간이 걸리고, [[에러]]가 발생했을 때 찾아내는 것이 거의 불가능했다. | ||
+ | |||
+ | * '''1950~60년대''' : 컴퓨터 [[메모리]] 내의 값을 이용하여 프로그래밍을 하기 시작했다. 빠른 프로그램 수정을 가능하게 해주었지만 수많은 0과 1로 이루어진 패턴과 싸움하는 것은 예전과 마찬가지였다. 사람들은 보다 쉽게 기억하기 위해 비트 패턴 대신 일종의 약어를 사용하기 시작했다. 약어는 비트 패턴의 기능 설명으로부터 만들어진 용어로 [[어셈블러]](assembler)라 불리우는 프로그램에 의해 이진수 패턴 형태로 바뀐다. 이렇게 축약어로 일어진 언어를 [[어셈블리어]](assembly language)라고 한다. | ||
+ | |||
+ | * '''1970~-80년대''' : 프로그래밍 분야에 [[절차적 언어]]가 유행하게 된다. 대표적인 절차적 언어는 [[파스칼]](Pascal)과 [[C 언어]]이다. 이 언어가 등장하기 전의 프로그램은 [[코드]]를 길게 늘어뜨려, 프로그램 내의 각 파트를 구분지어 주는 어떤 경계도 없었다. 때문에 프로그래밍 중 어느 한 곳에서 다른 곳으로 이동하려면, 긴 코드 전체를 뒤져서 이동하는 과정을 거쳐야 했다. 절차적 언어는 이를 보안하여 코드를 몇 개의 단위로 구분지어 주었다. 절차적 언어가 등장하기 전에도 [[프로시저]](procedure)가 존재하기는 했지만 절차를 표준화하고 보다 예측 가능한 형태로 쓰일 수 있게 보편화된 것은 절차적 언어 등장 이후이다. | ||
+ | |||
+ | * '''1980년대 이후''' : 절차적 프로그래밍 이후에는 [[객체 지향 프로그래밍]]이 등장하였다. 최초의 객체 지향 프로그래밍 언어는 1960년에 개발된 [[시뮬라]](Simula)였으나 거의 주목을 받지 못하였다. 1983년 미국 [[AT&T]] [[벨 연구소]]의 [[비야네 스트롭스트룹]]이 [[C++]] 언어를 개발함으로써 객체 지향 언어가 널리 확산되었다. | ||
+ | |||
+ | : 객체 지향은 코드를 절차로 그룹짓는 것에서 한 걸음 더 나아가 절차를 또 다시 객체로 그룹짓는 것이다. '''[[객체]]'''(object)는 특정 작업을 수행해 주는 코드뿐만 아니라 그 작업에서 다루는 모든 데이터도 포함한다. 객체 지향 방식에서는 모든 코드를 그 코드가 다룰 데이터와 함께 묶어 객체로 구분해서 독립시켰다. 각 객체는 오직 자신의 데이터만을 바꿀 수 있고, 다른 객체의 데이터는 변경시킬 수 없다. 한 객체의 데이터에 문제가 생긴다면 그 객체 안의 코드만 살펴보면 된다. 이 방식이 등장하기 전에는 다른 사람이 만든 코드를 이용하는 것이 쉬운 일이 아니었다. 각 코드를 기능별로 객체화해서 완성해 두었기 때문에 보다 많은 코드들이 재사용될 수 있게 되었고 이는 프로그래밍 작업의 생산성 증가와 비용 감소로 이어졌다. | ||
+ | |||
+ | == 종류 == | ||
+ | === 웹 프로그래밍 === | ||
+ | World Wide Web(WWW)의 통신 규약에 따라 컴퓨터 간에 데이터를 주고 받는 네트워크 프로그램이다.<ref>삼도다, 〈[https://samdo0812.tistory.com/12 (Web) Web Programming이란?]〉, 2018-04-06</ref> | ||
+ | 웹 프로그래밍은 기본적으로 클라이언트/서버 방식으로 주고받는 형태를 갖게 된다. 클라이언트가 특정 페이지를 웹서버에 요청하게 되면 웹 서버가 이를 처리한 후 결과를 클라이언트에게 응답을 하게 되는 구조이다.<ref>Titus '열정의 공간〈[https://titus94.tistory.com/3 웹프로그래밍]〉, 2016-07-26</ref> | ||
+ | |||
+ | === 멀티 프로그래밍 === | ||
+ | 하나의 처리 장치에 의해서 둘 이상의 컴퓨터 프로그램을 교대로 배치하여 실행하는 기능을 갖춘 조작 형태이다. 하나의 컴퓨터로 복수 개의 프로그램을 겉보기로 동시에 실행하는 것이며, 멀티 프로그래밍의 목적은 처리 장치, 기억 장치, 입출력 장리, 채널 등의 컴퓨터 자원을 병렬적으로 사용하여 시스템 전체의 사용 효능을 높이는 것이다. | ||
+ | |||
+ | '''장점''' : 동시에 여러 프로그램을 실행할 수 있어 처리 능력이 좋음 | ||
+ | |||
+ | '''단점''' : 여러 프로그램을 관리하기 때문에 운영체제의 구조가 복잡 | ||
+ | |||
+ | === 모듈 프로그래밍 === | ||
+ | 프로그램을 모듈화하여 독립성을 갖게 함으로써 다른 모듈에 영향을 받지 않고 모듈의 일부 개량이나 재번역을 가능하게 하는 프로그래밍 기법이다. 각 모듈인 기능이나 서브루틴은 국소적 변수를 써서 독립성을 높이고 있으며, 통합된 기능별로 모듈화 한다. 모듈러 프로그램 작성의 목적은 크고 복잡한 프로그램을 유지를 쉽게 하고, 신뢰성을 높이는 것이다. 모듈러 프로그래밍에서 중요한 점은 하나의 모듈은 한 가지 일만 하도록 작성해야 한다는 것이다. 이런 프로그램이 유지보수 또한 간편하다. 모듈은 오직 한 개의 상태만 가질 수 있는데, 일반적인 기능을 하는 프로시져를 다른 하나의 모듈로 묶어서 각각의 모듈이 독립적인 데이터를 가질 수 있도록 한다. 이 말은 모듈 내의 프로시져가 호출됨으로써 생기게 되는 변경사항에 대해 해당 모듈이 이를 관리할수 있다라는 말이며 독립성을 지니고 있다. | ||
+ | |||
+ | === 마이크로프로그래밍 === | ||
+ | 1951년, 모리스 월크스는 마이크로프로그래밍이라는 용어를 만들었다.<ref name="마이크로코드">〈[https://ko.wikipedia.org/wiki/마이크로코드 마이크로코드]〉, 《위키백과》</ref> 마이크로프로그래밍, 이를테면 마이크로코드는 CPU 안에 기계어를 상대적으로 쉽게 추가할 수 있도록 이용하는 빙속으로 다른 방식들에 비해 하드웨어를 덜 사용한다. 매우 상세하면서도 기초가 되는 가장 낮은 수준에 루틴의 모임이며 이러한 루틴은 특정한 명령어를 수행하는 데 필요한 동작들을 제어하고 나열한다. 또, 이따금씩 이들을 해석하기도 한다. 그러므로 일련의 마이크로 명령어가 추가한 기계어는 인터프리터가 기계어를 사용하여 고급 프로그래밍 언어의 명령문을 추가하는 방식과 비슷하다고 볼 수 있다.<ref name="마이크로코드"></ref> | ||
+ | ==== 수직적 마이크로 프로그래밍 ==== | ||
+ | 마이크로 명령어의 연산 필드에 적은 수의 코드화된 비트들을 포함시킴으로써 제어 기억 장치의 용량을 줄이고, 해독기를 이용하여 그 코드를 필요한 수 만큼 제어 신호들로 확장하는 방식이다. 마이크로 명령의 비트 수가 감소하는 장점이 있지만, 해독 시간 만큼의 지역 시간이 발생하는 단점도 있다. | ||
+ | ==== 수평적 마이크로 프로그래밍 ==== | ||
+ | 연산 필드의 각 비트와 제어신소를 1:1로 대응시켜서, 그 수 만큼의 비트들로 이루어진 마이크로 명령어를 사용하는 방식이다. 마이크로 명령어 비트 수가 길기 때문에 더 큰 용량의 제어 기억장치가 필요하다는 단점이 있다. 하지만 하드웨어가 간단하며, 해독에 따른 지연 시간이 없다라는 장점을 지니고 있다. | ||
+ | |||
+ | === 구조적 프로그래밍 === | ||
+ | 구조적 프로그래밍(structured programming)은 구조화 프로그래밍으로도 불리며 프로그래밍 패러다임의 일종인 절차적 프로그래밍의 하위 개념으로 볼 수 있다. GOTO문을 없애거나 GOTO문에 대한 의존성을 줄여주는 것으로 가장 유명하다. 대표적인 언어는 파스칼,C언어가 있다.<ref>〈[https://ko.wikipedia.org/wiki/%EA%B5%AC%EC%A1%B0%EC%A0%81_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 구조적 프로그래밍]〉, 《위키백과》</ref> | ||
+ | ==== 저수준 구조 ==== | ||
+ | 저수준 관점에서 구조적 프로그램은 간단하고, 계층적인 프로그램 제어 구조로 구성된다. 이 제어 구조들은 하나의 구문으로 간주되며, 동시에 더 간단한 구문들을 결합시키는 방법이다. 더 간단한 구문들은 또 다른 제어 구조일 수도 있고, 할당문이나 프로시저 호출과 같은 기본 구문일 수도 있다. 에츠허르 데이크스트라가 확인한 3가지 형태의 구조는 순차, 선택, 반복이다.<ref>〈[https://ko.wikipedia.org/wiki/에츠허르_데이크스트라 에츠허르 데이크스트라]〉, 《위키백과》</ref> | ||
+ | * 순차 : 구문 순서에 따라서 순서대로 수행 | ||
+ | * 선택 : 프로그램의 상태에 따라서 여러 구문을 중에서 하나를 수행 ex) if..then..else..endif, switch, case | ||
+ | * 반복 : 프로그램이 특정 상태에 도달할 때까지 구문을 반복하여 수행하거나, 집합체 각각의 원소들에 대해 어떤 구문을 반복 수행 ex) while, repeat, for, do..until | ||
+ | ==== 고수준 구조 ==== | ||
+ | 코드 작성자는 큰 조각의 코드를 이해하기 쉬운 크기의 작은 하부 프로그램([[함수]], [[프로시저]], [[메소드]], [[블록]], 등)으로 나누어야 한다. 일반적으로 프로그램은 전역 변수는 거의 사용하지 않아야 하고 대신에 하부 프로그램은 지역 변수를 사용하거나, 값이나 참조에 의한 인자를 받아야 한다. 이런 기법은 전체 프로그램을 한번에 이해하지 않고, 분리된 작은 코드 조각을 쉽게 이해하는 데 도움을 준다. | ||
+ | |||
+ | === 객체 지향 프로그래밍 === | ||
+ | 객체 지향 프로그래밍(Object-Oriented Programming,OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시작에서 벗어나 여러 개의 독립된 단위, 즉 [[객체]]들의 모임으로 파악하고자 하는 것이다. 각각 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 또한, 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용 된다. 프로그램을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 [[코드]] 분석을 가능하게 하는 장점을 지니고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.<ref>〈[https://ko.wikipedia.org/wiki/객체_지향_프로그래밍 객체 지향 프로그래밍]〉, 《위키백과》</ref> | ||
+ | |||
+ | ==== 기본 구성 ==== | ||
+ | * [[클래스]](Class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형이라고 할 수 있다. | ||
+ | * [[객체]](Object) : 클래스의 인스턴스이다. 객체는 자신 고유의 속성을 가지며 클래스에서 정의한 행위를 수행할 수 있다. | ||
+ | * [[메소드]](Method), 메시지(Message) : 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다. 메소드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. | ||
+ | |||
+ | === 관점 지향 프로그래밍 === | ||
+ | 관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)은 횡당 분할 기법(separation of cross-cutting concerns)을 사용함으로써 모듈러리티(modularity)를 증가시키는 것에 촛점을 맞춘 프로그래밍 패러다임이다.<ref>〈[https://ko.wikipedia.org/wiki/관점_지향_프로그래밍 관점 지향 프로그래밍]〉, 《위키백과》</ref> 객체 지향 프로그램(OOP)과 함께 사용되며, 영역이란 프로그램을 나타내는 서브 프로그램으로, 영역이 변함에 따라 전체 프로그램이 변하는 aspect weaver(영역 직조형 컴파일러)라는 일종의 컴파일러 역할을 한다. 관점 지향 프로그래밍은 프로그램 로직을 분리된 파트로 변화시키는 것을 의미한다. 거의 모든 프로그래밍 패러다임은 추상화를 제공한다. 그리고 이것을 구현하거나 추상화 및 복합적으로 사용해서 불리 및 독립적인 엔티티들을 고려해 그룹화와 캔슐화하는 것을 일부 레벨 지원한다.<ref>JDM's, 〈[https://jdm.kr/blog/122 관점 지향 프로그램(Aspect-oriented programming)]〉, 2015-04-20</ref> | ||
+ | |||
+ | === 병렬 프로그래밍 === | ||
+ | 병렬 구조와 같은 개념을 이용하며, 프로그램 내의 프로세스들이 동시에 실행될 수 있도록 해주는 프로그램 기법이다. 큰 컴퓨터 시스템에서는 입출력 동작중이나 파일 호출 기간중에도 컴퓨터를 유효하게 사용하는 것이 바랍직하다. 그래서 여러 개의 프로그램을 준비하고 하나의 프로그램이 입출력 대기로 되어 있는 경우에는 다른 프로그램 처리를 행하는 방법이 취해진다. 이것을 병렬 프로그래밍이라고 한다. | ||
+ | |||
+ | == 동향 == | ||
+ | 프로그래밍 트렌드는 현재의 IT 기술과 서비스 트렌드가 반영될 수밖에 없으며, 따라서 최근에는 모바일 앱 개발을 위한 프로그래밍, 웹2.0의 서비스 조합을 지원하는 매시업 프로그래밍 등이 주류를 형성하고 있다. 모바일 앱 개발에 대한 관심이 급증하면서 나타난 가장 큰 특징인 개방성의 후퇴와 월드가든(walled garden)의 득세는 프로그래밍 트렌드에도 고스란히 반영되고 있다. 또한 소셜 미디어 등 소비자 시장의 서비스가 기업에 접목되고, 기업 활동에 빅 데이터 분석 요구가 대두되면서 프로그래밍 개발 시 고려해야 할 우선순위가 변화되는 추세이다. IT와 통신서비스 환경이 점차 대역폭 이슈에 민감해지고, 사회경제적으로 에너지 절감 문제가 대두되면서 프로그래밍도 대역폭과 에너지 문제에 대한 많은 고려가 필요하다.<ref>〈[http://www.itfind.or.kr/WZIN/jugidong/1527/file29268-152705.pdf 주목할 만한 프로그래밍 프렌드]〉, 《정보통신산업진흥원》, 2011-12-23</ref> | ||
+ | |||
+ | {{각주}} | ||
+ | |||
+ | == 참고자료 == | ||
+ | * 〈[https://terms.naver.com/entry.nhn?docId=1159441&cid=40942&categoryId=32837 프로그래밍]〉, 《네이버 지식백과》 | ||
+ | * 〈[https://terms.naver.com/tlist/list.nhn?listId=869 프로그래밍의 종류]〉, 《네이버 지식리스트》 | ||
+ | * 정보기술동향, 〈[https://www.facebook.com/181260275238600/posts/1017749028256383/ 모듈러프로그래밍(Modular Programming)]〉, 《페이스북》, 2015-10-31 | ||
+ | * 〈[https://terms.naver.com/entry.nhn?docId=755175&categoryId=42341&cid=42341&tkFrom=tlist&tkListId=869&tkTocId=7355&tkSort= 마이크로프로그래밍]〉, 《네이버 지식백과》 | ||
+ | * 〈[https://ko.wikipedia.org/wiki/마이크로코드 마이크로코드]〉, 《위키백과》 | ||
+ | * hellicon, 〈[http://blog.naver.com/PostList.nhn?blogId=hellicon&skinType=&skinId=&from=menu&userSelectMenu=true 수직적 마이크로 프로그래밍, 수평적 마이크로 프로그래밍]〉, 2008-04-18 | ||
+ | * JDM's, 〈[https://jdm.kr/blog/122 관점 지향 프로그램]〉, 2015-04-20 | ||
+ | * 〈[https://terms.naver.com/entry.nhn?docId=832124&categoryId=42344&cid=42344&tkFrom=tlist&tkListId=869&tkTocId=7359&tkSort= 병렬 프로그래밍]〉, 《네이버 지식백과》 | ||
+ | * Titus '열정의 공간, 〈[https://titus94.tistory.com/3 웹 프로그래밍이란?]〉, 2016-07-26 | ||
+ | * 삼도다, 〈[https://samdo0812.tistory.com/12 (Web) Web Programming이란?]〉, 2018-04-06 | ||
+ | |||
+ | == 같이 보기 == | ||
+ | * [[프로그램]] | ||
+ | * [[프로그래밍 언어]] | ||
+ | * [[스크립트 언어]] | ||
+ | * [[소프트웨어]] | ||
+ | |||
+ | {{프로그래밍|검토 필요}} | ||
+ | |||
+ | [[분류:프로그램]] |
2020년 8월 13일 (목) 09:46 기준 최신판
프로그래밍(programming)이란 프로그램을 짜는 행위를 말한다. 즉, 수식 또는 작업을 컴퓨터 처리 방식에 맞게 정리하여 순서를 정하고, 특유의 명령어로 고쳐 쓰는 작업이다. 컴퓨터 프로그래밍(computer programming)이라고 한다.
목차
개요[편집]
프로그래밍이란 프로그램 작성에 관한 전반적인 사항, 즉 프로그램의 설계, 코딩, 테스트, 디버깅 등 프로그램의 설계를 시작해서 완전한 프로그램이 작성될 때까지의 일련의 작업을 말한다. 명령 코드를 쓰는 작업은 코딩이라고 하는데, 컴퓨터가 처음 나타난 초기까지의 프로그래밍은 숫자를 나열한 명령코드를 쓰는 기계어였다. 그러나 기계어는 틀리기 쉽고, 또한 틀린 곳을 발견하기가 어렵다는 단점이 있어서 인간이 외우기 쉬운 언어·수식 등을 사용해 프로그램을 쓰고, 그것을 컴퓨터에 넣어서 컴퓨터가 자신의 명령코드로 고쳐 계산을 실시하는 방식이 고안되었다.[1]
역사[편집]
컴퓨터의 인스트럭션은 0과 1로 이루어져 있다. 이런 형태의 인스트럭션을 기계어라 한다. 0과 1은 컴퓨터 내부의 전기 신호 중 하나로 0또는 1 중 하나의 값을 갖는다고 해서 ‘이진’이라고 한다. 그리고 그 값을 비트라고 한다.
- 1940년~50년대 : 컴퓨터의 기판 상에 있는 작은 전선들을 조작해서 연결이 이루어진 곳은 1을, 연결이 없는 곳은 0을 나타나게 해놓았고, 이 전선 연결의 조합이 당시의 프로그래밍이었다. 이런 형태의 배선은 만드는 데 아주 오랜 시간이 걸리고, 에러가 발생했을 때 찾아내는 것이 거의 불가능했다.
- 1950~60년대 : 컴퓨터 메모리 내의 값을 이용하여 프로그래밍을 하기 시작했다. 빠른 프로그램 수정을 가능하게 해주었지만 수많은 0과 1로 이루어진 패턴과 싸움하는 것은 예전과 마찬가지였다. 사람들은 보다 쉽게 기억하기 위해 비트 패턴 대신 일종의 약어를 사용하기 시작했다. 약어는 비트 패턴의 기능 설명으로부터 만들어진 용어로 어셈블러(assembler)라 불리우는 프로그램에 의해 이진수 패턴 형태로 바뀐다. 이렇게 축약어로 일어진 언어를 어셈블리어(assembly language)라고 한다.
- 1970~-80년대 : 프로그래밍 분야에 절차적 언어가 유행하게 된다. 대표적인 절차적 언어는 파스칼(Pascal)과 C 언어이다. 이 언어가 등장하기 전의 프로그램은 코드를 길게 늘어뜨려, 프로그램 내의 각 파트를 구분지어 주는 어떤 경계도 없었다. 때문에 프로그래밍 중 어느 한 곳에서 다른 곳으로 이동하려면, 긴 코드 전체를 뒤져서 이동하는 과정을 거쳐야 했다. 절차적 언어는 이를 보안하여 코드를 몇 개의 단위로 구분지어 주었다. 절차적 언어가 등장하기 전에도 프로시저(procedure)가 존재하기는 했지만 절차를 표준화하고 보다 예측 가능한 형태로 쓰일 수 있게 보편화된 것은 절차적 언어 등장 이후이다.
- 1980년대 이후 : 절차적 프로그래밍 이후에는 객체 지향 프로그래밍이 등장하였다. 최초의 객체 지향 프로그래밍 언어는 1960년에 개발된 시뮬라(Simula)였으나 거의 주목을 받지 못하였다. 1983년 미국 AT&T 벨 연구소의 비야네 스트롭스트룹이 C++ 언어를 개발함으로써 객체 지향 언어가 널리 확산되었다.
- 객체 지향은 코드를 절차로 그룹짓는 것에서 한 걸음 더 나아가 절차를 또 다시 객체로 그룹짓는 것이다. 객체(object)는 특정 작업을 수행해 주는 코드뿐만 아니라 그 작업에서 다루는 모든 데이터도 포함한다. 객체 지향 방식에서는 모든 코드를 그 코드가 다룰 데이터와 함께 묶어 객체로 구분해서 독립시켰다. 각 객체는 오직 자신의 데이터만을 바꿀 수 있고, 다른 객체의 데이터는 변경시킬 수 없다. 한 객체의 데이터에 문제가 생긴다면 그 객체 안의 코드만 살펴보면 된다. 이 방식이 등장하기 전에는 다른 사람이 만든 코드를 이용하는 것이 쉬운 일이 아니었다. 각 코드를 기능별로 객체화해서 완성해 두었기 때문에 보다 많은 코드들이 재사용될 수 있게 되었고 이는 프로그래밍 작업의 생산성 증가와 비용 감소로 이어졌다.
종류[편집]
웹 프로그래밍[편집]
World Wide Web(WWW)의 통신 규약에 따라 컴퓨터 간에 데이터를 주고 받는 네트워크 프로그램이다.[2] 웹 프로그래밍은 기본적으로 클라이언트/서버 방식으로 주고받는 형태를 갖게 된다. 클라이언트가 특정 페이지를 웹서버에 요청하게 되면 웹 서버가 이를 처리한 후 결과를 클라이언트에게 응답을 하게 되는 구조이다.[3]
멀티 프로그래밍[편집]
하나의 처리 장치에 의해서 둘 이상의 컴퓨터 프로그램을 교대로 배치하여 실행하는 기능을 갖춘 조작 형태이다. 하나의 컴퓨터로 복수 개의 프로그램을 겉보기로 동시에 실행하는 것이며, 멀티 프로그래밍의 목적은 처리 장치, 기억 장치, 입출력 장리, 채널 등의 컴퓨터 자원을 병렬적으로 사용하여 시스템 전체의 사용 효능을 높이는 것이다.
장점 : 동시에 여러 프로그램을 실행할 수 있어 처리 능력이 좋음
단점 : 여러 프로그램을 관리하기 때문에 운영체제의 구조가 복잡
모듈 프로그래밍[편집]
프로그램을 모듈화하여 독립성을 갖게 함으로써 다른 모듈에 영향을 받지 않고 모듈의 일부 개량이나 재번역을 가능하게 하는 프로그래밍 기법이다. 각 모듈인 기능이나 서브루틴은 국소적 변수를 써서 독립성을 높이고 있으며, 통합된 기능별로 모듈화 한다. 모듈러 프로그램 작성의 목적은 크고 복잡한 프로그램을 유지를 쉽게 하고, 신뢰성을 높이는 것이다. 모듈러 프로그래밍에서 중요한 점은 하나의 모듈은 한 가지 일만 하도록 작성해야 한다는 것이다. 이런 프로그램이 유지보수 또한 간편하다. 모듈은 오직 한 개의 상태만 가질 수 있는데, 일반적인 기능을 하는 프로시져를 다른 하나의 모듈로 묶어서 각각의 모듈이 독립적인 데이터를 가질 수 있도록 한다. 이 말은 모듈 내의 프로시져가 호출됨으로써 생기게 되는 변경사항에 대해 해당 모듈이 이를 관리할수 있다라는 말이며 독립성을 지니고 있다.
마이크로프로그래밍[편집]
1951년, 모리스 월크스는 마이크로프로그래밍이라는 용어를 만들었다.[4] 마이크로프로그래밍, 이를테면 마이크로코드는 CPU 안에 기계어를 상대적으로 쉽게 추가할 수 있도록 이용하는 빙속으로 다른 방식들에 비해 하드웨어를 덜 사용한다. 매우 상세하면서도 기초가 되는 가장 낮은 수준에 루틴의 모임이며 이러한 루틴은 특정한 명령어를 수행하는 데 필요한 동작들을 제어하고 나열한다. 또, 이따금씩 이들을 해석하기도 한다. 그러므로 일련의 마이크로 명령어가 추가한 기계어는 인터프리터가 기계어를 사용하여 고급 프로그래밍 언어의 명령문을 추가하는 방식과 비슷하다고 볼 수 있다.[4]
수직적 마이크로 프로그래밍[편집]
마이크로 명령어의 연산 필드에 적은 수의 코드화된 비트들을 포함시킴으로써 제어 기억 장치의 용량을 줄이고, 해독기를 이용하여 그 코드를 필요한 수 만큼 제어 신호들로 확장하는 방식이다. 마이크로 명령의 비트 수가 감소하는 장점이 있지만, 해독 시간 만큼의 지역 시간이 발생하는 단점도 있다.
수평적 마이크로 프로그래밍[편집]
연산 필드의 각 비트와 제어신소를 1:1로 대응시켜서, 그 수 만큼의 비트들로 이루어진 마이크로 명령어를 사용하는 방식이다. 마이크로 명령어 비트 수가 길기 때문에 더 큰 용량의 제어 기억장치가 필요하다는 단점이 있다. 하지만 하드웨어가 간단하며, 해독에 따른 지연 시간이 없다라는 장점을 지니고 있다.
구조적 프로그래밍[편집]
구조적 프로그래밍(structured programming)은 구조화 프로그래밍으로도 불리며 프로그래밍 패러다임의 일종인 절차적 프로그래밍의 하위 개념으로 볼 수 있다. GOTO문을 없애거나 GOTO문에 대한 의존성을 줄여주는 것으로 가장 유명하다. 대표적인 언어는 파스칼,C언어가 있다.[5]
저수준 구조[편집]
저수준 관점에서 구조적 프로그램은 간단하고, 계층적인 프로그램 제어 구조로 구성된다. 이 제어 구조들은 하나의 구문으로 간주되며, 동시에 더 간단한 구문들을 결합시키는 방법이다. 더 간단한 구문들은 또 다른 제어 구조일 수도 있고, 할당문이나 프로시저 호출과 같은 기본 구문일 수도 있다. 에츠허르 데이크스트라가 확인한 3가지 형태의 구조는 순차, 선택, 반복이다.[6]
- 순차 : 구문 순서에 따라서 순서대로 수행
- 선택 : 프로그램의 상태에 따라서 여러 구문을 중에서 하나를 수행 ex) if..then..else..endif, switch, case
- 반복 : 프로그램이 특정 상태에 도달할 때까지 구문을 반복하여 수행하거나, 집합체 각각의 원소들에 대해 어떤 구문을 반복 수행 ex) while, repeat, for, do..until
고수준 구조[편집]
코드 작성자는 큰 조각의 코드를 이해하기 쉬운 크기의 작은 하부 프로그램(함수, 프로시저, 메소드, 블록, 등)으로 나누어야 한다. 일반적으로 프로그램은 전역 변수는 거의 사용하지 않아야 하고 대신에 하부 프로그램은 지역 변수를 사용하거나, 값이나 참조에 의한 인자를 받아야 한다. 이런 기법은 전체 프로그램을 한번에 이해하지 않고, 분리된 작은 코드 조각을 쉽게 이해하는 데 도움을 준다.
객체 지향 프로그래밍[편집]
객체 지향 프로그래밍(Object-Oriented Programming,OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시작에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것이다. 각각 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 또한, 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용 된다. 프로그램을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 지니고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.[7]
기본 구성[편집]
- 클래스(Class) : 같은 종류의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형이라고 할 수 있다.
- 객체(Object) : 클래스의 인스턴스이다. 객체는 자신 고유의 속성을 가지며 클래스에서 정의한 행위를 수행할 수 있다.
- 메소드(Method), 메시지(Message) : 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다. 메소드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다.
관점 지향 프로그래밍[편집]
관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)은 횡당 분할 기법(separation of cross-cutting concerns)을 사용함으로써 모듈러리티(modularity)를 증가시키는 것에 촛점을 맞춘 프로그래밍 패러다임이다.[8] 객체 지향 프로그램(OOP)과 함께 사용되며, 영역이란 프로그램을 나타내는 서브 프로그램으로, 영역이 변함에 따라 전체 프로그램이 변하는 aspect weaver(영역 직조형 컴파일러)라는 일종의 컴파일러 역할을 한다. 관점 지향 프로그래밍은 프로그램 로직을 분리된 파트로 변화시키는 것을 의미한다. 거의 모든 프로그래밍 패러다임은 추상화를 제공한다. 그리고 이것을 구현하거나 추상화 및 복합적으로 사용해서 불리 및 독립적인 엔티티들을 고려해 그룹화와 캔슐화하는 것을 일부 레벨 지원한다.[9]
병렬 프로그래밍[편집]
병렬 구조와 같은 개념을 이용하며, 프로그램 내의 프로세스들이 동시에 실행될 수 있도록 해주는 프로그램 기법이다. 큰 컴퓨터 시스템에서는 입출력 동작중이나 파일 호출 기간중에도 컴퓨터를 유효하게 사용하는 것이 바랍직하다. 그래서 여러 개의 프로그램을 준비하고 하나의 프로그램이 입출력 대기로 되어 있는 경우에는 다른 프로그램 처리를 행하는 방법이 취해진다. 이것을 병렬 프로그래밍이라고 한다.
동향[편집]
프로그래밍 트렌드는 현재의 IT 기술과 서비스 트렌드가 반영될 수밖에 없으며, 따라서 최근에는 모바일 앱 개발을 위한 프로그래밍, 웹2.0의 서비스 조합을 지원하는 매시업 프로그래밍 등이 주류를 형성하고 있다. 모바일 앱 개발에 대한 관심이 급증하면서 나타난 가장 큰 특징인 개방성의 후퇴와 월드가든(walled garden)의 득세는 프로그래밍 트렌드에도 고스란히 반영되고 있다. 또한 소셜 미디어 등 소비자 시장의 서비스가 기업에 접목되고, 기업 활동에 빅 데이터 분석 요구가 대두되면서 프로그래밍 개발 시 고려해야 할 우선순위가 변화되는 추세이다. IT와 통신서비스 환경이 점차 대역폭 이슈에 민감해지고, 사회경제적으로 에너지 절감 문제가 대두되면서 프로그래밍도 대역폭과 에너지 문제에 대한 많은 고려가 필요하다.[10]
각주[편집]
- ↑ 〈프로그래밍〉, 《네이버 지식백과》
- ↑ 삼도다, 〈(Web) Web Programming이란?〉, 2018-04-06
- ↑ Titus '열정의 공간〈웹프로그래밍〉, 2016-07-26
- ↑ 4.0 4.1 〈마이크로코드〉, 《위키백과》
- ↑ 〈구조적 프로그래밍〉, 《위키백과》
- ↑ 〈에츠허르 데이크스트라〉, 《위키백과》
- ↑ 〈객체 지향 프로그래밍〉, 《위키백과》
- ↑ 〈관점 지향 프로그래밍〉, 《위키백과》
- ↑ JDM's, 〈관점 지향 프로그램(Aspect-oriented programming)〉, 2015-04-20
- ↑ 〈주목할 만한 프로그래밍 프렌드〉, 《정보통신산업진흥원》, 2011-12-23
참고자료[편집]
- 〈프로그래밍〉, 《네이버 지식백과》
- 〈프로그래밍의 종류〉, 《네이버 지식리스트》
- 정보기술동향, 〈모듈러프로그래밍(Modular Programming)〉, 《페이스북》, 2015-10-31
- 〈마이크로프로그래밍〉, 《네이버 지식백과》
- 〈마이크로코드〉, 《위키백과》
- hellicon, 〈수직적 마이크로 프로그래밍, 수평적 마이크로 프로그래밍〉, 2008-04-18
- JDM's, 〈관점 지향 프로그램〉, 2015-04-20
- 〈병렬 프로그래밍〉, 《네이버 지식백과》
- Titus '열정의 공간, 〈웹 프로그래밍이란?〉, 2016-07-26
- 삼도다, 〈(Web) Web Programming이란?〉, 2018-04-06
같이 보기[편집]