소프트웨어

[섬네일|[자바스크립트 언어로 작성된 소프트웨어]]
**컴퓨터 소프트웨어**(, 혹은 간단히 **소프트웨어**, , 순화 용어: 무른모)는 컴퓨터의 실행을 지시하는 컴퓨터 프로그램들로 구성된다. 소프트웨어에는 설계 문서 및 사양도 포함된다.

소프트웨어의 역사는 20세기 중반 디지털 컴퓨터의 발전과 밀접하게 연관되어 있다. 초기 프로그램은 하드웨어에 특화된 기계어로 작성되었다. 1958년 고급 프로그래밍 언어의 도입으로 사람이 더 읽기 쉬운 명령어가 가능해져 소프트웨어 개발이 쉬워지고 다양한 컴퓨터 구조 간 이식성이 향상되었다. 프로그래밍 언어로 작성된 소프트웨어는 컴파일러나 인터프리터를 통해 해당 아키텍처의 하드웨어에서 실행된다. 시간이 지남에 따라 컴퓨터 망, 운영체제 및 데이터베이스의 발전으로 소프트웨어는 복잡해졌다.

소프트웨어는 일반적으로 두 가지 주요 유형으로 분류할 수 있다.
# 하드웨어 자원을 관리하고 애플리케이션을 위한 서비스를 제공하는 운영체제
# 사용자를 위한 특정 작업을 수행하는 응용 소프트웨어

클라우드 컴퓨팅의 부상으로 새로운 소프트웨어 전달 모델인 서비스형 소프트웨어(SaaS)가 도입되었다. SaaS에서는 애플리케이션이 애플리케이션 서비스 제공자에 의해 호스팅되고 HTTP를 통해 인터넷으로 접근된다.

소프트웨어 개발 과정은 여러 단계를 거친다. 이 단계에는 소프트웨어 설계, 컴퓨터 프로그래밍, 소프트웨어 테스트, 소프트웨어 배포 생명 주기, 그리고 소프트웨어 유지보수가 포함된다. 소프트웨어 품질보증과 정보 보안은 소프트웨어 개발의 핵심 측면인데, 소프트웨어 버그와 보안 취약점이 시스템 오류와 보안 침해로 이어질 수 있기 때문이다. 또한 소프트웨어 라이선스 및 지적 재산권과 같은 법적 문제는 소프트웨어 제품 배포에 중요한 역할을 한다.

## 역사

[섬네일|[집적 회로는 현대 소프트웨어 시스템을 생산하는 데 필수적인 발명품이다.]]
컴퓨터 프로그램을 설명하는 '소프트웨어'라는 단어의 첫 사용은 1958년 수학자 존 투키의 공로로 알려져 있다. 1940년대 후반에 등장한 최초의 프로그래밍 가능한 컴퓨터는 기계어로 프로그래밍되었다. 기계어는 디버그하기 어렵고 다른 컴퓨터 간에 이식성이 없다. 처음에는 하드웨어 자원이 인적자원보다 더 비쌌다. 프로그램이 복잡해지면서 프로그래머 생산성이 병목 현상이 되었다. 1958년 고급 프로그래밍 언어의 도입은 하드웨어의 세부 사항을 추상화하고 기본 알고리즘을 코드로 표현했다. 초기 언어에는 포트란, 리스프, 코볼이 있다.

## 유형

[섬네일|upright|일반적인 [데스크톱 컴퓨터에서 사용자가 응용 소프트웨어와 상호작용하는 방식을 보여주는 다이어그램. 응용 소프트웨어 계층은 운영체제와 인터페이스하며, 운영체제는 다시 컴퓨터 하드웨어와 통신한다. 화살표는 정보의 흐름을 나타낸다.]]
소프트웨어에는 두 가지 주요 유형이 있다.
* 운영체제는 "컴퓨터의 자원을 사용자와 응용 소프트웨어를 위해 관리하는 소프트웨어 계층"이다. 운영체제가 수행하는 세 가지 주요 목적이 있다.
**다른 애플리케이션 간에 자원을 할당하고, 언제 중앙 처리 장치(CPU) 시간이나 메모리 공간을 받을지 결정한다.
**프로그래머가 쉽게 작업할 수 있도록 물리적 메모리와 같은 컴퓨터 하드웨어 세부 정보에 접근하는 과정을 추상화하는 인터페이스를 제공한다.
**네트워크 및 디스크 장치에 접근하기 위한 인터페이스와 같은 공통 서비스를 제공한다. 이를 통해 애플리케이션을 다시 작성할 필요 없이 다른 하드웨어에서 실행할 수 있다.
* 응용 소프트웨어는 운영체제 위에 실행되며 컴퓨터의 자원을 사용하여 작업을 수행한다. 현대 컴퓨터로 수행할 수 있는 작업의 범위가 매우 넓기 때문에 다양한 유형의 응용 소프트웨어가 존재한다. 애플리케이션은 대부분의 소프트웨어를 차지하며 작동하려면 운영체제가 제공하는 운영 환경과 종종 다른 애플리케이션이 필요하다.

