"명령문"의 두 판 사이의 차이
(→같이 보기) |
|||
(사용자 3명의 중간 판 19개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''명령문'''은 [[컴퓨터과학]]의 프로그래밍 패러다임의 일종으로, 프로그램의 상태와 상태에 대한 문장들을 작성하는 스타일이다.<ref name="나무위키"> 〈[https://namu.wiki/w/%EB%AA%85%EB%A0%B9%ED%98%95%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 명령형 프로그래밍]〉, 《나무위키》 </ref> | + | '''명령문'''(命令文, command statement)은 컴퓨터가 수행하도록 명령을 내리는 문장이다. 또한 [[컴퓨터과학]]의 프로그래밍 패러다임의 일종으로, 프로그램의 상태와 상태에 대한 문장들을 작성하는 스타일이다.<ref name="나무위키">〈[https://namu.wiki/w/%EB%AA%85%EB%A0%B9%ED%98%95%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 명령형 프로그래밍]〉, 《나무위키》 </ref> '''명령형 프로그래밍'''이라고도 한다. |
== 개요 == | == 개요 == | ||
− | + | 명령문은 [[선언문]], 즉 선언형 프로그래밍과 반대되는 개념이다. 프로그램의 상태와 상태를 변경시키는 구문의 관점으로 연산을 설명하는 프로그래밍 패러다임 중 하나로, 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명령으로 표현한 것처럼 [[컴퓨터]]가 수행할 명령을 순서대로 써 놓은 것이라 정의한다. 거의 모든 컴퓨터 [[하드웨어]]들이 컴퓨터의 고유 언어인 [[기계어]]를 실행하도록 설계되어 있는데, 이것이 명령형으로 쓰여 있어서 대부분의 컴퓨터 하드웨어가 명령형으로 구현된다. 컴퓨터 하드웨어의 낮은 수준에서 프로그램의 상태는 [[메모리]]의 내용으로 정의되고, 구문들은 기계어의 [[명령어]]로 정의되는 반면, 높은 수준에서의 언어 구현은 [[변수]]와 더 복잡한 구문을 사용하지만, 여전히 같은 프로그래밍 패러다임을 따른다. 명령형 프로그래밍의 기본 생각이 개념적으로 친밀하고, 구체화가 직접적으로 되어 있기 때문에 대부분의 [[프로그래밍 언어]]들은 명령형이다.<ref name="위키백과">〈[https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4%EB%93%A4 명령형 프로그래밍]〉, 《위키백과》 </ref> | |
− | + | == 역사 == | |
+ | 최초의 명령형 언어는 원시 컴퓨터의 기계어로 명령이 매우 간단하여 하드웨어를 쉽게 구현할 수 있었으나, 복잡한 프로그램을 작성하는 것에서 한계가 있었다. 복잡한 프로그램 작성에 대한 한계에 부딪히는 중 1954년 [[IBM]]의 [[존 배커스]](John Backus)가 기계어의 복잡한 프로그램 작성의 한계를 없애고, 복잡한 프로그램을 작성할 수 있는 최초의 주요한 언어인 [[포트란]]을 개발했다. 포트란은 [[컴파일]] 언어였는데, 변수의 이름을 붙일 수 있고, 복잡한 수식을 계산할 수 있었으며, 서브 프로그램과 명령형 언어의 많은 특징을 가지고 있는 언어였다. 그 후 20년간 여러 가지 주요 고급 명령형 프로그래밍 언어들이 발전하였는데, 1950년대 후반과 1960년대에는 수학적 알고리즘을 더 쉽게 표현하기 위해 [[알골]]이 개발되었다. 알골은 몇몇 컴퓨터 [[운영체제]]의 언어로 쓰이기도 했지만, 1960년에 개발된 [[코볼]]과 1964년에 개발된 [[베이직]]이 더 프로그래밍 구문을 영어와 비슷하게 표현하였다. 1970년대에는 [[니클라우스 비르트]](Niklaus Wirth)가 [[파스칼]]을 개발하고, [[데니스 리치]](Dennis Ritchie)가 벨 연구소에서 일하던 시절에 [[C언어]]를 개발하였으며, 니클라우스 비르트가 계속하여 [[모듈라-2]], [[모듈라-3]]과 [[오베론]]을 개발하였다. 미국 국방부의 필요에 따라, 쟌 이시비아와 허니웰에 있는 팀이 [[에이다]]를 설계하였는데, 에이다는 [[보안]] 프로그래밍 측면에 초점을 맞춰서 설계되었지만, 1983년까지 세부 사항을 완성하지 못하였다. | ||
+ | |||
+ | 1980년대에는 명령형의 형태를 띠고 있으나 [[객체]]를 지원하기 위해 개발된 [[객체지향 프로그래밍]]이 빠르게 성장하였는데, 그 후 20세기의 마지막 20년 동안 상당히 많은 [[객체지향]] 언어들이 개발되었다. 1969년에 [[앨런 케이]](Alan Kay)가 처음 [[스몰토크-80]]을 생각하고, 1980년에 [[제록스 팔로알토 연구소]](Palo Alto Research Center)에서 출시되었다. 세계 최고의 객체지향 프로그래밍 언어로 알려진 [[시뮬라]] 등의 다른 객체지향 언어를 참고하여 [[비야네 스트롭스트룹]](Bjarne Stroustrup)이 C언어를 바탕으로 [[C++]]를 설계했으며, C++은 1985년 처음 구현되었다. 1980년대 후반과 1990년대에는 [[래리 월]](Larry Wall)이 1987년 객체지향 언어의 개념을 수용하여 탁월한 명령형 언어인 [[펄]]을 출시하였다. 1990년에 [[귀도 반 로섬]](Guido van Rossum)이 [[파이썬]]을 출시하면서 1994년에 [[라스무스 러도프]](Rasmus Lerdorf)가 [[PHP]]를, [[썬 마이크로시스템즈]](SUN Microsystems)에서 [[자바]]를 출시하였다.<ref name="역사">〈[https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#%EC%97%AD%EC%82%AC 명령형 프로그래밍 역사]〉, 《위키백과》 </ref> 명령형 프로그래밍의 프로그래밍 패러다임을 따르는 프로그래밍 언어의 종류에는 비야네 스트롭스트룹이 개발한 C++, [[NML]], [[Occam]], 제록스 팔로알토 연구소에서 개발된 [[스몰토크]], [[스칼라]], [[스퀵]], 알골, 썬 마이크로시스템즈에서 개발된 자바, 존 배커스가 개발한 포트란 등이 있다.<ref>〈[https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4 명령형 프로그래밍 언어]〉, 《위키백과》</ref> | ||
+ | |||
+ | == 종류 == | ||
+ | 명령문은 [[입출력문]]과 [[제어문]]으로 구성되어 있는데, 제어문은 [[조건문]]과 [[반복문]], 그리고 [[분기문]]으로 구성되어 있다.<ref name="홍수열">〈[http://prof.dongju.ac.kr/syhong/public_html/teaching/c/c05.htm 각종 명령문]〉, 《홍수열 교수 홈페이지》</ref> | ||
+ | |||
+ | === 입출력문 === | ||
+ | [[입출력문]]은 기본 입출력 장치인 키보드나 모니터 화면을 통하여 데이터를 입출력하는 명령문이다. C언어는 다른 언어와 다르게 입출력 명령문이 없고, [[함수]]를 통하여 데이터의 입출력을 하고 있으며, 기본 입출력 함수는 [[printf]]()함수와 [[scanf]]()함수, [[getchar]]()함수, 그리고 [[putchar]]()함수로 네가지가 있다. printf()함수는 화면상에 [[상수]], [[변수]]의 값, 수식의 값을 나타내며, scanf()함수는 키보드로부터 데이터를 입력 받아 변수에 기억한다. getchar()함수는 표준 입력스트림으로부터 입력을 받는 매크로로 키보드로부터 1개의 문자를 입력받아 변수에 기억하고 putchar()함수는 표준 출력 스트림에 출력하는 매크로로 변수에 기억된 1개의 문자를 화면상에 나타나게 한다. | ||
+ | |||
+ | === 제어문 === | ||
+ | [[제어문]]은 위에서 아래로, 좌에서 우로 수행되는 프로그램 실행의 수행 순서를 변경하거나 문장의 흐름을 바꾸고자 할 때 사용한다. 이러한 제어문은 [[조건문]]과 [[반복문]], 그리고 [[분기문]]으로 구성되어 있다.<ref name="홍수열"></ref> | ||
+ | |||
+ | ==== 조건문 ==== | ||
+ | ===== if문 ===== | ||
+ | [[if]]문은 어떤 조건의 [[참]], [[거짓]] 여부에 따라 실행을 제어하는 구조이며, 산술적 비교와 논리적 비교가 가능하다.<ref name="달빛천사">o달빛천사o, 〈[https://blog.naver.com/ajtwltsk/222227818534 (정보처리기사) 프로그래밍 언어 활용> 1-2. 연산자와 명령문의 활용]〉, 《네이버 블로그》, 2021-02-01 </ref> 이러한 if문에는 어떤 문장을 수행할 지 여부를 결정할 때 사용하는 단순 if문, 경로를 선택할 때 사용하는 선택 if문, 수행 경로가 2개가 넘어갈 때 사용하는 중첩 if문으로 구성이 되어있다. [[C언어]]에서는 조건식은 반드시 소괄호로 묶으며, 거짓(false)은 0으로, 0이 아닌 모든 값을 참(ture)로 둔다. 조건이 참이면 조건 문장을 실행하고, 거짓이면 조건 문장 다음을 실행하며, 실행될 문장이 둘 이상인 경우 [[복합문]]으로 처리가 가능하다.<ref name="홍수열"></ref> | ||
+ | |||
+ | *if 문의 구조 | ||
+ | |||
+ | /if (조건식) 문장 1 ; | ||
+ | 문장 2 ; | ||
+ | |||
+ | /if (조건식) | ||
+ | { | ||
+ | 문장 1 ; | ||
+ | : | ||
+ | } | ||
+ | 문장 2 ; | ||
+ | |||
+ | 이러한 if문에 [[else]] 구문을 추가하여 작성이 가능한데, else 구문은 조건식이 [[거짓]]인 경우에 수행되는 구문으로, 조건이 [[참]]일 때와 거짓일 때 중 하나를 골라 문장을 실행한다.<ref name="달빛천사"></ref> [[else if]]와 같은 방식으로 분기를 추가할 수 있는데, else if를 갖는 것은 여러 조건 중 해당하는 문장 실행이 가능하다.<ref name="홍수열"></ref> | ||
+ | |||
+ | *if ~ else 구조 | ||
+ | |||
+ | /if (조건식) | ||
+ | 문장 1 ; | ||
+ | else | ||
+ | |||
+ | /if (조건식) | ||
+ | { | ||
+ | 문장 1 ; | ||
+ | : | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | 문장 2 ; | ||
+ | : | ||
+ | } | ||
+ | 문장 3 ; | ||
+ | |||
+ | *if ~ else if 구조 | ||
+ | |||
+ | /if (조건식1) | ||
+ | 문장 1 ; | ||
+ | else if (조건식2) | ||
+ | 문장 2 ; | ||
+ | else | ||
+ | 문장 3 ; | ||
+ | 문장 4 ; | ||
+ | |||
+ | /if (조건식1) | ||
+ | { | ||
+ | 문장 1 ; | ||
+ | : | ||
+ | } | ||
+ | else if (조건식2) | ||
+ | { | ||
+ | 문장 2 ; | ||
+ | : | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | 문장 3 ; | ||
+ | : | ||
+ | } | ||
+ | 문장 4 ; | ||
+ | |||
+ | ===== switch ~ case문 ===== | ||
+ | [[switch]]문은 조건에 따라 여러 경로 중에 하나를 선택하여 조건이 동일한지의 여부, [[case]] 뒤의 상수값과 일치하는지 확인하고 일치하면 분기한다.<ref name="달빛천사"></ref> switch문에서 벗어나려면 [[break]]문을 사용해야 하며, switch문을 사용하지 않고 여러 개의 case문을 통과하는 것이 유용하게 사용되기도 한다. [[default]]의 경우 넣어주면 case의 상수값에 일치하지 않는 경우를 처리할 때 사용된다.<ref name="홍수열"></ref> | ||
+ | |||
+ | *break문이 없는 switch ~ case문 구조 | ||
+ | |||
+ | /switch (변수 혹은 식) | ||
+ | { | ||
+ | case 식 1 : 문장 1 ; | ||
+ | case 식 2 : 문장 2 ; | ||
+ | case 식 3 : 문장 3 ; | ||
+ | : | ||
+ | case 식 n : 문장 n ; | ||
+ | default : 문장 n+1 ; | ||
+ | } | ||
+ | |||
+ | switch의 변수 혹은 식의 값이 식 1과 같은 경우에는 문장 1 이후 문장들을 실행하고, 식 2와 같을 경우엔 문장 2 이후 문장들을 실행한다. 만약 어느 것에도 해당되지 않을 경우에는 default로 저장한 문장 n+1을 실핼하며, 이 default문은 생략이 가능하다.<ref name="홍수열"></ref> | ||
+ | |||
+ | *break문이 있는 switch ~ case문 구조 | ||
+ | |||
+ | /switch (변수 혹은 식) | ||
+ | { | ||
+ | case 식 1 : 문장 1 ; | ||
+ | break ; | ||
+ | case 식 2 : 문장 2 ; | ||
+ | break ; | ||
+ | case 식 3 : 문장 3 ; | ||
+ | break ; | ||
+ | : : | ||
+ | case 식 n : 문장 n ; | ||
+ | break ; | ||
+ | } | ||
+ | |||
+ | switch의 변수 혹은 식의 값이 식 1과 같으면 문장 1만 실행하고, 식 2와 같으면 문장 2만 실행하며, 만약 식 n과 같으면 문장 n만 실행하게 된다. 어느 것에도 해당되지 않을 경우엔 default로 지정된 문장 n+1만을 실행하지만, break가 있는 switch ~ case문 역시 default문은 생락이 가능하다.<ref name="홍수열"></ref> | ||
+ | |||
+ | ==== 반복문 ==== | ||
+ | [[반복문]]은 프로그램을 작성하다 같은 작업을 여러 번 반복해야 할 경우 특정 부분을 조건이 만족할 때까지 실행하도록 하는 명령문이다.<ref name="달빛천사"></ref> 이렇게 같은 내용의 문장들을 여러 번 작성하지 않고 원하는 작업을 반복시키는 반복문으로 C 언어에서는 무한정형 선 제어 반복 명령인 while문, 한계성 반복 명령인 [[for]]문, 무한정형 후 제어 반복 명령인 [[do while]]문이 있다.<ref name="홍수열"></ref> | ||
+ | |||
+ | ===== while문 ===== | ||
+ | [[while]]문은 수식이 [[거짓]]이 될 때까지 같은 처리를 반복해서 처리하는 제어구조로 while문의 조건식 값이 참일 때 [블록]({}) 혹은 문장 내용을 실행하고, 결과값이 거짓이면 블록 밖의 문장을 실행한다.<ref name="달빛천사"></ref> 반드시 블록 안에 조건식의 결과값을 변화시키는 문장이 필요하며, 조건식이 잘못 처리될 경우 혹은 조건식에 0이 아닌 [[상수]]를 넣으면 [[무한루프]]에 빠지게 되므로 조심해야 한다. 무한루프에 빠졌을 경우 [[break]]문을 사용하면 무한루프 블록에서 빠져나올 수 있다.<ref name="홍수열"></ref> | ||
+ | |||
+ | *while문 구조 | ||
+ | |||
+ | /while (조건식) | ||
+ | { | ||
+ | 문장 1 ; | ||
+ | 문장 2 ; | ||
+ | ••• ; | ||
+ | 문장 n ; | ||
+ | } | ||
+ | 문장 n+1 ; | ||
− | == | + | ===== for문 ===== |
− | + | [[for]]문은 C언어에서 가장 많이 사용하는 [[명령어]] 중의 하나로 시작과 종료 조건을 지정해서 일정한 횟수만큼 [[참]]인 동안에 해당 문장을 반복 작업을 하기 때문에 한계성 반복 명령이라고 한다.<ref name="달빛천사"></ref> while문이 반복 조건에 의한 반복인 반면, for 문은 [[제어 변수]]의 초기화, 반복 조건, 제어 변수의 변화라는 형식으로 기술된다. 반복될 부분이 한 개의 문장이면 [블록]({}) 생략이 가능하다.<ref name="홍수열"></ref> | |
+ | |||
+ | *for문 구조 | ||
+ | |||
+ | /for (초기식; 조건식; 증감식) | ||
+ | { | ||
+ | 문장 1 ; | ||
+ | 문장 2 ; | ||
+ | ••• ; | ||
+ | 문장 n ; | ||
+ | } | ||
+ | 문장 n+1 ; | ||
+ | |||
+ | 초기식은 [[for]]문의 [[루프]](loop)가 실행되기 전에 단 한번 실행하면 콤마(,) 연산자로 식을 구분하여 여러 개의 식을 기술 할 수 있다. 조건식은 루프의 실행 중 매회 조사를 하며 단 1개의 문장만을 기술 할 수 있고, 조건식이 참인 경우 루프를 반복하며 거짓인 경우 루프를 빠져나가게 된다. 마지막으로 증감식은 루프의 다음 단계를 준비하는 단계로 콤마(,) 연산자로 식을 구분하여 여러 개의 식을 나열할 수 있다.<ref name="홍수열"></ref> | ||
+ | |||
+ | ===== do while문 ===== | ||
+ | [[do while문]]은 초깃값과 최종값, 증감값을 지정하여 반복을 실행하며, [[while]]문과 [[for]]문은 먼저 조건 수식이 평가된 후 조건이 [[참]] 일 때 지정된 처리를 실행하는 반면, do while문은 무조건 한번 do 다음의 문장을 실행한 후 조건 수식을 평가하는 차이가 있다.<ref name="달빛천사"></ref><ref name="홍수열"></ref> | ||
+ | |||
+ | *do while문 구조 | ||
+ | |||
+ | /do | ||
+ | { | ||
+ | 문장 1 ; | ||
+ | 문장 2 ; | ||
+ | ••• ; | ||
+ | 문장 n ; | ||
+ | } | ||
+ | while(조건식) | ||
+ | 문장 n+1 ; | ||
+ | |||
+ | ==== 분기문 ==== | ||
+ | [[분기문]]은 반복문을 사용하여 루프가 반복되는 동안 루프로부터 빠져나가기 위해 사용되는데, C언어에서 분기문의 종류로는 [[goto]]문, [[break]]문, [[continue]]문 등이 있다.<ref name="홍수열"></ref> | ||
+ | |||
+ | ===== goto문 ===== | ||
+ | goto문은 문장의 제어를 무조건적으로 레이블문이 있는 곳으로 이동시킨다. 레이블명은 변수명을 만드는 규칙과 같으며, 레이블명 뒤에 콜론(:)을 붙여서 사용한지만, C언어는 함수형 언어이며, 구조적 언어이기 때문에 만일 goto문을 사용하면 문장의 흐름을 이해하는 데 어려움을 주기 때문에 잘 사용하지 않는다.<ref name="홍수열"></ref> | ||
− | + | ===== continue문과 break문 ===== | |
+ | [[continue]]문은 [[for]], [[while]], [[do while]]과 같은 반복문의 루프를 실행하다가 그 이후의 문장들을 실행하지 않고 루프의 조건 체크 부분으로 제어를 옮겨 다음 반복으로 넘어갈 수 있도록 하며, [[break]]문은 for, while, do while과 같은 반복문의 루프를 실행하다가 반복문의 루프 부분을 빠져나가게 하는 일을 한다.<ref name="홍수열"></ref> 특정한 조건이 없으면 무한 처리를 반복하게 되어 [[무한루프]]를 하게 되는데, 이를 방지하는 것이 break문과 continue문이다.<ref name="달빛천사"></ref> | ||
== 특징 == | == 특징 == | ||
− | + | 명령문의 특징은 이와 대조되는 개념의 선언형 프로그래밍과 비교하여 볼 수 있다. 명령문은 알고리즘을 명시하고 목표는 명시하지 않는 반면, 선언형 프로그래밍은 목표를 명시하고 알고리즘을 명시하지 않는다.<ref>DwEnn, 〈[https://dwenn.tistory.com/105 선언형 / 명령형 프로그래밍]〉, 《티스토리》, 2019-08-25 </ref> 쉽게 말해서 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 가깝고, 선언형 프로그래밍은 무엇을 할 것인가에 가깝다. 이러한 차이점을 실세계를 예를 들자면, 자동차 운행 방식으로 예를 들 수 있다. 수동 스틱(1종) 자동차는 일일이 속도에 따라 기어를 바꿔 가는 명령형 방식이라고 볼 수 있고, 수동 스틱 자동차와 반대로 오토 스틱(2종) 자동차는 주행을 할 것이라는 선언형 방식이라고 볼 수 있다.<ref>박스여우, 〈[https://boxfoxs.tistory.com/430 명령형 프로그래밍 VS 선언형 프로그래밍]〉, 《티스토리》, 2020-01-18 </ref> | |
− | |||
− | 명령형 프로그래밍은 무엇을 | ||
다음은 명령형 프로그래밍의 예제이다. | 다음은 명령형 프로그래밍의 예제이다. | ||
/const newArr = []; | /const newArr = []; | ||
− | for(let i=0; | + | for(let i=0; i〈arr.length; i++){ |
if(arr[i].length !== 0){ | if(arr[i].length !== 0){ | ||
newArr.push(arr[i].charAt(0).toUpperCase() + arr[i].substring(1)) | newArr.push(arr[i].charAt(0).toUpperCase() + arr[i].substring(1)) | ||
45번째 줄: | 204번째 줄: | ||
# 걸러진 배열을 순회하면서 1번에서 선언한 함수를 사용해서, 첫글자를 대문자로 변경 | # 걸러진 배열을 순회하면서 1번에서 선언한 함수를 사용해서, 첫글자를 대문자로 변경 | ||
− | 이와 같이 명령형 프로그래밍의 예제와 선언형 프로그래밍의 예제의 내부 흐름은 같게 동작하지만, 자잘한 인덱스 변수나 관리에 대해서는 생각할 필요가 없이 간단해졌고, 배열을 순회하면서 걸러내며, 각 원소의 첫 글자를 대문자로 변경해야 하는 문제를 filter로 걸러내고, covert와 map으로 대문자로 변경하여 사고방식의 흐름이 비슷해진 것을 알고 있다. <ref> | + | 이와 같이 명령형 프로그래밍의 예제와 선언형 프로그래밍의 예제의 내부 흐름은 같게 동작하지만, 자잘한 인덱스 변수나 관리에 대해서는 생각할 필요가 없이 간단해졌고, 배열을 순회하면서 걸러내며, 각 원소의 첫 글자를 대문자로 변경해야 하는 문제를 filter로 걸러내고, covert와 map으로 대문자로 변경하여 사고방식의 흐름이 비슷해진 것을 알고 있다.<ref>도비 Zereight, 〈[https://zereight.tistory.com/895 명령형? 선언형? 프로그래밍 방식]〉, 《티스토리》, 2021-04-06 </ref> |
{{각주}} | {{각주}} | ||
== 참고자료 == | == 참고자료 == | ||
− | * | + | * 〈[https://namu.wiki/w/%EB%AA%85%EB%A0%B9%ED%98%95%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 명령형 프로그래밍]〉, 《나무위키》 |
− | * | + | * 〈[https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4%EB%93%A4 명령형 프로그래밍]〉, 《위키백과》 |
+ | * 〈[https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#%EC%97%AD%EC%82%AC 명령형 프로그래밍 역사]〉, 《위키백과》 | ||
+ | * 〈[https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%AA%85%EB%A0%B9%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4 명령형 프로그래밍 언어]〉, 《위키백과》 | ||
+ | * o달빛천사o, 〈[https://blog.naver.com/ajtwltsk/222227818534 (정보처리기사) 프로그래밍 언어 활용〉1-2. 연산자와 명령문의 활용]〉《네이버 블로그》, 2021-02-01 | ||
+ | * 〈[http://prof.dongju.ac.kr/syhong/public_html/teaching/c/c05.htm 각종 명령문]〉, 《홍수열 교수 홈페이지》 | ||
+ | * DwEnn, 〈[https://dwenn.tistory.com/105 선언형 / 명령형 프로그래밍]〉, 《티스토리》, 2019-08-25 | ||
+ | * 박스여우, 〈[https://boxfoxs.tistory.com/430 명령형 프로그래밍 VS 선언형 프로그래밍]〉, 《티스토리》, 2020-01-18 | ||
+ | * 도비 Zereight, 〈[https://zereight.tistory.com/895 명령형? 선언형? 프로그래밍 방식]〉, 《티스토리》, 2021-04-06 | ||
== 같이 보기 == | == 같이 보기 == | ||
− | |||
* [[선언문]] | * [[선언문]] | ||
+ | * [[실행문]] | ||
+ | * [[입출력문]] | ||
+ | * [[제어문]] | ||
+ | * [[조건문]] | ||
+ | * [[반복문]] | ||
+ | * [[분기문]] | ||
{{프로그래밍|검토 필요}} | {{프로그래밍|검토 필요}} |
2023년 12월 21일 (목) 14:37 기준 최신판
명령문(命令文, command statement)은 컴퓨터가 수행하도록 명령을 내리는 문장이다. 또한 컴퓨터과학의 프로그래밍 패러다임의 일종으로, 프로그램의 상태와 상태에 대한 문장들을 작성하는 스타일이다.[1] 명령형 프로그래밍이라고도 한다.
목차
개요[편집]
명령문은 선언문, 즉 선언형 프로그래밍과 반대되는 개념이다. 프로그램의 상태와 상태를 변경시키는 구문의 관점으로 연산을 설명하는 프로그래밍 패러다임 중 하나로, 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명령으로 표현한 것처럼 컴퓨터가 수행할 명령을 순서대로 써 놓은 것이라 정의한다. 거의 모든 컴퓨터 하드웨어들이 컴퓨터의 고유 언어인 기계어를 실행하도록 설계되어 있는데, 이것이 명령형으로 쓰여 있어서 대부분의 컴퓨터 하드웨어가 명령형으로 구현된다. 컴퓨터 하드웨어의 낮은 수준에서 프로그램의 상태는 메모리의 내용으로 정의되고, 구문들은 기계어의 명령어로 정의되는 반면, 높은 수준에서의 언어 구현은 변수와 더 복잡한 구문을 사용하지만, 여전히 같은 프로그래밍 패러다임을 따른다. 명령형 프로그래밍의 기본 생각이 개념적으로 친밀하고, 구체화가 직접적으로 되어 있기 때문에 대부분의 프로그래밍 언어들은 명령형이다.[2]
역사[편집]
최초의 명령형 언어는 원시 컴퓨터의 기계어로 명령이 매우 간단하여 하드웨어를 쉽게 구현할 수 있었으나, 복잡한 프로그램을 작성하는 것에서 한계가 있었다. 복잡한 프로그램 작성에 대한 한계에 부딪히는 중 1954년 IBM의 존 배커스(John Backus)가 기계어의 복잡한 프로그램 작성의 한계를 없애고, 복잡한 프로그램을 작성할 수 있는 최초의 주요한 언어인 포트란을 개발했다. 포트란은 컴파일 언어였는데, 변수의 이름을 붙일 수 있고, 복잡한 수식을 계산할 수 있었으며, 서브 프로그램과 명령형 언어의 많은 특징을 가지고 있는 언어였다. 그 후 20년간 여러 가지 주요 고급 명령형 프로그래밍 언어들이 발전하였는데, 1950년대 후반과 1960년대에는 수학적 알고리즘을 더 쉽게 표현하기 위해 알골이 개발되었다. 알골은 몇몇 컴퓨터 운영체제의 언어로 쓰이기도 했지만, 1960년에 개발된 코볼과 1964년에 개발된 베이직이 더 프로그래밍 구문을 영어와 비슷하게 표현하였다. 1970년대에는 니클라우스 비르트(Niklaus Wirth)가 파스칼을 개발하고, 데니스 리치(Dennis Ritchie)가 벨 연구소에서 일하던 시절에 C언어를 개발하였으며, 니클라우스 비르트가 계속하여 모듈라-2, 모듈라-3과 오베론을 개발하였다. 미국 국방부의 필요에 따라, 쟌 이시비아와 허니웰에 있는 팀이 에이다를 설계하였는데, 에이다는 보안 프로그래밍 측면에 초점을 맞춰서 설계되었지만, 1983년까지 세부 사항을 완성하지 못하였다.
1980년대에는 명령형의 형태를 띠고 있으나 객체를 지원하기 위해 개발된 객체지향 프로그래밍이 빠르게 성장하였는데, 그 후 20세기의 마지막 20년 동안 상당히 많은 객체지향 언어들이 개발되었다. 1969년에 앨런 케이(Alan Kay)가 처음 스몰토크-80을 생각하고, 1980년에 제록스 팔로알토 연구소(Palo Alto Research Center)에서 출시되었다. 세계 최고의 객체지향 프로그래밍 언어로 알려진 시뮬라 등의 다른 객체지향 언어를 참고하여 비야네 스트롭스트룹(Bjarne Stroustrup)이 C언어를 바탕으로 C++를 설계했으며, C++은 1985년 처음 구현되었다. 1980년대 후반과 1990년대에는 래리 월(Larry Wall)이 1987년 객체지향 언어의 개념을 수용하여 탁월한 명령형 언어인 펄을 출시하였다. 1990년에 귀도 반 로섬(Guido van Rossum)이 파이썬을 출시하면서 1994년에 라스무스 러도프(Rasmus Lerdorf)가 PHP를, 썬 마이크로시스템즈(SUN Microsystems)에서 자바를 출시하였다.[3] 명령형 프로그래밍의 프로그래밍 패러다임을 따르는 프로그래밍 언어의 종류에는 비야네 스트롭스트룹이 개발한 C++, NML, Occam, 제록스 팔로알토 연구소에서 개발된 스몰토크, 스칼라, 스퀵, 알골, 썬 마이크로시스템즈에서 개발된 자바, 존 배커스가 개발한 포트란 등이 있다.[4]
종류[편집]
명령문은 입출력문과 제어문으로 구성되어 있는데, 제어문은 조건문과 반복문, 그리고 분기문으로 구성되어 있다.[5]
입출력문[편집]
입출력문은 기본 입출력 장치인 키보드나 모니터 화면을 통하여 데이터를 입출력하는 명령문이다. C언어는 다른 언어와 다르게 입출력 명령문이 없고, 함수를 통하여 데이터의 입출력을 하고 있으며, 기본 입출력 함수는 printf()함수와 scanf()함수, getchar()함수, 그리고 putchar()함수로 네가지가 있다. printf()함수는 화면상에 상수, 변수의 값, 수식의 값을 나타내며, scanf()함수는 키보드로부터 데이터를 입력 받아 변수에 기억한다. getchar()함수는 표준 입력스트림으로부터 입력을 받는 매크로로 키보드로부터 1개의 문자를 입력받아 변수에 기억하고 putchar()함수는 표준 출력 스트림에 출력하는 매크로로 변수에 기억된 1개의 문자를 화면상에 나타나게 한다.
제어문[편집]
제어문은 위에서 아래로, 좌에서 우로 수행되는 프로그램 실행의 수행 순서를 변경하거나 문장의 흐름을 바꾸고자 할 때 사용한다. 이러한 제어문은 조건문과 반복문, 그리고 분기문으로 구성되어 있다.[5]
조건문[편집]
if문[편집]
if문은 어떤 조건의 참, 거짓 여부에 따라 실행을 제어하는 구조이며, 산술적 비교와 논리적 비교가 가능하다.[6] 이러한 if문에는 어떤 문장을 수행할 지 여부를 결정할 때 사용하는 단순 if문, 경로를 선택할 때 사용하는 선택 if문, 수행 경로가 2개가 넘어갈 때 사용하는 중첩 if문으로 구성이 되어있다. C언어에서는 조건식은 반드시 소괄호로 묶으며, 거짓(false)은 0으로, 0이 아닌 모든 값을 참(ture)로 둔다. 조건이 참이면 조건 문장을 실행하고, 거짓이면 조건 문장 다음을 실행하며, 실행될 문장이 둘 이상인 경우 복합문으로 처리가 가능하다.[5]
- if 문의 구조
/if (조건식) 문장 1 ; 문장 2 ;
/if (조건식) { 문장 1 ; : } 문장 2 ;
이러한 if문에 else 구문을 추가하여 작성이 가능한데, else 구문은 조건식이 거짓인 경우에 수행되는 구문으로, 조건이 참일 때와 거짓일 때 중 하나를 골라 문장을 실행한다.[6] else if와 같은 방식으로 분기를 추가할 수 있는데, else if를 갖는 것은 여러 조건 중 해당하는 문장 실행이 가능하다.[5]
- if ~ else 구조
/if (조건식) 문장 1 ; else
/if (조건식) { 문장 1 ; : } else { 문장 2 ; : } 문장 3 ;
- if ~ else if 구조
/if (조건식1) 문장 1 ; else if (조건식2) 문장 2 ; else 문장 3 ; 문장 4 ;
/if (조건식1) { 문장 1 ; : } else if (조건식2) { 문장 2 ; : } else { 문장 3 ; : } 문장 4 ;
switch ~ case문[편집]
switch문은 조건에 따라 여러 경로 중에 하나를 선택하여 조건이 동일한지의 여부, case 뒤의 상수값과 일치하는지 확인하고 일치하면 분기한다.[6] switch문에서 벗어나려면 break문을 사용해야 하며, switch문을 사용하지 않고 여러 개의 case문을 통과하는 것이 유용하게 사용되기도 한다. default의 경우 넣어주면 case의 상수값에 일치하지 않는 경우를 처리할 때 사용된다.[5]
- break문이 없는 switch ~ case문 구조
/switch (변수 혹은 식) { case 식 1 : 문장 1 ; case 식 2 : 문장 2 ; case 식 3 : 문장 3 ; : case 식 n : 문장 n ; default : 문장 n+1 ; }
switch의 변수 혹은 식의 값이 식 1과 같은 경우에는 문장 1 이후 문장들을 실행하고, 식 2와 같을 경우엔 문장 2 이후 문장들을 실행한다. 만약 어느 것에도 해당되지 않을 경우에는 default로 저장한 문장 n+1을 실핼하며, 이 default문은 생략이 가능하다.[5]
- break문이 있는 switch ~ case문 구조
/switch (변수 혹은 식) { case 식 1 : 문장 1 ; break ; case 식 2 : 문장 2 ; break ; case 식 3 : 문장 3 ; break ; : : case 식 n : 문장 n ; break ; }
switch의 변수 혹은 식의 값이 식 1과 같으면 문장 1만 실행하고, 식 2와 같으면 문장 2만 실행하며, 만약 식 n과 같으면 문장 n만 실행하게 된다. 어느 것에도 해당되지 않을 경우엔 default로 지정된 문장 n+1만을 실행하지만, break가 있는 switch ~ case문 역시 default문은 생락이 가능하다.[5]
반복문[편집]
반복문은 프로그램을 작성하다 같은 작업을 여러 번 반복해야 할 경우 특정 부분을 조건이 만족할 때까지 실행하도록 하는 명령문이다.[6] 이렇게 같은 내용의 문장들을 여러 번 작성하지 않고 원하는 작업을 반복시키는 반복문으로 C 언어에서는 무한정형 선 제어 반복 명령인 while문, 한계성 반복 명령인 for문, 무한정형 후 제어 반복 명령인 do while문이 있다.[5]
while문[편집]
while문은 수식이 거짓이 될 때까지 같은 처리를 반복해서 처리하는 제어구조로 while문의 조건식 값이 참일 때 [블록]({}) 혹은 문장 내용을 실행하고, 결과값이 거짓이면 블록 밖의 문장을 실행한다.[6] 반드시 블록 안에 조건식의 결과값을 변화시키는 문장이 필요하며, 조건식이 잘못 처리될 경우 혹은 조건식에 0이 아닌 상수를 넣으면 무한루프에 빠지게 되므로 조심해야 한다. 무한루프에 빠졌을 경우 break문을 사용하면 무한루프 블록에서 빠져나올 수 있다.[5]
- while문 구조
/while (조건식) { 문장 1 ; 문장 2 ; ••• ; 문장 n ; } 문장 n+1 ;
for문[편집]
for문은 C언어에서 가장 많이 사용하는 명령어 중의 하나로 시작과 종료 조건을 지정해서 일정한 횟수만큼 참인 동안에 해당 문장을 반복 작업을 하기 때문에 한계성 반복 명령이라고 한다.[6] while문이 반복 조건에 의한 반복인 반면, for 문은 제어 변수의 초기화, 반복 조건, 제어 변수의 변화라는 형식으로 기술된다. 반복될 부분이 한 개의 문장이면 [블록]({}) 생략이 가능하다.[5]
- for문 구조
/for (초기식; 조건식; 증감식) { 문장 1 ; 문장 2 ; ••• ; 문장 n ; } 문장 n+1 ;
초기식은 for문의 루프(loop)가 실행되기 전에 단 한번 실행하면 콤마(,) 연산자로 식을 구분하여 여러 개의 식을 기술 할 수 있다. 조건식은 루프의 실행 중 매회 조사를 하며 단 1개의 문장만을 기술 할 수 있고, 조건식이 참인 경우 루프를 반복하며 거짓인 경우 루프를 빠져나가게 된다. 마지막으로 증감식은 루프의 다음 단계를 준비하는 단계로 콤마(,) 연산자로 식을 구분하여 여러 개의 식을 나열할 수 있다.[5]
do while문[편집]
do while문은 초깃값과 최종값, 증감값을 지정하여 반복을 실행하며, while문과 for문은 먼저 조건 수식이 평가된 후 조건이 참 일 때 지정된 처리를 실행하는 반면, do while문은 무조건 한번 do 다음의 문장을 실행한 후 조건 수식을 평가하는 차이가 있다.[6][5]
- do while문 구조
/do { 문장 1 ; 문장 2 ; ••• ; 문장 n ; } while(조건식) 문장 n+1 ;
분기문[편집]
분기문은 반복문을 사용하여 루프가 반복되는 동안 루프로부터 빠져나가기 위해 사용되는데, C언어에서 분기문의 종류로는 goto문, break문, continue문 등이 있다.[5]
goto문[편집]
goto문은 문장의 제어를 무조건적으로 레이블문이 있는 곳으로 이동시킨다. 레이블명은 변수명을 만드는 규칙과 같으며, 레이블명 뒤에 콜론(:)을 붙여서 사용한지만, C언어는 함수형 언어이며, 구조적 언어이기 때문에 만일 goto문을 사용하면 문장의 흐름을 이해하는 데 어려움을 주기 때문에 잘 사용하지 않는다.[5]
continue문과 break문[편집]
continue문은 for, while, do while과 같은 반복문의 루프를 실행하다가 그 이후의 문장들을 실행하지 않고 루프의 조건 체크 부분으로 제어를 옮겨 다음 반복으로 넘어갈 수 있도록 하며, break문은 for, while, do while과 같은 반복문의 루프를 실행하다가 반복문의 루프 부분을 빠져나가게 하는 일을 한다.[5] 특정한 조건이 없으면 무한 처리를 반복하게 되어 무한루프를 하게 되는데, 이를 방지하는 것이 break문과 continue문이다.[6]
특징[편집]
명령문의 특징은 이와 대조되는 개념의 선언형 프로그래밍과 비교하여 볼 수 있다. 명령문은 알고리즘을 명시하고 목표는 명시하지 않는 반면, 선언형 프로그래밍은 목표를 명시하고 알고리즘을 명시하지 않는다.[7] 쉽게 말해서 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 가깝고, 선언형 프로그래밍은 무엇을 할 것인가에 가깝다. 이러한 차이점을 실세계를 예를 들자면, 자동차 운행 방식으로 예를 들 수 있다. 수동 스틱(1종) 자동차는 일일이 속도에 따라 기어를 바꿔 가는 명령형 방식이라고 볼 수 있고, 수동 스틱 자동차와 반대로 오토 스틱(2종) 자동차는 주행을 할 것이라는 선언형 방식이라고 볼 수 있다.[8]
다음은 명령형 프로그래밍의 예제이다.
/const newArr = []; for(let i=0; i〈arr.length; i++){ if(arr[i].length !== 0){ newArr.push(arr[i].charAt(0).toUpperCase() + arr[i].substring(1)) } }
특정 행위를 반복하는 코드인 for문을 이용하는 것은 누구나 작성할 수 있을 정도로 익숙한 로직이지만, 저 안에는 다음과 같은 동작이 수행된다.
- i를 0로 초기화
- i가 arr배열의 길이보다 작다면 구문을 반복 실행
- for문 내부의 코드의 실행이 종료될 때마다 i에 1더하기
- arr배열의 i번째 요소에 접근
- 만약 원소의 길이가 0이 아니면, 원소의 첫 번째 글자를 대문자로 변경
- 이렇게 합쳐진 문자열을 newArr에 push
다음은 위의 명령형 프로그래밍의 예제와 비슷한 선언형 프로그래밍의 예제이다.
/function convert(str) { return str.charAt(0).toUpperCase() + s.substring(1); } const newArr2 = arr.filter(v => v.length !== 0).map(v => convert(v))
- 인자로 받은 문자열의 첫글자만 대문자로 변경하는 함수를 선언
- arr배열에서 원소의 길이가 0이 아닌 것들을 걸러냄
- 걸러진 배열을 순회하면서 1번에서 선언한 함수를 사용해서, 첫글자를 대문자로 변경
이와 같이 명령형 프로그래밍의 예제와 선언형 프로그래밍의 예제의 내부 흐름은 같게 동작하지만, 자잘한 인덱스 변수나 관리에 대해서는 생각할 필요가 없이 간단해졌고, 배열을 순회하면서 걸러내며, 각 원소의 첫 글자를 대문자로 변경해야 하는 문제를 filter로 걸러내고, covert와 map으로 대문자로 변경하여 사고방식의 흐름이 비슷해진 것을 알고 있다.[9]
각주[편집]
- ↑ 〈명령형 프로그래밍〉, 《나무위키》
- ↑ 〈명령형 프로그래밍〉, 《위키백과》
- ↑ 〈명령형 프로그래밍 역사〉, 《위키백과》
- ↑ 〈명령형 프로그래밍 언어〉, 《위키백과》
- ↑ 5.00 5.01 5.02 5.03 5.04 5.05 5.06 5.07 5.08 5.09 5.10 5.11 5.12 5.13 5.14 〈각종 명령문〉, 《홍수열 교수 홈페이지》
- ↑ 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 o달빛천사o, 〈(정보처리기사) 프로그래밍 언어 활용> 1-2. 연산자와 명령문의 활용〉, 《네이버 블로그》, 2021-02-01
- ↑ DwEnn, 〈선언형 / 명령형 프로그래밍〉, 《티스토리》, 2019-08-25
- ↑ 박스여우, 〈명령형 프로그래밍 VS 선언형 프로그래밍〉, 《티스토리》, 2020-01-18
- ↑ 도비 Zereight, 〈명령형? 선언형? 프로그래밍 방식〉, 《티스토리》, 2021-04-06
참고자료[편집]
- 〈명령형 프로그래밍〉, 《나무위키》
- 〈명령형 프로그래밍〉, 《위키백과》
- 〈명령형 프로그래밍 역사〉, 《위키백과》
- 〈명령형 프로그래밍 언어〉, 《위키백과》
- o달빛천사o, 〈(정보처리기사) 프로그래밍 언어 활용〉1-2. 연산자와 명령문의 활용〉《네이버 블로그》, 2021-02-01
- 〈각종 명령문〉, 《홍수열 교수 홈페이지》
- DwEnn, 〈선언형 / 명령형 프로그래밍〉, 《티스토리》, 2019-08-25
- 박스여우, 〈명령형 프로그래밍 VS 선언형 프로그래밍〉, 《티스토리》, 2020-01-18
- 도비 Zereight, 〈명령형? 선언형? 프로그래밍 방식〉, 《티스토리》, 2021-04-06
같이 보기[편집]