검수요청.png검수요청.png

"소프트웨어"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
잔글 (같이 보기)
 
(사용자 4명의 중간 판 30개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''소프트웨어'''(software)란 컴퓨터 프로그램 및 그와 관련된 문서들을 총칭하는 말이다. 간략히 '''S/W''' 또는 '''SW'''라고도 쓴다. S/W의 종류에는 시스템 S/W, 상용 S/W, 응용 S/W가 있다. 반대말은 [[하드웨어]](hardware, H/W, HW)이다. 하드웨어와 소프트웨어의 특성을 모두 가진 [[펌웨어]](firmware)가 있다.
+
'''소프트웨어'''(software)란 컴퓨터 프로그램 및 그와 관련된 문서들을 총칭하는 말이다. 간략히 '''S/W''' 또는 '''SW'''라고도 쓴다. 크게 시스템 소프트웨어와 응용 소프트웨어로 나뉜다. [[컴퓨터]] 기계장치부를 말하는 [[하드웨어]]와 대응되는 개념이다.
  
== 종류 ==
+
{{:인터넷 배너|호스팅}}
=== 시스템 소프트웨어 ===
 
[[시스템 소프트웨어]](system software)는 시스템 운영에 필요한 기본 환경을 제공하는 소프트웨어를 말한다. 간략히 '시스템 S/W'라고 쓴다. 시스템 S/W에는 [[운영체제]](OS), [[웹서버]](Web Server), [[WAS]], [[DBMS]] 등이 있다.
 
  
=== 상용 소프트웨어 ===
+
== 개요 ==
[[상용 소프트웨어]](commercial software)란 상업용으로 판매하는 소프트웨어를 말한다. 간략히 '상용 S/W'라고 한다. 대부분의 상용 S/W는 [[소스 코드]]는 제공하지 않고 최종 실행 코드만 [[패키지 제품]]으로 제공하기 때문에 일부 기능의 변경이나 추가 등 [[커스터마이징]]이 불가능하다. 상용 S/W에는 리포팅 툴, 백업 솔루션, 보안 솔루션, GIS 솔루션 등이 있다. [[셰어웨어]](Shareware), [[애드웨어]](Adware), [[프리웨어]](Freeware) 등도 넓은 의미에서 상용 소프트웨어에 속한다.
+
소프트웨어의 법률상 정의는 컴퓨터, 통신, 자동화 등의 장비와 그 주변장치에 대하여 명령, 제어, 입력, 처리, 저장, 출력, 상호작용이 가능하게 하는 지시, 명령(음성이나 영상정보 등을 포함)의 집합과 이를 작성하기 위하여 사용된 기술서나 그 밖의 관련자료(소프트웨어산업진흥법 제 2조 제1호)이다. 간혹 소프트웨어와 하드웨어가 반대되는 말이라고 생각하는 사람들이 있지만, 둘 다 컴퓨터 시스템을 구성하는 요소로 상호 보완적인 기능을 하는 것뿐 반대되는 말은 아니다.<ref name=“나무위키”>〈[https://namu.wiki/w/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4 소프트웨어]〉, 《나무위키》</ref> 소프트웨어는 컴퓨터 프로그램과 그와 관련된 문서들을 통칭하는 용어로, 기계장치부를 말하는 하드웨어에 대응하는 개념이다. 용도에 따라 다양한 소프트웨어로 나뉘는데, 프로그램 소프트웨어는 [[저장장치]]에 저장된 특정한 목적의 하나 또는 다수의 컴퓨터 [[프로그램]]으로 컴퓨터 하드웨어에 직접 명령어를 주거나 다른 소프트웨어에 입력을 제공함으로써 그것이 수행하도록 구현된 기능을 수행한다. 일상적으로 응용 소프트웨어의 의미로 자주 쓰인다.<ref name=“위키”> 〈[https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4 소프트웨어]〉, 《위키백과》</ref>
  
=== 응용 소프트웨어 ===
+
== 특징 ==
[[응용 소프트웨어]](application software)란 홈페이지 운영이나 업무관리 등 특정한 기능을 수행하기 위해 개별적으로 개발한 소프트웨어를 말한다. 간략히 '응용 S/W' 또는 애플리케이션(application)이라고 한다. 응용 프로그램(application program)이라고도 하며, 줄여서 'AP'라고 쓰기도 한다. 최종 실행 코드뿐 아니라 소스 코드까지 모두 제공하며, 일부 기능의 변경, 추가, 삭제 커스터마이징이 이루어진다. 응용 S/W에는 업무관리시스템(WMS), 콘텐츠관리시스템(CMS), 학습관리시스템(LMS), 지리정보시스템(GIS), 구인구직 프로그램 등이 있다.
+
원래는 문자 그대로의 [[컴퓨터]], 즉 [[메인프레임]], 미니컴퓨터, 마이크로컴퓨터, 퍼스널컴퓨터에서 동작하거나 처리되는 것(프로그램, [[데이터]] 등)만을 소프트웨어라고 불렀지만, [[전화]]를 필두로 손목시계, [[자동차]], 냉장고 등 많은 것들이 컴퓨터화하는 현대에는 소프트웨어의 의미가 계속해서 넓어지고 있다. 동영상이나 음원, 전자책 등은 물론 내비게이션에 탑재되는 지도 역시 소프트웨어로 간주된다. 가장 대표적인 소프트웨어는 [[인터넷]]으로 인류가 만든 것 중 가장 거대하고 널리 이용되는 소프트웨어이다.<ref name=“나무위키”></ref> 소프트웨어는 특정 목적을 가지고 개발되어 수행하는 일이 명백하게 지정되어 있다. 시대와 환경의 변화에 민감하여 시간이 지날수록 그 쓰임새가 급속도로 감소한다는 단점을 가지고 있다.<ref name=“블로그”>청년학술회, 〈[https://m.blog.naver.com/PostView.nhn?blogId=kyac2015&logNo=220666548899&proxyReferer=https:%2F%2Fwww.google.com%2F 소프트웨어란 무엇인가]〉, 《네이버 블로그》, 2016-03-27</ref> 소프트웨어는 비가시성, 비마모성, 비제조성, 복잡성, 복제 가능성, 테스트 및 변경 가능성, 순응성 이렇게 7가지의 특성을 가진다. 비가시성은 소프트웨어는 하드웨어에서 작동하기 때문에 형태가 눈에 보이지 않는다는 것이다. 비마모성은 소프트웨어는 한 번 작성되면 닳지 않는다는 것이고, 비제조성은 소프트웨어 제조가 아닌 소프트웨어 개발을 해야 한다는 것을 뜻한다. 복잡성은 소프트웨어 그 자체로 매우 복잡한 것임을, 복제 가능성은 소프트웨어는 복제할 수 있다는 것을 의미한다. 테스트 및 변경 가능성은 테스트를 진행하고 소프트웨어를 수정할 수 있어야 함을 의미하고, 순응성은 소프트웨어가 한 번 출시하는 것으로 끝나지 않고, 유지 보수를 수행해야 한다는 것을 의미한다.<ref>안경잡이개발자, 〈[https://m.blog.naver.com/PostView.nhn?blogId=ndb796&logNo=221113813297&proxyReferer=https:%2F%2Fwww.google.com%2F (소프트웨어 공학) 8. 소프트웨어 공학 정리]〉, 《네이버 블로그》, 2017-10-10</ref>
 +
 
 +
==역사==
 +
소프트웨어의 최초의 장소가 되는 윤곽(알고리즘)은 19세기 에이다 러브레이스가 계획된 해석기관을 위해 작성하였지만, 실제로 만들어진 것은 없었다. 오늘날 흔히 알려져 있는 컴퓨터의 발명 이전의 소프트웨어에 대한 최초의 이론은 [[앨런 튜링]]이 1935년에 쓴 수필 《Computable numbers with an application to the Entscheidungsproblem》에서 제안되었다. 그러나 우리가 알고 있는 소프트웨어 즉, 저장식 프로그램 [[디지털]] 컴퓨터의 메모리에 저장되는 프로그램들은 1946년 이후에 만들어졌다.<ref name=“위키”></ref> 1954년 폴 니케트(Paul Niquette)가 만들어 냈던 신조어로, 하드웨어는 본래 냄비나 망치 따위의 물건처럼 단단한 물건을 의미하는 단어였는데, 컴퓨터를 구성하는 기계 부분을 일컫는 단어로 의미가 확장되면서, 컴퓨터 내부에서 구동되는 프로그램을 가리켜 소프트웨어라는 단어가 생겼다. 초기의 소프트웨어는 군사적 목적 아래에서 과학, 기술에 필요한 단순 계산이나 데이터의 처리에 활용하기 위해 사용되었다. 산업이 발전함에 따라 기술적 환경이 정보산업, 통신 산업 등 다른 산업과의 융합, 복합 환경에서 활용되고 있다. 소프트웨어는 다양한 산업에서 생산성 향상, 사업 고도화 등 당면한 문제를 해결하는 해결책으로 활용되어 왔기 때문에, 소프트웨어의 역사는 기술의 발전으로만 분석하기보다는 그 시대의 사회, 경제적 이슈와 활용되었던 용도 등과 함께 다차원적으로 이해하는 것이 좋다.
 +
 
 +
===기술 변화===
 +
1964년 최초의 컴퓨터 에니악(ENIAC)이 만들어지면서, 천공 형태의 마이크로 코드화된 소프트웨어가 출현했다. 군사적 목적으로 쓰이다가, 1951년 상업용 판매를 시작했다. 1957년 IBM의 존 베이커스에 의해 고안된 최초의 [[프로그래밍 언어]] [[포트란]](Fortran)이 출현했다. 컴퓨터의 수요가 폭증하면서 보다 작고, 많은 양의 컴퓨터를 판매하게 되었다. 애플리케이션의 개발 수요가 늘어났고 이를 소화하기 위해 최초의 소프트웨어 기업인 CUC, CSC가 탄생했다. 1964년 IBM360 시스템이 개발되면서 운영체제와 애플리케이션이 분리되었다. 컴퓨터가 범용적으로 사용되면서 기업의 업무 생산성 향상을 위해 처음 도입되었다. 4년 후인, 1968년에는 북대서양조약기구(NATO) 과학위원회의 후원으로 소프트웨어 [[엔지니어링]]이라는 분야가 공식적으로 생겼다. 수백 개의 레이더 시스템을 연결하는 등 군사적 목적으로 관련 시스템의 연결이 필요하게 되면서, 1969년 미국 국방부의 고등 연구 계획국인 아파넷(ARPANET)의 네트워크 프로토콜로 [[TCP/IP]]가 등장했다. 상용 소프트웨어 기업인 SAP, [[마이크로소프트]](Microsoft), [[오라클]](Oracle) 등이 1972년 시작되었고, 6년 후 [[바이러스]] 및 정보보호의 개념이 출현 되었다. 1978년대에는 전화선 및 네트워크 등으로 시스템이 연결되었기 때문에 전화 등을 무료로 쓰고자 하는 불법적 시도들이 진행되었고, 제록스의 존 쇼크가 [[네트워크]] 작업을 느리게 하는 웜을 개발하였다. 1980년대부터 [[엠에스도스]](MS DOS), CP/M 등 컴퓨터 [[운영체제]]가 개발되었고, 1991년에는 최초의 공개 소프트웨어인 [[리눅스]]가 출현해 마이크로소프트의 컴퓨터 운영체제 독점이 시작되었다. 정보의 수집과 사용이 자유로워지면서 [[페이스북]](Facebook), [[트위터]](Twitter)와 같은 SNS가 2002년부터 나오기 시작했다. 그 후로 모바일 [[플랫폼]], [[빅데이터]] 등과 관련된 기술들이 생겨나면서 2010년부터는 점점 더 다양한 분야와의 융합, 복합을 통하여 발전 중이다.<ref>박수용·조황희, 〈[http://www.stepi.re.kr/app/report/view.jsp?cmsCd=CM0014&categCd=A0203&ntNo=141 국가 소프트웨어 경쟁력 향상 방안 연구: SW Roadmap]>, 《과학기술정책연구원》</ref>
 +
 
 +
===국내===
 +
대한민국에서 소프트웨어에 대한 공식적인 관심은 1967년에 과학기술처가 전자 계산 조직 개발조정위원회를 설치하면서 시작되었다. 1970년대 초 한글입출력 단말기, 광학문자판독기 처리 기술 등이 개발되어 시험 채점, 경영 정보 시스템 마련 등에 활용되기 시작했다. 1976년~1985년에는 외국 기업과의 기술 제휴를 바탕으로, 소프트웨어 개발이 본격적으로 이루어지기 시작했다. 당시의 기술 개발 사례로는 한글 처리용 단말기인 한글 터미널의 개발, 지리 정보 시스템의 기본 기술인 원격탐사기술의 개발, 병원 종합관리 시스템의 구축 등을 들 수 있다. 이러한 기술들이 잇달아 개발되면서 소프트웨어는 컴퓨터 하드웨어와 별개의 것으로 인식되기 시작했다. 1980년대 중반 이후에는 행정 전산망용 주전산기 개발 사업이나 전전자 교환기 개발사업과 같은 대형 국책사업을 매개로 소프트웨어 산업이 급속히 발전하기 시작했다. 1990년대 들어서는 시스템 공학 연구소를 중심으로 솔루션 개발이 본격적으로 시작되었다. 당시 주요 기술로는 차량 번호판 인식 시스템, 문화재 복원 소프트웨어 등이 있다. 1990년대 중반 이후에는  국가자리정보시스템(national geographical information system)을 개발하는 작업도 추진되었다. 2000년대 들어서는 인터넷을 이용한 서비스 개발이 활발하게 전개되고 있다.<ref>〈[https://terms.naver.com/entry.nhn?docId=2459616&cid=46637&categoryId=46637 소프트웨어]〉, 《네이버 지식백과》</ref>
 +
 
 +
==구분==
 +
소프트웨어는 프로그램과 데이터로 구분된다. 디지털 컴퓨터에 탑재되는 프로그램과 데이터는 모두 [[비트]](0과 1)로 구성되어 있는데, 이를 하드웨어에 입력하고, 탑재시켜야만 구동(프로그램)이나 처리(데이터)가 가능하다. 프로그램과 데이터는 소프트웨어의 두 축이다. 따라서 소프트웨어의 범위 안에 프로그램이 있고, 데이터가 있다. 프로그램은 정해진 규칙에 따라서 어떤 일을 하는 소프트웨어이고, 데이터는 스스로는 아무런 동작도 하지 못하는 소프트웨어다. 데이터는 프로그램에 의해서 수정되고 출력될 뿐이다. 데이터는 프로그램을 실행시킨 후에 프로그램에 의해 자동으로 또는 사용자에 의해 수동으로 불러오기 때문에 소프트웨어를 실행시킨다는 말은 곧 프로그램을 실행시킨다는 말과 같다.
 +
 
 +
===프로그램===
 +
프로그램은 순차적으로 진행되는 소프트웨어를 말한다. 많은 경우 소프트웨어와 프로그램을 같은 격으로 취급한다. 그러나 둘은 명확한 차이가 있다. 프로그램은 소프트웨어의 한 종류로 계획된 순서에 따라서 순차적으로 진행되는 소프트웨어를 뜻한다. 데이터는 순차적인 진행과정이 필요 없는 단순한 내용 자체를 뜻한다. 물론 데이터 역시 소프트웨어의 한 종류에 속한다. 프로그램에는 컴퓨터를 구동시켜주는 운영체제 및 컴퓨터에서 구동되는 [[애플리케이션]], [[유틸리티]], [[악성 코드]] 등이 포함된다. 옛날에는 프로그램을 시스템 소프트웨어, 응용 소프트웨어, 유틸리티의 3가지로 구분했는데, 유틸리티라는 개념이 점차 사라지면서, 프로그램을 시스템 소프트웨어, 응용 소프트웨어, 악성코드([[멀웨어]])로 분류한다.
 +
 
 +
===데이터===
 +
데이터는 스스로 동작하지 못하는 소프트웨어로, 소프트웨어에서 프로그램을 제외한 나머지를 가리킨다. 프로그램을 실행하는데 필요한 데이터는 MP3 음원, 사진, 동영상 파일, 문서 등 매우 다양한 유형이 있다. 이런 데이터 중 사용자(소비자)에게 가치를 제공하는 데이터를 콘텐츠라고 따로 지칭하기도 한다. 대부분의 데이터는 알맞은 프로그램이 있어야만 열람과 처리가 가능하며, 데이터는 이런 응용 프로그램을 이용해  처리하기 위해 특정 형식(포맷)으로 짜여져 있다. 컴퓨터 시스템의 보조기억장치(하드 디스크 등)에서 가장 많은 용량을 차지하고 있는 것이 데이터다. 시스템을 사용하다 보면 데이터는 계속해서 축적되기 때문에, 오늘날 대부분의 PC 사용자들이 시스템 안에 백만 개 단위의 데이터 파일들을 쌓아놓고 산다.<ref name=“나무위키”></ref>
 +
 
 +
==종류==
 +
===용도에 따른 분류===
 +
====시스템 소프트웨어====
 +
[[시스템 소프트웨어]](system software)는 시스템 운영에 필요한 기본 환경을 제공하는 소프트웨어로 컴퓨터 시스템을 근본적으로 구동시키고 효율적으로 운용해 주는 기능을 가진 프로그램들의 모임을 뜻한다. 대표적인 시스템 소프트웨어는 마이크로소프트 [[윈도우]], [[맥]], [[리눅스]] 등의 [[운영체제]], [[컴파일러]], [[데이터베이스]], 네트워크 외에도 Java, .NET 등 런타임이나 언리얼 엔진, 이드텍 엔진 등 다양한 유형의 시스템 소프트웨어들이 있다. 응용 소프트웨어로 구분되는 [[웹]] 브라우저도 시스템 소프트웨어로 볼 수 있는데 이는 웹 사이트가 소프트웨어의 구동 플랫폼이기 때문이다. 실제로 웹 기술을 기반으로 만든 응용 프로그램이 많다. 시스템 소프트웨어는 다른 소프트웨어들이 구동 또는 처리될 수 있는 환경을 만들어주는 플랫폼의 역할을 하는 소프트웨어이기 때문에 플랫폼 소프트웨어라고도 부른다. 시스템 소프트웨어 아래에는 컴퓨터 하드웨어나 운영체제 등의 하위 단계가 있고, 위로는 응용 소프트웨어(프로그램)라는 상위 단계가 있다. 시스템 소프트웨어의 아래에 또 다른 시스템 소프트웨어가 있거나 시스템 소프트웨어 위에 또 다른 시스템 소프트웨어가 있는 경우도 있을 수 있다.
 +
 
 +
* '''운영 체제'''
 +
# 에스도스(MS-DOS) : 마이크로소프트 윈도는 전 세계적으로 점유율 90%에 육박하는 사실상 독과점인 운영체제이다. 점유율이 높기 때문에 악성코드와 [[해킹]] 방법이 가장 집중적으로 개발되고 있어 보안이 취약한 플랫폼이다. 따라서 MS-DOS를 사용할 때는 반드시 보안 솔루션을 이용해야 한다는 등 단점이 많지만, 압도적인 보급률 때문에 거대한 소프트웨어 [[라이브러리]]를 자랑하며, 윈도 버전만 있고 맥이나 리눅스로는 출시되지 않는 소프트웨어 등 대체재가 없는 경우도 종종 있다.
 +
# 유닉스 : [[유닉스]] 계열 운영체제의 원조인 유닉스는 벨 연구소에서 개발되었다. 리눅스는 [[리누스 토르발스]]가 커널을 기반으로 개발한 운영체제로 자유 소프트웨어 진영 중심으로 수많은 배포판을 쏟아내며 여러 사람들의 사랑을 받고 있다. 사용자들이 접속하는 웹 사이트 서버의 대부분이 리눅스 기반이고, 요새 스마트폰에서 쓰이는 [[안드로이드]] 또한 리눅스를 기반으로 하고 있다. [[매킨토시]] 운영체제는 마하(Mach) 커널을 기반으로 만들어진 애플의 운영체제로 애플의 데스크탑, 노트북 제품은 맥 운영체제를 사용한다. 공식 개조 판으로 아이폰에서 쓰이는 iOS가 있고, IBM 계열의 컴퓨터에서 사용하기 위해 일부 사용자들이 변형해서 만든 매킨토시도 있다.
 +
# 안드로이드 : 주로 모바일 기기(스마트폰 등)를 운영하기 위해 만들어진 운영체제로 비교적 가벼우며 범용성이 높다. 21세기에 급격히 확산되며 세계에서 가장 많이 쓰이는 운영체제의 자리를 넘보고 있다.
 +
 
 +
* '''드라이버''' : 주변 기기의 입출력을 통제하는 소프트웨어로 [[마우스]], [[키보드]], [[모니터]] 등을 컴퓨터 본체와 연결시키는 소프트웨어이다. 하는 일이 [[펌웨어]]와 비슷하지만, 펌웨어와는 달리 드라이버는 컴퓨터의 [[CPU]]에서 처리된다. 물론 펌웨어 자체에 기본적인 주변장치 [[드라이버]]가 들어 있는 경우도 많아 펌웨어와 드라이버를 확실하게 구분하기는 어렵다. 예를 들어 거의 모든 컴퓨터의 바이오스(펌웨어)에는 기본적인 키보드와 마우스 드라이버가 내장되어 있어, 운영체제조차 탑재되지 않은 빈껍데기 컴퓨터에서도 바이오스 셋업을 할 수 있다. 다만 이런 내장 드라이버는 정말 기본적인 기능만을 갖고 있고, 주변기기의 성능을 모두 활용하려면 전용 드라이버를 설치해야 하는데, 전용 드라이버는 CPU에서 처리된다.
 +
 
 +
* '''유틸리티''' : 컴퓨터 사용 효율을 올려주는 소프트웨어로, 컴퓨터를 보다 편리하고 안전하게 사용할 수 있도록 돕고, 컴퓨터를 사용하는 데 있어 일어날 수 있는 문제들을 예방하거나 해결하는 역할을 하는 프로그램들이다. 대표적으로 디스크 정리, 파일 압축, 네트워크 구축, 방화벽 등이 있다. 유틸리티와 응용 소프트웨어를 구분하는 기준은 “이 프로그램을 구동할 목적으로 컴퓨터를 장만했다”라고 할 수 있느냐 하는 것인데, 그렇다면 응용 소프트웨어고, 그렇지 않으면 유틸리티다. 20세기까지만 해도 프로그램을 시스템 소프트웨어, 응용 소프트웨어, 유틸리티로 엄격하게 구분했지만, 오늘날 가장 널리 이용되는 시스템 소프트웨어 마이크로소프트 윈도가 각종 유틸리티를 포함하고 있어 유틸리티를 독립된 제품으로 접하기 어렵다. 또한 넓은 관점에서 보면 운영체제의 계정 권한 관리나 자동적인 메모리 관리 등도 있기 때문에 유틸리티를 독립된 범주로 보는 관점은 점차 줄어들고 있다.<ref name=“나무위키”></ref>
 +
 
 +
====응용 소프트웨어====
 +
[[응용 소프트웨어]](application software)란 시스템 소프트웨어라는 플랫폼 위에 구동되는 프로그램으로, 사용자가 원하는 각종 기능을 제공한다. 홈페이지 운영이나 업무관리 등 특정한 기능을 수행하기 위해 개별적으로 개발한 소프트웨어로, 시스템 소프트웨어를 사용하여 실제 사회에서 일어나는 문제들을 풀어주는데 그 종류가 사무 자동화, 수치 연산, 게임 등 다양하다. 응용이 영어로 애플리케이션(application)이기 때문에 그냥 애플리케이션 혹은 앱이라고도 한다. 또는 응용 프로그램(application program)이라고도 하며, 줄여서 'AP'라고 쓰기도 한다. 응용 소프트웨어는 앞에서 말한 것처럼 워드 프로세서,  스프레드시트, 인터넷 브라우저, 동영상 플레이어, 비디오 게임 등 다양한 응용 소프트웨어를 특징짓는 공통점은 이들이 컴퓨터를 사용하는 목적이 되는 프로그램들로, 컴퓨터를 사는 목적이 될 수 있는 프로그램들이다.<ref name=“나무위키”></ref>
 +
* '''악성 코드''' : 제작자가 악의를 가지고 만든 소프트웨어로 컴퓨터 바이러스, [[웜]], 트로얀, [[랜섬웨어]] 등 일명 나쁜 소프트웨어이다. 대부분 프로그램(응용 소프트웨어)이지만, 데이터로만 이루어진 악성 코드도 있다. 그 예로 특정 프로그램에서 정해진 동작을 실시하는 일종의 스크립트인 매크로만으로 구성된 악성 코드가 있다. 간혹 취약점(vulnerability)과 혼동하는 경우가 있는데 [[취약점]]은 말 그대로 소프트웨어가 갖고 있는 결함이 악의적으로 이용될 수 있는 결함을 말한다. 옛날에는 소프트웨어 개발자가 이런저런 목적으로 설치해 둔 뒷문이 [[해커]]에게 발견되어 취약점으로 이용되는 경우가 많았다면, 현재는 소프트웨어가 고도로 복잡해졌기 때문에 개발자가 전혀 의도하지 않은 소프트웨어적 결함이 취약점으로 발견되는 경우가 점점 늘어나고 있다.<ref name=“나무위키”></ref>
 +
 
 +
===판매에 따른 분류===
 +
====상용 소프트웨어====
 +
[[상용 소프트웨어]](commercial software)는 돈을 지불하고 구입해야만 사용이 가능한 소프트웨어로 상업용으로 판매하는 것이다. 커머셜 소프트웨어, 페이웨어 등으로도 불린다. 대부분 유료이며 실행 코드만 제공하고 소스 코드는 배포하지 않는다. 사용자는 소스 코드를 받지 못하기 때문에 개작이 불가능하며 가격을 지불하지 않고서는 복제와 재배포도 허용되지 않는다. 대개 사유 소프트웨어이지만, 자유 소프트웨어 중 상용 소프트웨어인 경우가 종종 있다. 무료 소프트웨어와는 불법 복제의 위험에 노출이 될 수 있다. 일반적으로 시디 키 또는 시리얼이라고 불리는 숫자와 문자의 조합으로 되어 있는 암호를 입력해야 사용할 수 있다. 대부분의 상용 소프트웨어는 [[소스 코드]]는 제공하지 않고 최종 실행 코드만 패키지 제품으로 제공하기 때문에 일부 기능의 변경이나 추가 등 커스터마이징이 불가능하다. 상용 소프트웨어에는 [[리포팅툴]], [[백업 솔루션]], [[보안 솔루션]], [[GIS 솔루션]] 등이 있다. 
 +
 
 +
====자유 소프트웨어====
 +
[[자유 소프트웨어]](free software)는 복사와 사용, 연구, 수정, 배포 등의 제한이 없는 소프트웨어이다. 자유 소프트웨어와 비슷한 것으로 프리웨어가 있다. 프리웨어는 원저작자가 금전적인 권리를 보류하여 누구나 무료로 사용하는 것을 허가하는 공개 소프트웨어이다. 프리웨어는 누구나 무료로 사용할 수 있으며 대표적인 예로 알집, 알씨, 곰플레이어, V3 알약 등이 있다. 무료로 사용할 수 있는 소프트웨어를 의미하는 프리웨어와 자유 소프트웨어는는 다르다는 것을 주의해야한다. 자유 소프트웨어의 일부는 개인이 사용할 때는 프리웨어, 기업이 사용할 때는 상용 소프트웨어가 된다. 소프트웨어 중 자유 소프트웨어의 조건은 만족하지만, 재배포가 불가능한 소프트웨어들이 있는데, 자유 소프트웨어를 정확히 어떻게 정의하는가에 따라 소프트웨어가 자유 소프트웨어가 될 수도 있고, 아닐 수도 있다. 퍼블릭 도메인 소프트웨어, 자유 소프트웨어, 독점 소프트웨어가 모두 사용될 수 있지만, 일반적으로 대가 없이 사용할 수 있는 독점 소프트웨어를 가리키는 경우가 많고, free라는 영어단어를 사용하는 자유 소프트웨어와는 구분된다.<ref>〈[https://ko.wikipedia.org/wiki/%ED%94%84%EB%A6%AC%EC%9B%A8%EC%96%B4 프리웨어]〉, 《위키피디아》</ref> 자유 소프트웨어의 자유는 공짜로 쓸 자유가 아닌, 소스가 공개되어 마음껏 개작할 수 있는 자유를 의미하는 것으로, 유료로 판매될 수도 있다. 그렇다고 해서 프리웨어를 개작할 수 없는 것은 아니다. 개인 소장용으로 개조하여 사용하는 것은 가능하다. 다만 저작자의 허락 없이 재배포하거나, 애드웨어를 넣어 재배포하는 경우 저작권법 위반으로 고소를 당할 수도 있다.<ref>〈[https://namu.wiki/w/%ED%94%84%EB%A6%AC%EC%9B%A8%EC%96%B4 프리웨어]〉, 《나무위키》</ref>
 +
 
 +
====셰어웨어====
 +
[[셰어웨어]](shareware)는 자유롭게 사용하거나 복사할 수 있도록 시장에 공개하고 있는 소프트웨어이다. 체험판, 평가판을 뜻하며, 데모웨어, 평가 소프트웨어라고도 부른다. 돈을 주고 구매하기 전에, 즉 상용 소프트웨어를 구매하기 전에 샘플 도는 홍보차 만드는 프로그램으로 기간이나 기능상의 제한을 둔다. 예를 들어 30일 한정판인 윈도우 체험판의 경우 셰어웨어를 사용하고 있는 것이고, 그 이후에 돈을 주고 윈도우를 사용한다면 상용 소프트웨어를 사용하는 것이다.<ref>정수진, 〈[http://blog.daum.net/942501528/50 상용,예어웨어,프리웨어,공개 소프트웨어의 뜻과 종류]〉, 《네이버 블로그》, 2015-09-24</ref> 크리플 웨어, 트라이얼웨어, 도네이션웨어, 내그웨어 등이 있다.
 +
* '''[[크리플웨어]]'''(crippleware) : 프로그램의 핵심 기능을 제외한 나머지 기능을 공개하여, 사용자가 원하는 기능을 이용하려면 정식 제품을 구매하도록 유도하는 공개 소프트웨어이다.
 +
* '''[[트라이얼웨어]]'''(trialware) : 소프트웨어를 구매하기 전에 미리 사용해 볼 수 있도록 배포 버전으로 제공되는 것으로 상업적인 이용은 불가능하다. 트라이얼 역시 모든 기능을 제공하는 것은 아니지만, 크리플웨어와는 달리 기본적이거나 주요한 기능의 일부만을 사용할 수 있다는 차이점이 있다. 보통 1개월 정도의 무료기간이 있고, 그 후에는 비용을 지불해야 한다.
 +
* '''[[도네이션웨어]]'''(donationware) : 사용자에게 완전한 기능의 소프트웨어를 제공하지만, 프로그래머나 비영리 단체 등에 선택적인 기부를 부탁하는 소프트웨어이다. 기능적으로 어떠한 제한도 없고, 사용자가 기부를 하지 않더라도 문제가 되지 않는다. Vim을 예시로 들 수 있는데, Vim을 단독으로 실행시키면 화면에 “우간다에 사는 가난한 아이를 도와주세요!”라는 문구가 뜬다. 이처럼 모든 기능을 쓸 수 있게 해주지만, 선택적인 기부를 유도하는 소프트웨어를 도네이션웨어라고 한다.
 +
* '''[[내그웨어]]'''(nagware) : 시험 사용 기간이 끝나면 사용자에게 프로그램을 사도록 유도하는 창이 뜨는데, 사용자가 소프트웨어를 등록하는 비용을 지불하도록 상기시키는 것이다. 보통 프로그램이 시작할 때 뜨거나, 사용자가 사용하는 도중 간헐적으로 나타나기도 한다. 어떤 내그웨어는 일정 시간마다 사용자가 프로그램을 계속 사용하기 위해서 기다리도록 한다. 이런 방법을 사용하는 목적은 사용자가 메시지들로 인한 방해를 없애기 위해 등록하게끔 유도하는 것이다. 내그웨어의 경우 과도한 메시지는 오히려 역효과를 내는 경우도 있다.<ref>〈[https://ko.wikipedia.org/wiki/%EC%85%B0%EC%96%B4%EC%9B%A8%EC%96%B4 셰어웨어]〉, 《나무위키》</ref>
 +
 
 +
==개발 단계==
 +
소프트웨어 생명주기라고도 하며, 소프트웨어를 체계적으로 개발하고, 관리하기 위해 개발 과정을 단계별로 나누어 구분한 것이다. 5단계 혹은 6단계로 구분하는데, 6단계의 경우 5단계의 앞에 계획하는 단계를 추가하는 것이다.
 +
 
 +
===요구사항 분석===
 +
사용자의 요구사항을 분석하는 단계로, 고객의 요건 또는 개발하고자 하는 시스템의 목표를 정한다. 세부적으로 타당성을 분석하고 개발 계획을 수행한다. 이때 요건 정의 목록을 시스템화하는데 문제가 없는지, 구현 가능한지 판단해야 한다. 더 세부적으로 보면 개발할 소프트웨어의 기능과 제약조건, 목표 등을 소프트웨어 사용자와 함께 명확히 정의하고, 개발할 소프트웨어의 성격을 정확히 이해하고, 개발 방법과 필요한 개발 자원 및 예산을 예측하는 것이다. 요구사항을 규명하는 것은 많은 시간과 노력을 필요로 하지만, 확실하게 규명할수록 개발과정에서 발생하는 비효율적인 시간과 노력을 절약할 수 있다. 개발될 시스템의 설계 및 품질과 밀접한 관계를 가지고 있어, 고품질의 소프트웨어를 만들기 위해서는 시스템 개발에 앞서 요구사항 분석이 필수적이다. 요구사항 분석 과정은 요구사항 규명, 타당성 조사, 비용과 일정에 대한 제약 설정, 문서화 이 4단계로 이루어진다. 요구사항의 규명은 고객의 요구와 필요가 나오게 된 원인, 배경, 환경 등에 대한 분석을 포함하고 있어야 한다. 타당성 조사는 자원의 투자와 그 이익을 조사하고, 위험에 대한 분석을 수행하는 작업으로 경제적 타당성, 기술적 타당성, 법적 타당성 등을 중심으로 주어진 시간과 예산안에서 시스템을 개발하고, 가능한 빠른 시간 내에 타당성을 평가하는 것이 요구된다. 이는 시스템 개발 비용을 줄이고 생산성과 서비스를 향상시키기 위해 행하여진다. 비용과 일정에 대한 제약 설정은 요구 기능에 대한 소요 비용과 개발 기간의 예측, 제약 조건 및 위험에 대한 평가 등을 설정하는 작업으로, 개발 비용, 개발 일정, 시스템 성능 등에 대해 정확하게 예측을 해야 한다. 마지막으로 문서화는 사용자의 요구사항과 시스템의 기능을 문서화하는 작업으로 요구 명세서가 작성되어야 한다. 고객과 개발 회사 사이의 약속 문서이며, 추후에 발생하는 문제와 변화에 대한 책임을 명확히 규명할 수 있어야 하고, 시스템 개발에 관련된 당사자들의 동의와 서명이 있어야 한다.
 +
 
 +
===설계===
 +
설계 단계에서는 요구사항 분석 과정에서 수집된 요구사항 및 분석한 내용을 시스템으로 구현 가능하도록 구체적인 설계를 한다. 시스템 개념과 상세 설계 등 세세한 사항을 포함하도록 하며, 설계 문서를 작성해야 한다. 설계를 어떻게 하느냐에 따라 품질에 직접적인 영향을 미치며, 부적절한 설계는 추후에 시스템 변화를 야기하여 많은 유지 보수비용이 들 수 있다. 시스템을 각각의 구성 요소들로 분할한 뒤, 구성 요소들 사이에 주고받는 정보의 소통을 최소화 시키고 각 구성 요소의 독립성이 유지되도록 시스템을 분할 설계해야 한다.  또한 비용, 소요 시간, 용량, 그리고 신뢰성 등에 대한 연구가 요구되며, 현실과 예산에 맞는 최적의 설계 방법을 선택해야 한다. 설계 명세서에는 [[엔지니어]]의 관점에서 소프트웨어를 어떻게 구현할 것인지를 기술해야 한다.
 +
 
 +
===구현===
 +
말 그대로 앞의 과정들을 통해 설계한 설계 명세서를 바탕으로 시스템을 구현하는 것으로, 소프트웨어 구현을 위한 코딩 작업을 하는 것이다. 결과물로 실행 코드, 즉 컴퓨터 프로그램이 있어야 한다. 코딩을 할 때는 높은 가독성을 가져야 하고, 코드가 간결하고 명확해야 한다는 원칙이 있다. 소프트웨어 시스템 구현에서 발생하는 어려움은 대부분 분석과 설계의 잘못에 의한 것으로 설계가 바르게 작성이 되면, 구현은 상대적으로 단순한 기계적인 과정이다. 이때 주의할 점은 운영체제나 표준 라이브러리 등이 앞에서 작성한 요구 명세서와 설계 명세서를 바탕으로 정해져야 한다는 것이다.
 +
 
 +
===테스트===
 +
이 단계에서는 구현된 시스템이 정상 작동하는지, 요건과 부합하는지를 테스트한다. 구현된 소프트웨어의 오류를 발견하고 수정하는 것을 목표로 한다.<ref>codedragon, 〈[https://codedragon.tistory.com/9099 소프트웨어의 개발 5단계]〉, 《티스토리》</ref> 시스템을 테스트하는 것은 개발 전 과정에 대하여 체계적으로 점검할 수 있는, 품질 보증 활동의 중요한 일부분이며, 지금까지 한 모든 과정에 대한 최종 점검을 포함하고 있다. 테스트단계의 주요 작업에는 단위 [[모듈]]을 테스트하는 단위 테스트, 모듈 간 통합 테스트를 하는 통합 테스트, 요구 사항과 일치하는지를 테스트하는 적합성 테스트, 시스템 복구, 보안, 성능 등을 테스트하는 시스템 테스트 등이 있다. 고품질의 소프트웨어를 개발하기 위해서는 각 과정마다 품질 보증을 위한 절차가 필요하며, 공식적인 검토회 등을 통하여 오류를 발견하고 수정하는 작업이 필요하다. 체계적인 테스트를 위해서는 테스트 계획서가 필요하다. 계획서에는 시험 진행 단계, 시험에 사용되는 데이터 및 시험의 제약 등이 기술되어야 한다. 테스트 결과서 또한 작성되어야 한다. 테스트를 통하여 오류를 찾고 올바르게 수정하여 프로그램을 작동시킬 수는 있지만, 그렇다고 해서 프로그램이 완전하고 정확하다고 증명할 수는 없다.
 +
 
 +
===유지보수===
 +
구현된 시스템을 실제로 배포하고, 운영하는 과정에서 발생하는 것으로 시스템 변경에 의한 요구분석, 설계, 구현, 시험이 모두 재수행 되어야 하며, 관련 문서의 수정도 필요하므로 체계적인 관리가 필요하다. 여러 가지 보고서나 자료가 있어야 한다. 추가 수정 요구 사항 검토 및 반영, 장애 및 오류 발생 시 대처와 복구, 시스템 및 서비스 운영, 유지보수 보고, 역공학 또는 재공학 필요성 검토 등 여러 가지 주요 작업들이 있다. 경우에 따라 지속적인 모니터링 및 시스템 운영들을 요구한다.<ref>〈[http://elearning.kocw.net/contents4/document/lec/2013/Uiduk/Kimkyungdeok/2.pdf 제 2 장 소프트웨어 개발 단계]〉</ref>
 +
 
 +
==프로세스 모델==
 +
소프트웨어를 개발하거나 유지, 보수할 목적으로 수행되는 활동 일체 또는 절차를 의미한다. 소프트웨어 [[프로세스]]를 만드는 이유는 누가 어떤 활동을 언제 할지를 정하고, 소프트웨어를 만들기 위해 필요한 행동들을 명확히 하는 것이다. 소프트웨어 프로세스의 특성으로는 이해성, 가시성, 지원성, 수용성, 신뢰성, 견고성, 유지 보수성, 신속성 등이 있다. 가시성은 공정이 끝났을 때 눈에 보이는 것이 있는가, 지원성은 도구들이 지원되고 있는가, 수용성은 수용이 가능한가, 신뢰성은 사전에 오류를 잡아낼 수 있는가, 견고성은 바이러스에 면역이 되어있는가, 유지 보수성은 조직의 변경 요구를 얼마나 빨리 맞출 수 있는가, 신속성은 제품이 얼마나 빨리 오는가를 의미한다.<ref>아보카도, 〈[https://blog.naver.com/passionaim/221488352901 소프트웨어 / 소프트웨어 공학 / 발전과정 / 소프트웨어 프로세스 특성]〉, 《네이버 블로그》, 2019-03-24</ref> 프로세스 모델이 있다면 전체 프로세스의 이해에 도움을 주고, 구조화된 방법을 개발에 적용시킬 수 있을 뿐만 아니라 지원사용에 대한 사전 계획, 통제가 가능하게 하고, 시스템 개발 과정을 추적하고 관리할 수 있게 해준다. 주요 프로세스 활동에는 소프트웨어의 기능과 운영상 제약 조건을 정하는 소프트웨어 명세, 소프트웨어를 설계하고 프로그래밍하는 소프트웨어 개발, 고객이 원하는 것을 수행하는지 검사하는 소프트웨어 검증, 소프트웨어를 유지 및 보수하는 소프트웨어 진화가 있다. 개발 조직에 따라, 프로젝트 유형에 따라 각각 다른 프로세스를 적용해야 한다. 선형순차적 모델과 진화적 프로세스 모델이 있는데 선형 순차적 모델은 폭포수 모델, V 모델 이 2가지 밖에 없다.
 +
 
 +
===폭포수 모델===
 +
대표적인 선형순차적 모델로, 개발의 흐름이 마치 폭포수처럼 지속적으로 아래로 향하는 것처럼 보이는 데서 이름이 붙여졌다. 앞에서 본 요구사항 분석, 설계, 구현, 테스트, 유지보수 단계 외에 통합 단계가 하나 더 있다. 소프트웨어 요구사항 기술, 설계, 구현, 테스트, 통합, 유지보수가 각각 순차적으로 진행되어야 한다. 다음 단계에 오류가 넘어가지 않도록 하려면 앞 단계에서 결과물이 완벽한 수준으로 작성되어야 하기 때문에 각 단계는 앞 단계가 완료되어야만 다음 단계를 수행할 수 있다. 사용자가 가시적인 결과를 중간에 확인할 수 없다. 그렇지만 관리가 용이하고, 체계적인 문서화가 가능하기 때문에 요구사항의 변화가 적은 프로젝트에 적합하다.
 +
 
 +
===V모델===
 +
산출물 중심의 폭포수 모델을 확장하여 각 개발 단계를 검증하는 것에 초점을 맞춘 것으로, 크게 검증단계와 유효화 단계 2가지로 나뉜다. 검증단계는 요구분석, 시스템 설계, 아키텍쳐 설계, 모듈 설계로 이 과정들이 끝나면 코딩을 진행한다. 이후 각 설계가 제대로 진행되었는지 확인하기 위해서 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트가 진행된다. 단위 테스트는 모듈 확인, 통합 테스트는 인터페이스 확인, 시스템 테스트는 기능 확인, 인수 테스트는 요구 확인을 위한 것이다. 코딩을 중심으로 알파벳 V자 모양이 되기 때문에 V 모델이라고 한다. 개발 생명 주기의 각 단계와 그에 상응하는 소프트웨어 시험 각 단계의 관계를 보여주고, 각 단계마다 상세한 문서화를 통해 작업을 진행한다. 테스트 설계와 같은 테스트 활동은 코딩 이후가 아닌 프로젝트 시작과 동시에 함께 시작한다는 것이 특징이고, 전체적으로 많은 양의 프로젝트 비용과 시간을 감소할 수 있다.
 +
 
 +
===프로토 타입 모델===
 +
진화적 프로세스의 대표로, 정식 절차에 따라 완전한 소프트웨어를 만들기 전에 사용자의 요구를 받아 일단 모형을 만들고 이 모형을 사용자와 의사소통하는 도구로 활용하는 방식이다. 요구사항 정의 및 분석, 프로토타입 설계, 프로토타입 개발, 사용자의 평가, 구현 추가 및 수정순으로 진행된다. 반복된 요구사항 정의를 통해 사용자 요구가 충분히 반영된 요구 분석 명세서를 작성할 수 있고, 프로토타입이 의사소통 도구로 활용될 수 있다. 또한 초기 프로토타입 사용을 통해 새로운 요구사항을 발견할 수 있고, 프로토타입 사용을 통한 완성품의 예측이 가능하다는 장점이 있다. 다만 반복적 개발을 해야 하기 때문에 투입 인력 및 비용의 산정과 프로토타이핑 과정에 대한 통제 및 관리가 어렵고, 중간 산출물 생성의 어려움이 있을 뿐만 아니라, 불명확한 개발 범위로 인해 개발이 종료되거나 목표가 불확실하다는 단점이 있다.
 +
 
 +
===나선형 모델===
 +
프로토 타입에 위험 분석 과정을 더한 것으로 위험 분석의 대상이 되는 요소에는 빈번하게 변경되는 요구사항,  팀원들의 경험 부족, 결속력이 떨어지는 팀, 프로젝트 관리 부족 등이 있다. 계획 및 요구 분석 단계, 위험 분석 단계, 개발 단계, 사용자 평가 단계 총 4단계로 진행된다. 사전 위험 분석을 통해 돌출 위험 요소를 감소 시켜, 프로젝트 중단 확률을 감소시킬 수 있고, 사용자 평가에 의한 개발 방식을 사용해 요구가 충분히 반영되어 사용자의 불만을 감소시킬 수 있다는 장점이 있다. 단점으로는 반복적 개발에 의한 프로젝트 기간 연장이 가능하고, 반복 횟수 증가에 따라 위험요소도 많기 때문에 프로젝트 관리가 어려워진다. 프로토타입과 다른 점은 위험 분석 과정이 있다는 것이기 때문에 위험 요소를 관리하는 것이 중요한데, 이는 위험 전문가 필요에 따라 추가 비용이 발생하는 등의 부담이 될 수 있다.
 +
 
 +
===통합 프로세스(UP) 모델===
 +
통합 프로세스 모델은 폭포수 모델의 문제점을 해결하기 위해 반복적인 개발을 하는 방식으로, 반복적이고 점진적이다. 아키텍처의 정의를 중요하게 생각하여 쓰임새와 물질을 토대로 [[아키텍처]]를 먼저 구축한 뒤 소프트웨어를 구현한다. 아키텍처와 객체 지향이 중요해짐에 따라 활용도가 증가했다. 도입 단계, 구체화 단계, 구축 단계, 전이 단계가 있는데, 이 과정들이 반복해서 진행된다. 점증적으로 개발해 나감으로써 기술적 또는 요구사항 변경 등에 대한 위험 요소를 초기에 완화시킬 수 있다. 발주자의 실제 요구 사항에 근접한 시스템을 만들 수 있고, 이전 반복을 통해 얻은 교훈은 다음 반복의 피드백으로 작용할 수 있다. 이러한 반복이 거듭될수록 노하우가 생기고, 개발자로서의 스킬이 숙달되는 것이다.
 +
 
 +
===애자일 프로세스 모델===
 +
애자일(agile)은 “날렵한”, “민첩한”이란 뜻으로 애자일 프로세스 모델은 고객의 요구에 민첩하게 대응하고, 그때그때 주어지는 문제를 풀어나가는 방법이다. 프로세스와 도구 중심이 아닌 개개인과의 상호 소통을 중시하고, 문서 중심이 아닌, 실행 가능한 소프트웨어를 중시한다. 또한 계약과 협상 중심이 아닌, 고객과의 협력을 중시하고, 계획이 중심이 아닌 변화에 대한 민첩한 대응을 중시한다. 반복적인 개발을 통한 잦은 출시를 목표로 한다.<ref>ForzaCoding, 〈[https://milancode.tistory.com/4 소프트웨어 개발단계 : 프로세스 모델]〉, 《티스토리》, 2020-03-08</ref>
 +
 
 +
==발전==
 +
===소프트웨어 공학===
 +
소프트웨어의 개발, 운용, 유지보수 생명 주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문이다. 공학은 업무분야에서 문제 발생 시, 실무자가 적절한 해답을 찾을 수 있도록 체계적으로 정리된 기술적 지식을 제공하는 것이다. 공학을 소프트웨어에 적용한 것으로 낮은 예산 비용으로 사용자가 만족할 수 있는 시간 내에 효율적으로 고품질의 소프트웨어를 개발하는 것이 목표다. 좀 더 쉽게 설명하면, 인류의 이익을 증진을 위한 새로운 제품, 도구들을 소프트웨어와 관련된 원리, 지식, 도구 등을 활용하여 만드는 것이다. 여러 형태로 정의가 가능한데, 전자전기기술자협회(IEEE)는 소프트웨어의 개발, 운용, 유지보수, 폐기 처분에 대한 체계적인 접근 방안으로, 페얼리(Fairley)는 비용과 기간 내에 소프트웨어를 체계적으로 생산하고 유지보수 하는데 관련된 기술적이고 관리적인 원리, 보엠(Boehm)은 과학적인 지식을 소프트웨어 설계와 제작에 응용하는 것이며, 이를 개발, 운용, 유지보수 하는데 필요한 문서 작성 과정으로 정의했다.<ref>동그리동동닷컴, 〈[https://wondong2.tistory.com/11 1장 소프트웨어 공학의 개요]〉, 《티스토리》, 2017-02-06</ref> 소프트웨어공학의 주요 영역에는 아키텍처, 프로세스, 개발 도구, 관리, 요구 공학 등이 있다. 소프트웨어의 복잡도가 나날이 높아지면서, 원칙이나 순서 없이 개발하기 어려워짐에 따라 소프트웨어 공학에 대한 깊은 이해가 요구된다. 소프트웨어 개발에 있어 예산 산정이나 기한 예측의 어려움이 있고, 유지 보수의 중요성, 하드웨어의 발전, 소프트웨어의 필요성 증가, 좀 더 크고 복잡한 소프트웨어 시스템 요구 등의 이유로 소프트웨어 공학의 필요성은 점점 높아지고 있다. 소프트웨어 공학에는 방법, 도구, 프로세스, 패러다임 4가지의 분야가 있다.
 +
* 방법 : 소프트웨어 개발에 사용되는 기법을 말하는 것으로, 객체 지향 분석을 예로 들 수 있다.
 +
* 도구 : 자동화된 시스템을 말하는 것으로, 설계, 프로그래밍 테스트 도구를 말한다.
 +
* 프로세스 : 도구와 방법을 적용하는 순서를 말하는 것으로, 프로세스에 따라 효율이 결정된다.
 +
* 패러다임 : 방법론을 일컫는다(구조적, 객체 지향적 방법론)<ref>알랭_드, 〈[https://luv-n-interest.tistory.com/290 소프트웨어공학(1) 필요성과 특징]〉, 《티스토리》, 2020-03-29</ref>
 +
 
 +
===소프트웨어 산업===
 +
소프트웨어의 개발, 제작, 생산, 유통 등과 이에 관련된 서비스 및 정보 시스템의 구축, 운영 등과 관련된 산업이며, 개발 단계부터 소비자가 최종적으로 사용하기까지 공급과 관련된 모든 생산적 활동 전반을 포함한다. 독립형(패키지 소프트웨어), 중간재([[임베디드]] 소프트웨어), 서비스형(IT 서비스) 산업으로 구분된다. 멀티미디어화의 진전과 인터넷의 급속한 성장 등 정보사업의 환경변화에 따라 급속한 성장을 지속하고 있는 분야로 정보 사업의 줄기가 되고 있다. 범위가 매우 넓어 생산품이 수십만 가지가 넘고, 각 생산품에 대한 구분 자체가 모호하다. 관련 기술 또한 끊임없이 발전, 개선되고 있다.<ref>김성일 기자, 〈[https://www.futurekorea.co.kr/news/articleView.html?idxno=34914 (시장분석) 소프트웨어 산업의 특성과 시장 현황]〉, 《미래한국》, 2016-12-14</ref> 소프트웨어 산업의 분야는 매우 다양한데, 소프트웨어정책 연구소에서 2020년 주목해야할 사업 10가지로 자율형 IoT 기대감 증대, 교육을 위한 인공지능, 금융권 AI 투자 본격화, 의료 빅데이터 개방, 지능형 물류 로봇 시장의 성장, [[설명가능 인공지능]](eXplainable AI, xAI)의 현실화, [[모바일 폼팩터]]의 혁신, 에너지 산업의 소프트웨어융합 가속화, 클라우드 게임 시장의 선점 경쟁, 언택트(untact) 서비스 영역 확대가 있다.
 +
 
 +
===소프트웨어 특허===
 +
소프트웨어 특허는 컴퓨터 프로그램을 이용한 컴퓨터 운용에 관한 특허를 말하는 것으로, 많은 나라에서 소프트웨어에 대한 특허를 인정하고 있지만, 소프트웨어 특허에 대한 명확한 정의는 없다. 소프트웨어에 대한 특허가 허용되어야 하는지에 대해서 소프트웨어가 특허된다면 특허가 가능한 소프트웨어와 특허가 가능하지 않은 소프트웨어의 경계는 무엇인가, 특허에 요구되는 진보성 기준을 어떻게 적용해야 하는가, 소프트웨어 특허가 기술 혁신을 저해하는 것은 아닌가 하는 등의 논점이 존재한다. 대한민국에서 소프트웨어 특허를 받기 위해서는 3가지 정도의 요건을 만족해야 한다. 먼저 발명의 성립성과 산업상 이용 가능성을 갖추어 발명의 대상이 되어야 하고, 공지된 선행기술보다 신규 하거나, 진보된 발명이어야 한다. 마지막으로 명세서 및 청구범위가 명확하고 간결하게 기재되어있어야 한다. 다만 컴퓨터 프로그램 언어 자체는 특허대상에서 제외된다. 특허를 받을 수 있는 범위는 크게 방법의 발명과 물건의 발명으로 나뉜다. 물건의 발명은 장치 청구항, 컴퓨터로 판독 가능한 기록 매체 청구항, 데이터 기록 매체 청구항, 기록 매체에 저장된 컴퓨터 프로그램 청구항(또는 프로그램에 준하는 청구항) 등이 있다.<ref>박상현, 〈[https://sigpl.or.kr/conf/2017/pdf/sigpl08_shpark.pdf 소프트웨어 특허의 이해]〉, 《정보과학회》, 2017-08-10</ref> 한쪽에서는 소프트웨어 침해가 기술 혁신과 연구개발을 방해하고, 경쟁 소프트웨어의 출현을 막아 선택권을 줄일 뿐만 아니라 비용을 전적으로 중소기업이나 개인이 부담해야하는 불균형을 초래하기 때문에 폐지해야한다는 목소리도 나오고 있다. 이 외에도 특허권의 보호기간은 20년인데 소프트웨어는 시대에 발맞추어 가는 것이기 때문에 20년 후에는 그 가치가 낮아질 가능성 등 소프트웨어 폐지를 주장하는 근거는 여러 가지가 있다.
 +
 
 +
{{각주}}
 +
 
 +
==참고자료==
 +
*〈[https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4 소프트웨어]〉, 《위키백과》
 +
*〈[https://namu.wiki/w/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4 소프트웨어]〉, 《나무위키》
 +
*박수용·조황희, 〈[http://www.stepi.re.kr/app/report/view.jsp?cmsCd=CM0014&categCd=A0203&ntNo=141 국가 소프트웨어 경쟁력 향상 방안 연구: SW Roadmap]>, 《과학기술정책연구원》
 +
*〈[https://terms.naver.com/entry.nhn?docId=2459616&cid=46637&categoryId=46637 소프트웨어]〉, 《네이버 지식백과》
 +
*〈[https://ko.wikipedia.org/wiki/%ED%94%84%EB%A6%AC%EC%9B%A8%EC%96%B4 프리웨어]〉, 《위키피디아》
 +
*〈[https://namu.wiki/w/%ED%94%84%EB%A6%AC%EC%9B%A8%EC%96%B4 프리웨어]〉, 《나무위키》
 +
*〈[https://ko.wikipedia.org/wiki/%EC%85%B0%EC%96%B4%EC%9B%A8%EC%96%B4 셰어웨어]〉, 《나무위키》
 +
*codedragon, 〈[https://codedragon.tistory.com/9099 소프트웨어의 개발 5단계]〉, 《티스토리》
 +
*〈[http://elearning.kocw.net/contents4/document/lec/2013/Uiduk/Kimkyungdeok/2.pdf 제 2 장 소프트웨어 개발 단계]〉
 +
*정수진, 〈[http://blog.daum.net/942501528/50 상용,예어웨어,프리웨어,공개 소프트웨어의 뜻과 종류]〉, 《네이버 블로그》, 2015-09-24
 +
*청년학술회, 〈[https://m.blog.naver.com/PostView.nhn?blogId=kyac2015&logNo=220666548899&proxyReferer=https:%2F%2Fwww.google.com%2F 소프트웨어란 무엇인가]〉, 《네이버 블로그》, 2016-03-27
 +
*박상현, 〈[https://sigpl.or.kr/conf/2017/pdf/sigpl08_shpark.pdf 소프트웨어 특허의 이해]〉, 《정보과학회》, 2017-08-10
 +
*김성일 기자, 〈[https://www.futurekorea.co.kr/news/articleView.html?idxno=34914 (시장분석) 소프트웨어 산업의 특성과 시장 현황]〉, 《미래한국》, 2016-12-14
 +
*동그리동동닷컴, 〈[https://wondong2.tistory.com/11 1장 소프트웨어 공학의 개요]〉, 《티스토리》, 2017-02-06
 +
*안경잡이개발자, 〈[https://m.blog.naver.com/PostView.nhn?blogId=ndb796&logNo=221113813297&proxyReferer=https:%2F%2Fwww.google.com%2F (소프트웨어 공학) 8. 소프트웨어 공학 정리]〉, 《네이버 블로그》, 2017-10-10
 +
*아보카도, 〈[https://blog.naver.com/passionaim/221488352901 소프트웨어 / 소프트웨어 공학 / 발전과정 / 소프트웨어 프로세스 특성]〉, 《네이버 블로그》, 2019-03-24
 +
*ForzaCoding, 〈[https://milancode.tistory.com/4 소프트웨어 개발단계 : 프로세스 모델]〉, 《티스토리》, 2020-03-08
 +
*알랭_드, 〈[https://luv-n-interest.tistory.com/290 소프트웨어공학(1) 필요성과 특징]〉, 《티스토리》, 2020-03-29
  
 
== 같이 보기 ==
 
== 같이 보기 ==
16번째 줄: 139번째 줄:
 
* [[프로그램]]
 
* [[프로그램]]
 
* [[프로그래밍 언어]]
 
* [[프로그래밍 언어]]
* [[스크립트 언어]]
+
* [[임베디드]]
* [[객체 지향 프로그래밍]]
 
  
[[분류:소프트웨어]]
+
{{소프트웨어|검토 필요}}
[[분류:프로그램]]
+
{{정보통신}}

2024년 11월 4일 (월) 00:39 기준 최신판

소프트웨어(software)란 컴퓨터 프로그램 및 그와 관련된 문서들을 총칭하는 말이다. 간략히 S/W 또는 SW라고도 쓴다. 크게 시스템 소프트웨어와 응용 소프트웨어로 나뉜다. 컴퓨터 기계장치부를 말하는 하드웨어와 대응되는 개념이다.

아사달 스마트 호스팅 가로 배너 (since 1998).jpg
이 그림에 대한 정보
[아사달] 스마트 호스팅

개요[편집]

소프트웨어의 법률상 정의는 컴퓨터, 통신, 자동화 등의 장비와 그 주변장치에 대하여 명령, 제어, 입력, 처리, 저장, 출력, 상호작용이 가능하게 하는 지시, 명령(음성이나 영상정보 등을 포함)의 집합과 이를 작성하기 위하여 사용된 기술서나 그 밖의 관련자료(소프트웨어산업진흥법 제 2조 제1호)이다. 간혹 소프트웨어와 하드웨어가 반대되는 말이라고 생각하는 사람들이 있지만, 둘 다 컴퓨터 시스템을 구성하는 요소로 상호 보완적인 기능을 하는 것뿐 반대되는 말은 아니다.[1] 소프트웨어는 컴퓨터 프로그램과 그와 관련된 문서들을 통칭하는 용어로, 기계장치부를 말하는 하드웨어에 대응하는 개념이다. 용도에 따라 다양한 소프트웨어로 나뉘는데, 프로그램 소프트웨어는 저장장치에 저장된 특정한 목적의 하나 또는 다수의 컴퓨터 프로그램으로 컴퓨터 하드웨어에 직접 명령어를 주거나 다른 소프트웨어에 입력을 제공함으로써 그것이 수행하도록 구현된 기능을 수행한다. 일상적으로 응용 소프트웨어의 의미로 자주 쓰인다.[2]

특징[편집]

원래는 문자 그대로의 컴퓨터, 즉 메인프레임, 미니컴퓨터, 마이크로컴퓨터, 퍼스널컴퓨터에서 동작하거나 처리되는 것(프로그램, 데이터 등)만을 소프트웨어라고 불렀지만, 전화를 필두로 손목시계, 자동차, 냉장고 등 많은 것들이 컴퓨터화하는 현대에는 소프트웨어의 의미가 계속해서 넓어지고 있다. 동영상이나 음원, 전자책 등은 물론 내비게이션에 탑재되는 지도 역시 소프트웨어로 간주된다. 가장 대표적인 소프트웨어는 인터넷으로 인류가 만든 것 중 가장 거대하고 널리 이용되는 소프트웨어이다.[1] 소프트웨어는 특정 목적을 가지고 개발되어 수행하는 일이 명백하게 지정되어 있다. 시대와 환경의 변화에 민감하여 시간이 지날수록 그 쓰임새가 급속도로 감소한다는 단점을 가지고 있다.[3] 소프트웨어는 비가시성, 비마모성, 비제조성, 복잡성, 복제 가능성, 테스트 및 변경 가능성, 순응성 이렇게 7가지의 특성을 가진다. 비가시성은 소프트웨어는 하드웨어에서 작동하기 때문에 형태가 눈에 보이지 않는다는 것이다. 비마모성은 소프트웨어는 한 번 작성되면 닳지 않는다는 것이고, 비제조성은 소프트웨어 제조가 아닌 소프트웨어 개발을 해야 한다는 것을 뜻한다. 복잡성은 소프트웨어 그 자체로 매우 복잡한 것임을, 복제 가능성은 소프트웨어는 복제할 수 있다는 것을 의미한다. 테스트 및 변경 가능성은 테스트를 진행하고 소프트웨어를 수정할 수 있어야 함을 의미하고, 순응성은 소프트웨어가 한 번 출시하는 것으로 끝나지 않고, 유지 보수를 수행해야 한다는 것을 의미한다.[4]

역사[편집]

소프트웨어의 최초의 장소가 되는 윤곽(알고리즘)은 19세기 에이다 러브레이스가 계획된 해석기관을 위해 작성하였지만, 실제로 만들어진 것은 없었다. 오늘날 흔히 알려져 있는 컴퓨터의 발명 이전의 소프트웨어에 대한 최초의 이론은 앨런 튜링이 1935년에 쓴 수필 《Computable numbers with an application to the Entscheidungsproblem》에서 제안되었다. 그러나 우리가 알고 있는 소프트웨어 즉, 저장식 프로그램 디지털 컴퓨터의 메모리에 저장되는 프로그램들은 1946년 이후에 만들어졌다.[2] 1954년 폴 니케트(Paul Niquette)가 만들어 냈던 신조어로, 하드웨어는 본래 냄비나 망치 따위의 물건처럼 단단한 물건을 의미하는 단어였는데, 컴퓨터를 구성하는 기계 부분을 일컫는 단어로 의미가 확장되면서, 컴퓨터 내부에서 구동되는 프로그램을 가리켜 소프트웨어라는 단어가 생겼다. 초기의 소프트웨어는 군사적 목적 아래에서 과학, 기술에 필요한 단순 계산이나 데이터의 처리에 활용하기 위해 사용되었다. 산업이 발전함에 따라 기술적 환경이 정보산업, 통신 산업 등 다른 산업과의 융합, 복합 환경에서 활용되고 있다. 소프트웨어는 다양한 산업에서 생산성 향상, 사업 고도화 등 당면한 문제를 해결하는 해결책으로 활용되어 왔기 때문에, 소프트웨어의 역사는 기술의 발전으로만 분석하기보다는 그 시대의 사회, 경제적 이슈와 활용되었던 용도 등과 함께 다차원적으로 이해하는 것이 좋다.

기술 변화[편집]

1964년 최초의 컴퓨터 에니악(ENIAC)이 만들어지면서, 천공 형태의 마이크로 코드화된 소프트웨어가 출현했다. 군사적 목적으로 쓰이다가, 1951년 상업용 판매를 시작했다. 1957년 IBM의 존 베이커스에 의해 고안된 최초의 프로그래밍 언어 포트란(Fortran)이 출현했다. 컴퓨터의 수요가 폭증하면서 보다 작고, 많은 양의 컴퓨터를 판매하게 되었다. 애플리케이션의 개발 수요가 늘어났고 이를 소화하기 위해 최초의 소프트웨어 기업인 CUC, CSC가 탄생했다. 1964년 IBM360 시스템이 개발되면서 운영체제와 애플리케이션이 분리되었다. 컴퓨터가 범용적으로 사용되면서 기업의 업무 생산성 향상을 위해 처음 도입되었다. 4년 후인, 1968년에는 북대서양조약기구(NATO) 과학위원회의 후원으로 소프트웨어 엔지니어링이라는 분야가 공식적으로 생겼다. 수백 개의 레이더 시스템을 연결하는 등 군사적 목적으로 관련 시스템의 연결이 필요하게 되면서, 1969년 미국 국방부의 고등 연구 계획국인 아파넷(ARPANET)의 네트워크 프로토콜로 TCP/IP가 등장했다. 상용 소프트웨어 기업인 SAP, 마이크로소프트(Microsoft), 오라클(Oracle) 등이 1972년 시작되었고, 6년 후 바이러스 및 정보보호의 개념이 출현 되었다. 1978년대에는 전화선 및 네트워크 등으로 시스템이 연결되었기 때문에 전화 등을 무료로 쓰고자 하는 불법적 시도들이 진행되었고, 제록스의 존 쇼크가 네트워크 작업을 느리게 하는 웜을 개발하였다. 1980년대부터 엠에스도스(MS DOS), CP/M 등 컴퓨터 운영체제가 개발되었고, 1991년에는 최초의 공개 소프트웨어인 리눅스가 출현해 마이크로소프트의 컴퓨터 운영체제 독점이 시작되었다. 정보의 수집과 사용이 자유로워지면서 페이스북(Facebook), 트위터(Twitter)와 같은 SNS가 2002년부터 나오기 시작했다. 그 후로 모바일 플랫폼, 빅데이터 등과 관련된 기술들이 생겨나면서 2010년부터는 점점 더 다양한 분야와의 융합, 복합을 통하여 발전 중이다.[5]

국내[편집]

대한민국에서 소프트웨어에 대한 공식적인 관심은 1967년에 과학기술처가 전자 계산 조직 개발조정위원회를 설치하면서 시작되었다. 1970년대 초 한글입출력 단말기, 광학문자판독기 처리 기술 등이 개발되어 시험 채점, 경영 정보 시스템 마련 등에 활용되기 시작했다. 1976년~1985년에는 외국 기업과의 기술 제휴를 바탕으로, 소프트웨어 개발이 본격적으로 이루어지기 시작했다. 당시의 기술 개발 사례로는 한글 처리용 단말기인 한글 터미널의 개발, 지리 정보 시스템의 기본 기술인 원격탐사기술의 개발, 병원 종합관리 시스템의 구축 등을 들 수 있다. 이러한 기술들이 잇달아 개발되면서 소프트웨어는 컴퓨터 하드웨어와 별개의 것으로 인식되기 시작했다. 1980년대 중반 이후에는 행정 전산망용 주전산기 개발 사업이나 전전자 교환기 개발사업과 같은 대형 국책사업을 매개로 소프트웨어 산업이 급속히 발전하기 시작했다. 1990년대 들어서는 시스템 공학 연구소를 중심으로 솔루션 개발이 본격적으로 시작되었다. 당시 주요 기술로는 차량 번호판 인식 시스템, 문화재 복원 소프트웨어 등이 있다. 1990년대 중반 이후에는 국가자리정보시스템(national geographical information system)을 개발하는 작업도 추진되었다. 2000년대 들어서는 인터넷을 이용한 서비스 개발이 활발하게 전개되고 있다.[6]

구분[편집]

소프트웨어는 프로그램과 데이터로 구분된다. 디지털 컴퓨터에 탑재되는 프로그램과 데이터는 모두 비트(0과 1)로 구성되어 있는데, 이를 하드웨어에 입력하고, 탑재시켜야만 구동(프로그램)이나 처리(데이터)가 가능하다. 프로그램과 데이터는 소프트웨어의 두 축이다. 따라서 소프트웨어의 범위 안에 프로그램이 있고, 데이터가 있다. 프로그램은 정해진 규칙에 따라서 어떤 일을 하는 소프트웨어이고, 데이터는 스스로는 아무런 동작도 하지 못하는 소프트웨어다. 데이터는 프로그램에 의해서 수정되고 출력될 뿐이다. 데이터는 프로그램을 실행시킨 후에 프로그램에 의해 자동으로 또는 사용자에 의해 수동으로 불러오기 때문에 소프트웨어를 실행시킨다는 말은 곧 프로그램을 실행시킨다는 말과 같다.

프로그램[편집]

프로그램은 순차적으로 진행되는 소프트웨어를 말한다. 많은 경우 소프트웨어와 프로그램을 같은 격으로 취급한다. 그러나 둘은 명확한 차이가 있다. 프로그램은 소프트웨어의 한 종류로 계획된 순서에 따라서 순차적으로 진행되는 소프트웨어를 뜻한다. 데이터는 순차적인 진행과정이 필요 없는 단순한 내용 자체를 뜻한다. 물론 데이터 역시 소프트웨어의 한 종류에 속한다. 프로그램에는 컴퓨터를 구동시켜주는 운영체제 및 컴퓨터에서 구동되는 애플리케이션, 유틸리티, 악성 코드 등이 포함된다. 옛날에는 프로그램을 시스템 소프트웨어, 응용 소프트웨어, 유틸리티의 3가지로 구분했는데, 유틸리티라는 개념이 점차 사라지면서, 프로그램을 시스템 소프트웨어, 응용 소프트웨어, 악성코드(멀웨어)로 분류한다.

데이터[편집]

데이터는 스스로 동작하지 못하는 소프트웨어로, 소프트웨어에서 프로그램을 제외한 나머지를 가리킨다. 프로그램을 실행하는데 필요한 데이터는 MP3 음원, 사진, 동영상 파일, 문서 등 매우 다양한 유형이 있다. 이런 데이터 중 사용자(소비자)에게 가치를 제공하는 데이터를 콘텐츠라고 따로 지칭하기도 한다. 대부분의 데이터는 알맞은 프로그램이 있어야만 열람과 처리가 가능하며, 데이터는 이런 응용 프로그램을 이용해 처리하기 위해 특정 형식(포맷)으로 짜여져 있다. 컴퓨터 시스템의 보조기억장치(하드 디스크 등)에서 가장 많은 용량을 차지하고 있는 것이 데이터다. 시스템을 사용하다 보면 데이터는 계속해서 축적되기 때문에, 오늘날 대부분의 PC 사용자들이 시스템 안에 백만 개 단위의 데이터 파일들을 쌓아놓고 산다.[1]

종류[편집]

용도에 따른 분류[편집]

시스템 소프트웨어[편집]

시스템 소프트웨어(system software)는 시스템 운영에 필요한 기본 환경을 제공하는 소프트웨어로 컴퓨터 시스템을 근본적으로 구동시키고 효율적으로 운용해 주는 기능을 가진 프로그램들의 모임을 뜻한다. 대표적인 시스템 소프트웨어는 마이크로소프트 윈도우, , 리눅스 등의 운영체제, 컴파일러, 데이터베이스, 네트워크 외에도 Java, .NET 등 런타임이나 언리얼 엔진, 이드텍 엔진 등 다양한 유형의 시스템 소프트웨어들이 있다. 응용 소프트웨어로 구분되는 브라우저도 시스템 소프트웨어로 볼 수 있는데 이는 웹 사이트가 소프트웨어의 구동 플랫폼이기 때문이다. 실제로 웹 기술을 기반으로 만든 응용 프로그램이 많다. 시스템 소프트웨어는 다른 소프트웨어들이 구동 또는 처리될 수 있는 환경을 만들어주는 플랫폼의 역할을 하는 소프트웨어이기 때문에 플랫폼 소프트웨어라고도 부른다. 시스템 소프트웨어 아래에는 컴퓨터 하드웨어나 운영체제 등의 하위 단계가 있고, 위로는 응용 소프트웨어(프로그램)라는 상위 단계가 있다. 시스템 소프트웨어의 아래에 또 다른 시스템 소프트웨어가 있거나 시스템 소프트웨어 위에 또 다른 시스템 소프트웨어가 있는 경우도 있을 수 있다.

  • 운영 체제
  1. 에스도스(MS-DOS) : 마이크로소프트 윈도는 전 세계적으로 점유율 90%에 육박하는 사실상 독과점인 운영체제이다. 점유율이 높기 때문에 악성코드와 해킹 방법이 가장 집중적으로 개발되고 있어 보안이 취약한 플랫폼이다. 따라서 MS-DOS를 사용할 때는 반드시 보안 솔루션을 이용해야 한다는 등 단점이 많지만, 압도적인 보급률 때문에 거대한 소프트웨어 라이브러리를 자랑하며, 윈도 버전만 있고 맥이나 리눅스로는 출시되지 않는 소프트웨어 등 대체재가 없는 경우도 종종 있다.
  2. 유닉스 : 유닉스 계열 운영체제의 원조인 유닉스는 벨 연구소에서 개발되었다. 리눅스는 리누스 토르발스가 커널을 기반으로 개발한 운영체제로 자유 소프트웨어 진영 중심으로 수많은 배포판을 쏟아내며 여러 사람들의 사랑을 받고 있다. 사용자들이 접속하는 웹 사이트 서버의 대부분이 리눅스 기반이고, 요새 스마트폰에서 쓰이는 안드로이드 또한 리눅스를 기반으로 하고 있다. 매킨토시 운영체제는 마하(Mach) 커널을 기반으로 만들어진 애플의 운영체제로 애플의 데스크탑, 노트북 제품은 맥 운영체제를 사용한다. 공식 개조 판으로 아이폰에서 쓰이는 iOS가 있고, IBM 계열의 컴퓨터에서 사용하기 위해 일부 사용자들이 변형해서 만든 매킨토시도 있다.
  3. 안드로이드 : 주로 모바일 기기(스마트폰 등)를 운영하기 위해 만들어진 운영체제로 비교적 가벼우며 범용성이 높다. 21세기에 급격히 확산되며 세계에서 가장 많이 쓰이는 운영체제의 자리를 넘보고 있다.
  • 드라이버 : 주변 기기의 입출력을 통제하는 소프트웨어로 마우스, 키보드, 모니터 등을 컴퓨터 본체와 연결시키는 소프트웨어이다. 하는 일이 펌웨어와 비슷하지만, 펌웨어와는 달리 드라이버는 컴퓨터의 CPU에서 처리된다. 물론 펌웨어 자체에 기본적인 주변장치 드라이버가 들어 있는 경우도 많아 펌웨어와 드라이버를 확실하게 구분하기는 어렵다. 예를 들어 거의 모든 컴퓨터의 바이오스(펌웨어)에는 기본적인 키보드와 마우스 드라이버가 내장되어 있어, 운영체제조차 탑재되지 않은 빈껍데기 컴퓨터에서도 바이오스 셋업을 할 수 있다. 다만 이런 내장 드라이버는 정말 기본적인 기능만을 갖고 있고, 주변기기의 성능을 모두 활용하려면 전용 드라이버를 설치해야 하는데, 전용 드라이버는 CPU에서 처리된다.
  • 유틸리티 : 컴퓨터 사용 효율을 올려주는 소프트웨어로, 컴퓨터를 보다 편리하고 안전하게 사용할 수 있도록 돕고, 컴퓨터를 사용하는 데 있어 일어날 수 있는 문제들을 예방하거나 해결하는 역할을 하는 프로그램들이다. 대표적으로 디스크 정리, 파일 압축, 네트워크 구축, 방화벽 등이 있다. 유틸리티와 응용 소프트웨어를 구분하는 기준은 “이 프로그램을 구동할 목적으로 컴퓨터를 장만했다”라고 할 수 있느냐 하는 것인데, 그렇다면 응용 소프트웨어고, 그렇지 않으면 유틸리티다. 20세기까지만 해도 프로그램을 시스템 소프트웨어, 응용 소프트웨어, 유틸리티로 엄격하게 구분했지만, 오늘날 가장 널리 이용되는 시스템 소프트웨어 마이크로소프트 윈도가 각종 유틸리티를 포함하고 있어 유틸리티를 독립된 제품으로 접하기 어렵다. 또한 넓은 관점에서 보면 운영체제의 계정 권한 관리나 자동적인 메모리 관리 등도 있기 때문에 유틸리티를 독립된 범주로 보는 관점은 점차 줄어들고 있다.[1]

응용 소프트웨어[편집]

응용 소프트웨어(application software)란 시스템 소프트웨어라는 플랫폼 위에 구동되는 프로그램으로, 사용자가 원하는 각종 기능을 제공한다. 홈페이지 운영이나 업무관리 등 특정한 기능을 수행하기 위해 개별적으로 개발한 소프트웨어로, 시스템 소프트웨어를 사용하여 실제 사회에서 일어나는 문제들을 풀어주는데 그 종류가 사무 자동화, 수치 연산, 게임 등 다양하다. 응용이 영어로 애플리케이션(application)이기 때문에 그냥 애플리케이션 혹은 앱이라고도 한다. 또는 응용 프로그램(application program)이라고도 하며, 줄여서 'AP'라고 쓰기도 한다. 응용 소프트웨어는 앞에서 말한 것처럼 워드 프로세서, 스프레드시트, 인터넷 브라우저, 동영상 플레이어, 비디오 게임 등 다양한 응용 소프트웨어를 특징짓는 공통점은 이들이 컴퓨터를 사용하는 목적이 되는 프로그램들로, 컴퓨터를 사는 목적이 될 수 있는 프로그램들이다.[1]

  • 악성 코드 : 제작자가 악의를 가지고 만든 소프트웨어로 컴퓨터 바이러스, , 트로얀, 랜섬웨어 등 일명 나쁜 소프트웨어이다. 대부분 프로그램(응용 소프트웨어)이지만, 데이터로만 이루어진 악성 코드도 있다. 그 예로 특정 프로그램에서 정해진 동작을 실시하는 일종의 스크립트인 매크로만으로 구성된 악성 코드가 있다. 간혹 취약점(vulnerability)과 혼동하는 경우가 있는데 취약점은 말 그대로 소프트웨어가 갖고 있는 결함이 악의적으로 이용될 수 있는 결함을 말한다. 옛날에는 소프트웨어 개발자가 이런저런 목적으로 설치해 둔 뒷문이 해커에게 발견되어 취약점으로 이용되는 경우가 많았다면, 현재는 소프트웨어가 고도로 복잡해졌기 때문에 개발자가 전혀 의도하지 않은 소프트웨어적 결함이 취약점으로 발견되는 경우가 점점 늘어나고 있다.[1]

판매에 따른 분류[편집]

상용 소프트웨어[편집]

상용 소프트웨어(commercial software)는 돈을 지불하고 구입해야만 사용이 가능한 소프트웨어로 상업용으로 판매하는 것이다. 커머셜 소프트웨어, 페이웨어 등으로도 불린다. 대부분 유료이며 실행 코드만 제공하고 소스 코드는 배포하지 않는다. 사용자는 소스 코드를 받지 못하기 때문에 개작이 불가능하며 가격을 지불하지 않고서는 복제와 재배포도 허용되지 않는다. 대개 사유 소프트웨어이지만, 자유 소프트웨어 중 상용 소프트웨어인 경우가 종종 있다. 무료 소프트웨어와는 불법 복제의 위험에 노출이 될 수 있다. 일반적으로 시디 키 또는 시리얼이라고 불리는 숫자와 문자의 조합으로 되어 있는 암호를 입력해야 사용할 수 있다. 대부분의 상용 소프트웨어는 소스 코드는 제공하지 않고 최종 실행 코드만 패키지 제품으로 제공하기 때문에 일부 기능의 변경이나 추가 등 커스터마이징이 불가능하다. 상용 소프트웨어에는 리포팅툴, 백업 솔루션, 보안 솔루션, GIS 솔루션 등이 있다. 

자유 소프트웨어[편집]

자유 소프트웨어(free software)는 복사와 사용, 연구, 수정, 배포 등의 제한이 없는 소프트웨어이다. 자유 소프트웨어와 비슷한 것으로 프리웨어가 있다. 프리웨어는 원저작자가 금전적인 권리를 보류하여 누구나 무료로 사용하는 것을 허가하는 공개 소프트웨어이다. 프리웨어는 누구나 무료로 사용할 수 있으며 대표적인 예로 알집, 알씨, 곰플레이어, V3 알약 등이 있다. 무료로 사용할 수 있는 소프트웨어를 의미하는 프리웨어와 자유 소프트웨어는는 다르다는 것을 주의해야한다. 자유 소프트웨어의 일부는 개인이 사용할 때는 프리웨어, 기업이 사용할 때는 상용 소프트웨어가 된다. 소프트웨어 중 자유 소프트웨어의 조건은 만족하지만, 재배포가 불가능한 소프트웨어들이 있는데, 자유 소프트웨어를 정확히 어떻게 정의하는가에 따라 소프트웨어가 자유 소프트웨어가 될 수도 있고, 아닐 수도 있다. 퍼블릭 도메인 소프트웨어, 자유 소프트웨어, 독점 소프트웨어가 모두 사용될 수 있지만, 일반적으로 대가 없이 사용할 수 있는 독점 소프트웨어를 가리키는 경우가 많고, free라는 영어단어를 사용하는 자유 소프트웨어와는 구분된다.[7] 자유 소프트웨어의 자유는 공짜로 쓸 자유가 아닌, 소스가 공개되어 마음껏 개작할 수 있는 자유를 의미하는 것으로, 유료로 판매될 수도 있다. 그렇다고 해서 프리웨어를 개작할 수 없는 것은 아니다. 개인 소장용으로 개조하여 사용하는 것은 가능하다. 다만 저작자의 허락 없이 재배포하거나, 애드웨어를 넣어 재배포하는 경우 저작권법 위반으로 고소를 당할 수도 있다.[8]

셰어웨어[편집]

셰어웨어(shareware)는 자유롭게 사용하거나 복사할 수 있도록 시장에 공개하고 있는 소프트웨어이다. 체험판, 평가판을 뜻하며, 데모웨어, 평가 소프트웨어라고도 부른다. 돈을 주고 구매하기 전에, 즉 상용 소프트웨어를 구매하기 전에 샘플 도는 홍보차 만드는 프로그램으로 기간이나 기능상의 제한을 둔다. 예를 들어 30일 한정판인 윈도우 체험판의 경우 셰어웨어를 사용하고 있는 것이고, 그 이후에 돈을 주고 윈도우를 사용한다면 상용 소프트웨어를 사용하는 것이다.[9] 크리플 웨어, 트라이얼웨어, 도네이션웨어, 내그웨어 등이 있다.

  • 크리플웨어(crippleware) : 프로그램의 핵심 기능을 제외한 나머지 기능을 공개하여, 사용자가 원하는 기능을 이용하려면 정식 제품을 구매하도록 유도하는 공개 소프트웨어이다.
  • 트라이얼웨어(trialware) : 소프트웨어를 구매하기 전에 미리 사용해 볼 수 있도록 배포 버전으로 제공되는 것으로 상업적인 이용은 불가능하다. 트라이얼 역시 모든 기능을 제공하는 것은 아니지만, 크리플웨어와는 달리 기본적이거나 주요한 기능의 일부만을 사용할 수 있다는 차이점이 있다. 보통 1개월 정도의 무료기간이 있고, 그 후에는 비용을 지불해야 한다.
  • 도네이션웨어(donationware) : 사용자에게 완전한 기능의 소프트웨어를 제공하지만, 프로그래머나 비영리 단체 등에 선택적인 기부를 부탁하는 소프트웨어이다. 기능적으로 어떠한 제한도 없고, 사용자가 기부를 하지 않더라도 문제가 되지 않는다. Vim을 예시로 들 수 있는데, Vim을 단독으로 실행시키면 화면에 “우간다에 사는 가난한 아이를 도와주세요!”라는 문구가 뜬다. 이처럼 모든 기능을 쓸 수 있게 해주지만, 선택적인 기부를 유도하는 소프트웨어를 도네이션웨어라고 한다.
  • 내그웨어(nagware) : 시험 사용 기간이 끝나면 사용자에게 프로그램을 사도록 유도하는 창이 뜨는데, 사용자가 소프트웨어를 등록하는 비용을 지불하도록 상기시키는 것이다. 보통 프로그램이 시작할 때 뜨거나, 사용자가 사용하는 도중 간헐적으로 나타나기도 한다. 어떤 내그웨어는 일정 시간마다 사용자가 프로그램을 계속 사용하기 위해서 기다리도록 한다. 이런 방법을 사용하는 목적은 사용자가 메시지들로 인한 방해를 없애기 위해 등록하게끔 유도하는 것이다. 내그웨어의 경우 과도한 메시지는 오히려 역효과를 내는 경우도 있다.[10]

개발 단계[편집]

소프트웨어 생명주기라고도 하며, 소프트웨어를 체계적으로 개발하고, 관리하기 위해 개발 과정을 단계별로 나누어 구분한 것이다. 5단계 혹은 6단계로 구분하는데, 6단계의 경우 5단계의 앞에 계획하는 단계를 추가하는 것이다.

요구사항 분석[편집]

사용자의 요구사항을 분석하는 단계로, 고객의 요건 또는 개발하고자 하는 시스템의 목표를 정한다. 세부적으로 타당성을 분석하고 개발 계획을 수행한다. 이때 요건 정의 목록을 시스템화하는데 문제가 없는지, 구현 가능한지 판단해야 한다. 더 세부적으로 보면 개발할 소프트웨어의 기능과 제약조건, 목표 등을 소프트웨어 사용자와 함께 명확히 정의하고, 개발할 소프트웨어의 성격을 정확히 이해하고, 개발 방법과 필요한 개발 자원 및 예산을 예측하는 것이다. 요구사항을 규명하는 것은 많은 시간과 노력을 필요로 하지만, 확실하게 규명할수록 개발과정에서 발생하는 비효율적인 시간과 노력을 절약할 수 있다. 개발될 시스템의 설계 및 품질과 밀접한 관계를 가지고 있어, 고품질의 소프트웨어를 만들기 위해서는 시스템 개발에 앞서 요구사항 분석이 필수적이다. 요구사항 분석 과정은 요구사항 규명, 타당성 조사, 비용과 일정에 대한 제약 설정, 문서화 이 4단계로 이루어진다. 요구사항의 규명은 고객의 요구와 필요가 나오게 된 원인, 배경, 환경 등에 대한 분석을 포함하고 있어야 한다. 타당성 조사는 자원의 투자와 그 이익을 조사하고, 위험에 대한 분석을 수행하는 작업으로 경제적 타당성, 기술적 타당성, 법적 타당성 등을 중심으로 주어진 시간과 예산안에서 시스템을 개발하고, 가능한 빠른 시간 내에 타당성을 평가하는 것이 요구된다. 이는 시스템 개발 비용을 줄이고 생산성과 서비스를 향상시키기 위해 행하여진다. 비용과 일정에 대한 제약 설정은 요구 기능에 대한 소요 비용과 개발 기간의 예측, 제약 조건 및 위험에 대한 평가 등을 설정하는 작업으로, 개발 비용, 개발 일정, 시스템 성능 등에 대해 정확하게 예측을 해야 한다. 마지막으로 문서화는 사용자의 요구사항과 시스템의 기능을 문서화하는 작업으로 요구 명세서가 작성되어야 한다. 고객과 개발 회사 사이의 약속 문서이며, 추후에 발생하는 문제와 변화에 대한 책임을 명확히 규명할 수 있어야 하고, 시스템 개발에 관련된 당사자들의 동의와 서명이 있어야 한다.

설계[편집]

설계 단계에서는 요구사항 분석 과정에서 수집된 요구사항 및 분석한 내용을 시스템으로 구현 가능하도록 구체적인 설계를 한다. 시스템 개념과 상세 설계 등 세세한 사항을 포함하도록 하며, 설계 문서를 작성해야 한다. 설계를 어떻게 하느냐에 따라 품질에 직접적인 영향을 미치며, 부적절한 설계는 추후에 시스템 변화를 야기하여 많은 유지 보수비용이 들 수 있다. 시스템을 각각의 구성 요소들로 분할한 뒤, 구성 요소들 사이에 주고받는 정보의 소통을 최소화 시키고 각 구성 요소의 독립성이 유지되도록 시스템을 분할 설계해야 한다. 또한 비용, 소요 시간, 용량, 그리고 신뢰성 등에 대한 연구가 요구되며, 현실과 예산에 맞는 최적의 설계 방법을 선택해야 한다. 설계 명세서에는 엔지니어의 관점에서 소프트웨어를 어떻게 구현할 것인지를 기술해야 한다.

구현[편집]

말 그대로 앞의 과정들을 통해 설계한 설계 명세서를 바탕으로 시스템을 구현하는 것으로, 소프트웨어 구현을 위한 코딩 작업을 하는 것이다. 결과물로 실행 코드, 즉 컴퓨터 프로그램이 있어야 한다. 코딩을 할 때는 높은 가독성을 가져야 하고, 코드가 간결하고 명확해야 한다는 원칙이 있다. 소프트웨어 시스템 구현에서 발생하는 어려움은 대부분 분석과 설계의 잘못에 의한 것으로 설계가 바르게 작성이 되면, 구현은 상대적으로 단순한 기계적인 과정이다. 이때 주의할 점은 운영체제나 표준 라이브러리 등이 앞에서 작성한 요구 명세서와 설계 명세서를 바탕으로 정해져야 한다는 것이다.

테스트[편집]

이 단계에서는 구현된 시스템이 정상 작동하는지, 요건과 부합하는지를 테스트한다. 구현된 소프트웨어의 오류를 발견하고 수정하는 것을 목표로 한다.[11] 시스템을 테스트하는 것은 개발 전 과정에 대하여 체계적으로 점검할 수 있는, 품질 보증 활동의 중요한 일부분이며, 지금까지 한 모든 과정에 대한 최종 점검을 포함하고 있다. 테스트단계의 주요 작업에는 단위 모듈을 테스트하는 단위 테스트, 모듈 간 통합 테스트를 하는 통합 테스트, 요구 사항과 일치하는지를 테스트하는 적합성 테스트, 시스템 복구, 보안, 성능 등을 테스트하는 시스템 테스트 등이 있다. 고품질의 소프트웨어를 개발하기 위해서는 각 과정마다 품질 보증을 위한 절차가 필요하며, 공식적인 검토회 등을 통하여 오류를 발견하고 수정하는 작업이 필요하다. 체계적인 테스트를 위해서는 테스트 계획서가 필요하다. 계획서에는 시험 진행 단계, 시험에 사용되는 데이터 및 시험의 제약 등이 기술되어야 한다. 테스트 결과서 또한 작성되어야 한다. 테스트를 통하여 오류를 찾고 올바르게 수정하여 프로그램을 작동시킬 수는 있지만, 그렇다고 해서 프로그램이 완전하고 정확하다고 증명할 수는 없다.

유지보수[편집]

구현된 시스템을 실제로 배포하고, 운영하는 과정에서 발생하는 것으로 시스템 변경에 의한 요구분석, 설계, 구현, 시험이 모두 재수행 되어야 하며, 관련 문서의 수정도 필요하므로 체계적인 관리가 필요하다. 여러 가지 보고서나 자료가 있어야 한다. 추가 수정 요구 사항 검토 및 반영, 장애 및 오류 발생 시 대처와 복구, 시스템 및 서비스 운영, 유지보수 보고, 역공학 또는 재공학 필요성 검토 등 여러 가지 주요 작업들이 있다. 경우에 따라 지속적인 모니터링 및 시스템 운영들을 요구한다.[12]

프로세스 모델[편집]

소프트웨어를 개발하거나 유지, 보수할 목적으로 수행되는 활동 일체 또는 절차를 의미한다. 소프트웨어 프로세스를 만드는 이유는 누가 어떤 활동을 언제 할지를 정하고, 소프트웨어를 만들기 위해 필요한 행동들을 명확히 하는 것이다. 소프트웨어 프로세스의 특성으로는 이해성, 가시성, 지원성, 수용성, 신뢰성, 견고성, 유지 보수성, 신속성 등이 있다. 가시성은 공정이 끝났을 때 눈에 보이는 것이 있는가, 지원성은 도구들이 지원되고 있는가, 수용성은 수용이 가능한가, 신뢰성은 사전에 오류를 잡아낼 수 있는가, 견고성은 바이러스에 면역이 되어있는가, 유지 보수성은 조직의 변경 요구를 얼마나 빨리 맞출 수 있는가, 신속성은 제품이 얼마나 빨리 오는가를 의미한다.[13] 프로세스 모델이 있다면 전체 프로세스의 이해에 도움을 주고, 구조화된 방법을 개발에 적용시킬 수 있을 뿐만 아니라 지원사용에 대한 사전 계획, 통제가 가능하게 하고, 시스템 개발 과정을 추적하고 관리할 수 있게 해준다. 주요 프로세스 활동에는 소프트웨어의 기능과 운영상 제약 조건을 정하는 소프트웨어 명세, 소프트웨어를 설계하고 프로그래밍하는 소프트웨어 개발, 고객이 원하는 것을 수행하는지 검사하는 소프트웨어 검증, 소프트웨어를 유지 및 보수하는 소프트웨어 진화가 있다. 개발 조직에 따라, 프로젝트 유형에 따라 각각 다른 프로세스를 적용해야 한다. 선형순차적 모델과 진화적 프로세스 모델이 있는데 선형 순차적 모델은 폭포수 모델, V 모델 이 2가지 밖에 없다.

폭포수 모델[편집]

대표적인 선형순차적 모델로, 개발의 흐름이 마치 폭포수처럼 지속적으로 아래로 향하는 것처럼 보이는 데서 이름이 붙여졌다. 앞에서 본 요구사항 분석, 설계, 구현, 테스트, 유지보수 단계 외에 통합 단계가 하나 더 있다. 소프트웨어 요구사항 기술, 설계, 구현, 테스트, 통합, 유지보수가 각각 순차적으로 진행되어야 한다. 다음 단계에 오류가 넘어가지 않도록 하려면 앞 단계에서 결과물이 완벽한 수준으로 작성되어야 하기 때문에 각 단계는 앞 단계가 완료되어야만 다음 단계를 수행할 수 있다. 사용자가 가시적인 결과를 중간에 확인할 수 없다. 그렇지만 관리가 용이하고, 체계적인 문서화가 가능하기 때문에 요구사항의 변화가 적은 프로젝트에 적합하다.

V모델[편집]

산출물 중심의 폭포수 모델을 확장하여 각 개발 단계를 검증하는 것에 초점을 맞춘 것으로, 크게 검증단계와 유효화 단계 2가지로 나뉜다. 검증단계는 요구분석, 시스템 설계, 아키텍쳐 설계, 모듈 설계로 이 과정들이 끝나면 코딩을 진행한다. 이후 각 설계가 제대로 진행되었는지 확인하기 위해서 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트가 진행된다. 단위 테스트는 모듈 확인, 통합 테스트는 인터페이스 확인, 시스템 테스트는 기능 확인, 인수 테스트는 요구 확인을 위한 것이다. 코딩을 중심으로 알파벳 V자 모양이 되기 때문에 V 모델이라고 한다. 개발 생명 주기의 각 단계와 그에 상응하는 소프트웨어 시험 각 단계의 관계를 보여주고, 각 단계마다 상세한 문서화를 통해 작업을 진행한다. 테스트 설계와 같은 테스트 활동은 코딩 이후가 아닌 프로젝트 시작과 동시에 함께 시작한다는 것이 특징이고, 전체적으로 많은 양의 프로젝트 비용과 시간을 감소할 수 있다.

프로토 타입 모델[편집]

진화적 프로세스의 대표로, 정식 절차에 따라 완전한 소프트웨어를 만들기 전에 사용자의 요구를 받아 일단 모형을 만들고 이 모형을 사용자와 의사소통하는 도구로 활용하는 방식이다. 요구사항 정의 및 분석, 프로토타입 설계, 프로토타입 개발, 사용자의 평가, 구현 추가 및 수정순으로 진행된다. 반복된 요구사항 정의를 통해 사용자 요구가 충분히 반영된 요구 분석 명세서를 작성할 수 있고, 프로토타입이 의사소통 도구로 활용될 수 있다. 또한 초기 프로토타입 사용을 통해 새로운 요구사항을 발견할 수 있고, 프로토타입 사용을 통한 완성품의 예측이 가능하다는 장점이 있다. 다만 반복적 개발을 해야 하기 때문에 투입 인력 및 비용의 산정과 프로토타이핑 과정에 대한 통제 및 관리가 어렵고, 중간 산출물 생성의 어려움이 있을 뿐만 아니라, 불명확한 개발 범위로 인해 개발이 종료되거나 목표가 불확실하다는 단점이 있다.

나선형 모델[편집]

프로토 타입에 위험 분석 과정을 더한 것으로 위험 분석의 대상이 되는 요소에는 빈번하게 변경되는 요구사항, 팀원들의 경험 부족, 결속력이 떨어지는 팀, 프로젝트 관리 부족 등이 있다. 계획 및 요구 분석 단계, 위험 분석 단계, 개발 단계, 사용자 평가 단계 총 4단계로 진행된다. 사전 위험 분석을 통해 돌출 위험 요소를 감소 시켜, 프로젝트 중단 확률을 감소시킬 수 있고, 사용자 평가에 의한 개발 방식을 사용해 요구가 충분히 반영되어 사용자의 불만을 감소시킬 수 있다는 장점이 있다. 단점으로는 반복적 개발에 의한 프로젝트 기간 연장이 가능하고, 반복 횟수 증가에 따라 위험요소도 많기 때문에 프로젝트 관리가 어려워진다. 프로토타입과 다른 점은 위험 분석 과정이 있다는 것이기 때문에 위험 요소를 관리하는 것이 중요한데, 이는 위험 전문가 필요에 따라 추가 비용이 발생하는 등의 부담이 될 수 있다.

통합 프로세스(UP) 모델[편집]

통합 프로세스 모델은 폭포수 모델의 문제점을 해결하기 위해 반복적인 개발을 하는 방식으로, 반복적이고 점진적이다. 아키텍처의 정의를 중요하게 생각하여 쓰임새와 물질을 토대로 아키텍처를 먼저 구축한 뒤 소프트웨어를 구현한다. 아키텍처와 객체 지향이 중요해짐에 따라 활용도가 증가했다. 도입 단계, 구체화 단계, 구축 단계, 전이 단계가 있는데, 이 과정들이 반복해서 진행된다. 점증적으로 개발해 나감으로써 기술적 또는 요구사항 변경 등에 대한 위험 요소를 초기에 완화시킬 수 있다. 발주자의 실제 요구 사항에 근접한 시스템을 만들 수 있고, 이전 반복을 통해 얻은 교훈은 다음 반복의 피드백으로 작용할 수 있다. 이러한 반복이 거듭될수록 노하우가 생기고, 개발자로서의 스킬이 숙달되는 것이다.

애자일 프로세스 모델[편집]

애자일(agile)은 “날렵한”, “민첩한”이란 뜻으로 애자일 프로세스 모델은 고객의 요구에 민첩하게 대응하고, 그때그때 주어지는 문제를 풀어나가는 방법이다. 프로세스와 도구 중심이 아닌 개개인과의 상호 소통을 중시하고, 문서 중심이 아닌, 실행 가능한 소프트웨어를 중시한다. 또한 계약과 협상 중심이 아닌, 고객과의 협력을 중시하고, 계획이 중심이 아닌 변화에 대한 민첩한 대응을 중시한다. 반복적인 개발을 통한 잦은 출시를 목표로 한다.[14]

발전[편집]

소프트웨어 공학[편집]

소프트웨어의 개발, 운용, 유지보수 등 생명 주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문이다. 공학은 업무분야에서 문제 발생 시, 실무자가 적절한 해답을 찾을 수 있도록 체계적으로 정리된 기술적 지식을 제공하는 것이다. 공학을 소프트웨어에 적용한 것으로 낮은 예산 비용으로 사용자가 만족할 수 있는 시간 내에 효율적으로 고품질의 소프트웨어를 개발하는 것이 목표다. 좀 더 쉽게 설명하면, 인류의 이익을 증진을 위한 새로운 제품, 도구들을 소프트웨어와 관련된 원리, 지식, 도구 등을 활용하여 만드는 것이다. 여러 형태로 정의가 가능한데, 전자전기기술자협회(IEEE)는 소프트웨어의 개발, 운용, 유지보수, 폐기 처분에 대한 체계적인 접근 방안으로, 페얼리(Fairley)는 비용과 기간 내에 소프트웨어를 체계적으로 생산하고 유지보수 하는데 관련된 기술적이고 관리적인 원리, 보엠(Boehm)은 과학적인 지식을 소프트웨어 설계와 제작에 응용하는 것이며, 이를 개발, 운용, 유지보수 하는데 필요한 문서 작성 과정으로 정의했다.[15] 소프트웨어공학의 주요 영역에는 아키텍처, 프로세스, 개발 도구, 관리, 요구 공학 등이 있다. 소프트웨어의 복잡도가 나날이 높아지면서, 원칙이나 순서 없이 개발하기 어려워짐에 따라 소프트웨어 공학에 대한 깊은 이해가 요구된다. 소프트웨어 개발에 있어 예산 산정이나 기한 예측의 어려움이 있고, 유지 보수의 중요성, 하드웨어의 발전, 소프트웨어의 필요성 증가, 좀 더 크고 복잡한 소프트웨어 시스템 요구 등의 이유로 소프트웨어 공학의 필요성은 점점 높아지고 있다. 소프트웨어 공학에는 방법, 도구, 프로세스, 패러다임 4가지의 분야가 있다.

  • 방법 : 소프트웨어 개발에 사용되는 기법을 말하는 것으로, 객체 지향 분석을 예로 들 수 있다.
  • 도구 : 자동화된 시스템을 말하는 것으로, 설계, 프로그래밍 테스트 도구를 말한다.
  • 프로세스 : 도구와 방법을 적용하는 순서를 말하는 것으로, 프로세스에 따라 효율이 결정된다.
  • 패러다임 : 방법론을 일컫는다(구조적, 객체 지향적 방법론)[16]

소프트웨어 산업[편집]

소프트웨어의 개발, 제작, 생산, 유통 등과 이에 관련된 서비스 및 정보 시스템의 구축, 운영 등과 관련된 산업이며, 개발 단계부터 소비자가 최종적으로 사용하기까지 공급과 관련된 모든 생산적 활동 전반을 포함한다. 독립형(패키지 소프트웨어), 중간재(임베디드 소프트웨어), 서비스형(IT 서비스) 산업으로 구분된다. 멀티미디어화의 진전과 인터넷의 급속한 성장 등 정보사업의 환경변화에 따라 급속한 성장을 지속하고 있는 분야로 정보 사업의 줄기가 되고 있다. 범위가 매우 넓어 생산품이 수십만 가지가 넘고, 각 생산품에 대한 구분 자체가 모호하다. 관련 기술 또한 끊임없이 발전, 개선되고 있다.[17] 소프트웨어 산업의 분야는 매우 다양한데, 소프트웨어정책 연구소에서 2020년 주목해야할 사업 10가지로 자율형 IoT 기대감 증대, 교육을 위한 인공지능, 금융권 AI 투자 본격화, 의료 빅데이터 개방, 지능형 물류 로봇 시장의 성장, 설명가능 인공지능(eXplainable AI, xAI)의 현실화, 모바일 폼팩터의 혁신, 에너지 산업의 소프트웨어융합 가속화, 클라우드 게임 시장의 선점 경쟁, 언택트(untact) 서비스 영역 확대가 있다.

소프트웨어 특허[편집]

소프트웨어 특허는 컴퓨터 프로그램을 이용한 컴퓨터 운용에 관한 특허를 말하는 것으로, 많은 나라에서 소프트웨어에 대한 특허를 인정하고 있지만, 소프트웨어 특허에 대한 명확한 정의는 없다. 소프트웨어에 대한 특허가 허용되어야 하는지에 대해서 소프트웨어가 특허된다면 특허가 가능한 소프트웨어와 특허가 가능하지 않은 소프트웨어의 경계는 무엇인가, 특허에 요구되는 진보성 기준을 어떻게 적용해야 하는가, 소프트웨어 특허가 기술 혁신을 저해하는 것은 아닌가 하는 등의 논점이 존재한다. 대한민국에서 소프트웨어 특허를 받기 위해서는 3가지 정도의 요건을 만족해야 한다. 먼저 발명의 성립성과 산업상 이용 가능성을 갖추어 발명의 대상이 되어야 하고, 공지된 선행기술보다 신규 하거나, 진보된 발명이어야 한다. 마지막으로 명세서 및 청구범위가 명확하고 간결하게 기재되어있어야 한다. 다만 컴퓨터 프로그램 언어 자체는 특허대상에서 제외된다. 특허를 받을 수 있는 범위는 크게 방법의 발명과 물건의 발명으로 나뉜다. 물건의 발명은 장치 청구항, 컴퓨터로 판독 가능한 기록 매체 청구항, 데이터 기록 매체 청구항, 기록 매체에 저장된 컴퓨터 프로그램 청구항(또는 프로그램에 준하는 청구항) 등이 있다.[18] 한쪽에서는 소프트웨어 침해가 기술 혁신과 연구개발을 방해하고, 경쟁 소프트웨어의 출현을 막아 선택권을 줄일 뿐만 아니라 비용을 전적으로 중소기업이나 개인이 부담해야하는 불균형을 초래하기 때문에 폐지해야한다는 목소리도 나오고 있다. 이 외에도 특허권의 보호기간은 20년인데 소프트웨어는 시대에 발맞추어 가는 것이기 때문에 20년 후에는 그 가치가 낮아질 가능성 등 소프트웨어 폐지를 주장하는 근거는 여러 가지가 있다.

각주[편집]

  1. 1.0 1.1 1.2 1.3 1.4 1.5 소프트웨어〉, 《나무위키》
  2. 2.0 2.1 소프트웨어〉, 《위키백과》
  3. 청년학술회, 〈소프트웨어란 무엇인가〉, 《네이버 블로그》, 2016-03-27
  4. 안경잡이개발자, 〈(소프트웨어 공학) 8. 소프트웨어 공학 정리〉, 《네이버 블로그》, 2017-10-10
  5. 박수용·조황희, 〈국가 소프트웨어 경쟁력 향상 방안 연구: SW Roadmap>, 《과학기술정책연구원》
  6. 소프트웨어〉, 《네이버 지식백과》
  7. 프리웨어〉, 《위키피디아》
  8. 프리웨어〉, 《나무위키》
  9. 정수진, 〈상용,예어웨어,프리웨어,공개 소프트웨어의 뜻과 종류〉, 《네이버 블로그》, 2015-09-24
  10. 셰어웨어〉, 《나무위키》
  11. codedragon, 〈소프트웨어의 개발 5단계〉, 《티스토리》
  12. 제 2 장 소프트웨어 개발 단계
  13. 아보카도, 〈소프트웨어 / 소프트웨어 공학 / 발전과정 / 소프트웨어 프로세스 특성〉, 《네이버 블로그》, 2019-03-24
  14. ForzaCoding, 〈소프트웨어 개발단계 : 프로세스 모델〉, 《티스토리》, 2020-03-08
  15. 동그리동동닷컴, 〈1장 소프트웨어 공학의 개요〉, 《티스토리》, 2017-02-06
  16. 알랭_드, 〈소프트웨어공학(1) 필요성과 특징〉, 《티스토리》, 2020-03-29
  17. 김성일 기자, 〈(시장분석) 소프트웨어 산업의 특성과 시장 현황〉, 《미래한국》, 2016-12-14
  18. 박상현, 〈소프트웨어 특허의 이해〉, 《정보과학회》, 2017-08-10

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 소프트웨어 문서는 소프트웨어에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.