[섬네일|사내 하드웨어 및 소프트웨어, [서비스형 인프라스트럭처(IaaS), 서비스형 플랫폼(PaaS), 서비스형 소프트웨어(SaaS) 비교|upright=2.4|center]]
소프트웨어는 소프트웨어 전개 방식에 따라 분류할 수도 있다. 전통적인 애플리케이션은 특정 버전의 소프트웨어에 대한 영구적인 라이선스와 함께 구매하여 다운로드한 후 구매자의 하드웨어에서 실행된다. 인터넷과 클라우드 컴퓨팅의 부상으로 서비스형 소프트웨어(SaaS)라는 새로운 모델이 가능해졌다. SaaS에서는 공급자가 소프트웨어를 호스팅하고(보통 임대된 서비스형 인프라스트럭처나 서비스형 플랫폼 위에 구축됨) 고객에게 소프트웨어 사용을 제공하며, 종종 구독료를 받는다. 2023년까지 주로 웹 애플리케이션을 통해 제공되는 SaaS 제품은 기업이 애플리케이션을 제공하는 주요 방법이 되었다.

## 소프트웨어 개발 및 유지보수
[섬네일|upright=2.5|center|1988년 전통적인 [소프트웨어 개발 생명 주기 다이어그램. 숫자는 각 단계의 일반적인 비용을 나타낸다.]]

소프트웨어 회사는 예산 범위 내에서 제시간에 고품질 제품을 제공하는 것을 목표로 한다. 한 가지 과제는 소프트웨어 개발 노력 추정이 종종 부정확하다는 것이다. 소프트웨어 개발은 프로젝트를 구상하고, 타당성을 평가하고, 비즈니스 요구사항을 분석하고, 소프트웨어 설계를 하는 것으로 시작된다. 대부분의 소프트웨어 프로젝트는 재사용하거나 기존 소프트웨어( 상용 기성품 (COTS) 또는 오픈 소스 소프트웨어 형태)를 통합하여 개발 속도를 높인다. 소프트웨어 품질보증은 일반적으로 다른 엔지니어에 의한 수동 코드 검토와 자동화된 소프트웨어 테스트의 조합이다. 시간 제약으로 인해 테스트는 소프트웨어의 의도된 기능의 모든 측면을 포괄할 수 없으므로 개발자는 종종 가장 중요한 기능에 중점을 둔다. 정형 기법은 일부 안전 필수 시스템에서 코드의 정확성을 증명하는 데 사용되며, 사용자 인수 테스트는 제품이 고객 기대를 충족하는지 확인하는 데 도움이 된다. 소프트웨어 개발 방법론은 모든 단계를 순차적으로 완료하는 모델부터 동시적이고 반복적인 모델까지 다양하다. 소프트웨어 개발은 잠재적 사용자로부터 얻은 소프트웨어 요구사항에 의해 추진되는 반면, 유지보수는 변경 요청과 같은 이벤트에 의해 추진된다.

종종 소프트웨어는 개발 팀이 시간이나 자금이 부족할 때 불완전한 상태로 배포된다. 소프트웨어 테스트 및 소프트웨어 품질보증에도 불구하고 거의 모든 소프트웨어에는 시스템이 의도한 대로 작동하지 않는 소프트웨어 버그가 포함되어 있다. 출시 후 소프트웨어 유지보수는 이러한 버그가 발견될 때 수정하고 시간이 지남에 따라 환경이 변함에 따라 소프트웨어를 계속 작동시키는 데 필요하다. 새로운 기능은 종종 출시 후에 추가된다. 시간이 지남에 따라 유지보수 수준은 점차 제한되다가 제품이 시장에서 철수되면 완전히 중단된다. 소프트웨어가 노화됨에 따라 레거시 소프트웨어로 알려지게 되며, 이를 수정하는 방법을 아는 사람이 아무도 없더라도 수십 년 동안 계속 사용될 수 있다. 제품의 수명 주기 동안 소프트웨어 유지보수는 전체 개발 비용의 75% 이상을 차지하는 것으로 추정된다.

소프트웨어 프로젝트를 완료하려면 소프트웨어 프로그래머뿐만 아니라 테스트, 문서 작성, 소프트웨어 프로젝트 관리, 그래픽 디자인, 사용자 경험, 사용자 지원, 마케팅 및 자금 조달에 대한 다양한 전문 지식이 필요하다.

## 품질 및 보안

소프트웨어 품질은 명시된 요구사항과 고객 기대를 충족하는 것으로 정의된다. 품질은 코드의 올바르고 효율적인 동작, 재사용성 및 이식성, 또는 수정 용이성을 나타낼 수 있는 포괄적인 용어이다. 개발 과정의 후반부에 품질을 추가하려고 시도하기보다는 처음부터 제품에 품질을 구축하는 것이 일반적으로 더 비용 효율적이다. 고품질 코드는 신뢰성이 높고 유지보수가 더 쉽기 때문에 공급업체와 고객 모두에게 평생 비용을 줄여준다. 안전 필수 시스템의 소프트웨어 오류는 사망을 포함하여 매우 심각할 수 있다. 일부 추정치에 따르면, 낮은 품질의 소프트웨어로 인한 비용은 매출의 20%에서 40%에 달할 수 있다. 개발자들이 의도한 대로 완벽하게 작동하는 제품을 제공하려는 목표에도 불구하고, 거의 모든 소프트웨어에는 버그가 포함되어 있다.

인터넷의 부상은 악의적인 행위자가 원격으로 사이버 공격을 수행할 수 있도록 하여 컴퓨터 보안의 필요성을 크게 증가시켰다. 버그가 보안 위험을 생성하는 경우 이를 취약점이라고 한다. 식별된 취약점을 수정하기 위해 소프트웨어 패치가 종종 릴리스되지만, 알려지지 않은 취약점(제로 데이)과 패치되지 않은 취약점은 여전히 악용될 수 있다. 취약점은 악의적인 행위자에 의해 악용될 수 있는 능력에 따라 다르며, 실제 위험은 취약점의 특성과 주변 시스템의 가치에 따라 달라진다. 일부 취약점은 시스템 가용성을 손상시키는 서비스 거부 공격에만 사용될 수 있지만, 다른 취약점은 공격자가 사용자 모르게 자신의 코드를(악성 소프트웨어라고 함) 주입하고 실행할 수 있도록 허용한다. 사이버 공격을 저지하기 위해 시스템의 모든 소프트웨어는 외부 공격에 견디고 복구할 수 있도록 설계되어야 한다. 보안을 보장하려는 노력에도 불구하고 상당수의 컴퓨터가 악성 소프트웨어에 감염되어 있다.

## 인코딩 및 실행

### 프로그래밍 언어

[섬네일|right|upright=1.3|[C (프로그래밍 언어)|C 언어로 작성된 컴퓨터 프로그램의 소스 코드. 회색 줄은 사람에게 프로그램을 설명하는 주석이다. 컴파일되어 실행되면 "Hello, world!"를 출력한다.]]
프로그래밍 언어는 소프트웨어가 작성되는 형식이다. 1950년대 이후 수천 가지의 다양한 프로그래밍 언어가 발명되었으며, 일부는 수십 년 동안 사용되었지만 다른 언어는 더 이상 사용되지 않게 되었다. 일부 정의는 하드웨어에 의해 직접 구현되는 정확한 명령어인 기계어와 기계어의 보다 사람이 읽기 쉬운 대안이며, 그 문장을 기계어로 일대일로 번역할 수 있는 어셈블리어를 프로그래밍 언어로 분류한다. 소프트웨어 생성에 사용되는 고급 프로그래밍 언어로 작성된 프로그램은 몇 가지 주요 특징을 공유한다. 즉, 프로그램을 작성하는 데 기계어 지식이 필요하지 않으며, 다른 컴퓨터 시스템으로 이식될 수 있고, 기계어보다 더 간결하고 사람이 읽기 쉽다. 이들은 사람이 읽을 수 있어야 하며 컴퓨터 하드웨어에 대한 명확한 명령으로 번역될 수 있어야 한다.

### 컴파일, 해석 및 실행

고급 프로그래밍 언어의 발명은 이를 자동으로 기계어로 번역하는 데 필요한 컴파일러와 동시에 이루어졌다. 대부분의 프로그램은 실행하는 데 필요한 모든 자원을 포함하지 않으며 외부 소프트웨어 라이브러리에 의존한다. 컴파일러의 기능 중 일부는 프로그램이 하드웨어에 의해 실행될 수 있도록 이러한 파일을 연결하는 것이다. 일단 컴파일되면 프로그램은 오브젝트 파일로 저장될 수 있으며 로더(운영체제의 일부)는 이 저장된 파일을 가져와 컴퓨터 하드웨어에서 프로세스로 실행할 수 있다. 일부 프로그래밍 언어는 컴파일러 대신 인터프리터를 사용한다. 인터프리터는 실행 시점에 프로그램을 기계어로 변환하며, 이로 인해 컴파일된 프로그래밍 언어보다 10배에서 100배 느려진다.

## 법적 문제
### 책임

소프트웨어는 종종 불완전하거나 버그를 포함하고 있다는 사실을 인지한 상태에서 출시된다. 구매자들은 이러한 상태의 소프트웨어를 인지하고 구매하며, 이는 다른 제품에 비해 소프트웨어 제품에 대한 책임이 현저히 제한되는 법적 체제로 이어졌다.

### 라이선스

[섬네일|[블렌더 (소프트웨어)|블렌더, 자유 소프트웨어 프로그램]]
1970년대 중반 이래로 소프트웨어와 그 소스 코드는 코드 복제에 대한 독점적 권리를 소유자에게 부여하는 저작권법에 의해 보호되어 왔다. 기본 아이디어나 알고리즘은 저작권법에 의해 보호되지 않지만, 때로는 영업 비밀로 취급되어 기밀유지 협약과 같은 방법으로 감춰진다. 소프트웨어 저작권은 종종 소프트웨어에 자금을 조달하거나 소프트웨어를 제작한 사람이나 회사(직원 또는 계약자와의 계약에 따라 다름)가 소유한다. 일부 소프트웨어는 퍼블릭 도메인에 속하며, 누가 사용하고, 복사하거나 공유하고, 수정할 수 있는지에 대한 제한이 없다. 대표적인 예는 미국 연방정부가 작성한 소프트웨어이다. 자유-오픈 소스 소프트웨어 또한 몇 가지 지정된 조건을 제외하고 자유로운 사용, 공유 및 수정을 허용한다. 일부 소프트웨어의 사용은 저작권 보유자가 작성하고 사용자에게 부과하는 계약(소프트웨어 사용권)에 의해 규제된다. 사유 소프트웨어는 일반적으로 사용 및 공유를 제한하는 제한적인 라이선스 하에 판매된다. 일부 자유 소프트웨어 라이선스는 수정된 버전이 동일한 라이선스 하에 출시되어야 한다고 요구하며, 이는 소프트웨어가 사유 제한 하에 판매되거나 배포되는 것을 방지한다.

### 특허

특허는 발명가에게 새로운 제품이나 공정에 대한 독점적이고 기간 제한적인 라이선스를 부여한다. 소프트웨어가 무엇을 달성할 수 있는지에 대한 아이디어는 법으로 보호되지 않으며, 구체적인 구현은 대신 저작권법의 적용을 받는다. 일부 국가에서는 특허를 유효하게 유지하기 위한 요건 중 하나로, 청구된 발명이 물리적 세계에 영향을 미쳐야 한다는 조건이 포함될 수도 있다. 소프트웨어 특허는 역사적으로 논란이 많았다. 1998년 State Street Bank & Trust Co. v. Signature Financial Group, Inc. 사건 이전에는 소프트웨어 특허가 미국에서 일반적으로 인정되지 않았다. 해당 사건에서 미국 연방 대법원은 비즈니스 프로세스도 특허를 받을 수 있다고 판결했다. 특허 출원은 복잡하고 비용이 많이 들며, 특허와 관련된 소송은 제품 비용을 증가시킬 수 있다. 저작권과 달리 특허는 일반적으로 발행된 관할 구역에서만 적용된다.

## 영향

섬네일|컴퓨터 생성 시뮬레이션은 소프트웨어가 가능하게 한 발전 중 하나이다.
엔지니어 케이퍼스 존스(Capers Jones)는 "컴퓨터와 소프트웨어는 교육, 직업, 전쟁, 엔터테인먼트, 의학, 법률 등 인간 생활의 모든 측면에 깊은 변화를 가져오고 있다"고 썼다. 소프트웨어는 선진국의 일상생활에 보편화되었다. 많은 경우 소프트웨어는 가정용 가전제품과 엘리베이터와 같은 기존 기술의 기능을 증강시킨다. 소프트웨어는 또한 인터넷, 비디오 게임, 휴대 전화, GPS와 같은 완전히 새로운 기술을 탄생시켰다. 전자우편, 인터넷 포럼, 블로그, 마이크로블로그, 위키, 소셜 미디어를 포함한 새로운 통신 방식은 인터넷에 의해 가능해졌다. 어떤 종이 기반 도서관보다 방대한 양의 지식을 이제 빠른 웹 검색으로 이용할 수 있다. 대부분의 창조적인 전문가들은 컴퓨터 지원 설계, 3차원 모델링, 디지털 이미지 편집, 컴퓨터 애니메이션과 같은 소프트웨어 기반 도구로 전환했다. 거의 모든 복잡한 장치는 소프트웨어로 제어된다.

## 각주

### 참고 문헌

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* 
*
*
*
*
*
*
*
*