소프트웨어 공학

  • 공학이란? 유용한 사물이나 환경을 구축하는 것을 목적으로 하는 학문
  • 소프트웨어 공학이란? 소프트웨어의 개발, 운영, 유지보수 및 폐기에 대한 체계적인 접근방법

소프트웨어 개발 생명주기 모델

소프트웨어를 어떻게 개발할 것인가에 대한 전체적인 흐름

  • 폭포수 모델
    • Requirements(요구조건 작성) > Design(구조 설계) > Implementation(구현) > Verification(검증) > Maintenance(유지보수)
    • 앞 단계에서 잘못되면 다음단계까지 영향을 준다.
    • 시간이 오래걸린다.
  • 프로토타이핑 모델
    • [요구분석 > 프로토타입 설계 > 프로토타입 개발 > 프로토타입 평가] > 구현 > 인수 및 설치
    • 커뮤니케이션에 드는 비용과 시간이 많다.
    • 프로토타입을 반복적으로 개발하다보니, 소프트웨어 품질이 떨어지게 된다.
  • 나선형 모델
    • 고객과의 의사 소통 > 계획 및 정의 > 위험분석 > 구축 > 고객평가
    • 낮은 품질의 소프트웨어를 만들지 않게 된다.
    • 폭포수모델보다는 위험성이 적다.

소프트웨어 개발 방법론

소프트웨어를 생산하는데 필요한 반복적인 과정들을 정리한 것이다. 구조적 프로그래밍, 객체지향, 고속 개발 방법론, 익스트림 프로그래밍(Agile), 스크럼(Agile), UP, … 등이 있다.

애자일(Agile) 개발 프로세스

다른 고전적인 방법론과 구별되는 가장 큰 차이점은 less document-oriented, 즉 문서를 통한 개발 밥법이 아니라, code-oriented, 실질적인 코딩을 통한 방법론.

앞을 예측하며 개발하지 않고, 그때 그때 필요한 요구를 더하고 수정하여 하나의 커다란 소프트웨어를 개발해 나가는 adaptive style

특정 개발 방법론을 가리키는 말은 아니고 “애자일(기민한, 좋은것을 빠르고 낭비없게 만드는 것)”개발을 가능하게 해주는 다양한 방법론 전체를 일컫는 말

UML

  • 통합 모델링 언어, Unified Modeling Language
  • 표준화된 범용 모델링 언어
  • 객체 지향 소프트웨어 집약 시스템을 개발할 때 산출물을 명세화, 시각화, 문서화할 때 사용

TDD(Test-Driven Development) 테스트 주도 개발

매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스

  1. 결함을 점검하는 자동화된 테스트 케이스를 작성
  2. 케이스를 통과하기 위한 최소 양의 코드를 생성
  3. 새 코드를 표준에 맞도록 리팩토링

테스트를 위한 소프트웨어를 또 작성하므로 시간이 많이 소요된다.

PDD(Plan-Driven Development) 계획 기반 개발

계획을 세우고 그 계획을 실천하는데에 많은 시간과 노력을 할애하는 개발 방법

형상관리

SW개발 및 유지보수 과정에서 발생하는 소스코드, 문서, 인터페이스 등 결과물에 대해 형상을 만들고, 이들 형상에 대한 변경을 체계적으로 관리 제어하기 위한 활동

  • 형상이란? 그상태 그대로 본을 뜬다는 의미
  • 형상관리의 일종이 버전관리(예: Git)

프로그래밍 언어

다양한 프로그래밍 언어가 존재한다. 프로그램 특성에 따라 언어를 선택하게 된다.

고급언어에서 저급언어로 변환되는 과정에 따른 분류

0과1로 번역되는 시점에 따라 구별한다. 0과 1로 변경해주는 것을 컴파일이라고 한다.

  • 컴파일 언어 : C, C++, go
    • 소스코드를 컴파일해서 0과1로 변환해서 패키지해서 배포
    • 속도가 빠름
    • 원본소스의 노출이 없다.
    • 코드양이 많아지면 빌드시간이 길어진다.
    • 운영체제별로 010101 해석 방법이 다르기 때문에, 시스템별로 빌드해야 한다.
  • 바이트 코드언어 : Java, C#, …
    • 컴파일 언어와 인터프리터 언어의 장점만을 취하겠다고해서 나옴
    • 해석기가 두개
    • Java - 컴파일 해석기 - 중간언어 - 해석기, 가상머신 - 01010101
    • 중간언어로 된 걸 배포, 중간언어 해석기가 해석을 해준다.
      • 시스템마다 빌드해주지 않아도 된다.
      • 컴파일 언어처럼 컴파일하는데 시간이 오래걸림, 인터프리터 언어처럼 해석을 해줘야하므로 느림
      • 결국 시스템마다 빌드해주지 않아도 되는대신 컴파일과 인터프리터 언어의 단점을 모두 취함
      • JAVA는 이식성이 중요한 임베디드에 적용하려고 만들어졌다.
  • 인터프리터 : BASIC, JavaScript, Python, Ruby, …
    • 소스코드를 0101010로 바꾸지 않고, 중간에 인터프리터가 해석
    • 시스템 사용량이 많고 실행속도가 느림
    • 인터프리터를 배포하지 않아도 되고 수정시 컴파일하지 않아도 되므로, 시스템 전체를 shutdown하지 않아도된다. 때문에 서버에서 많이 사용한다.
    • 소스코드 노출이 쉬움
    • 파이썬
      • 웹에서 사용, 유지보수가 좋지만 느림
      • 대용량 처리가 어려움
      • JIT 컴파일러: 보완하기 위해 인터프리터가 시간이 있을 때 미리 컴파일한다.

Compile

사람이 이해하는 고급 프로그래밍 언어를 기계어 코드로 변한 후, 최종적으로 운영체제에서 실행할 수 있는 형태로 만드는 작업이이다. 내부 과정에는 compilter, assembler, linker 등의 프로그램이 동작한다. 현대적인 컴파일러들은 3가지 프로그램일 모두 내장하고 있어 한 번에 모든 작업을 처리할 수 있다.

컴파일러(Compiler) : High-lever 언어 코드를 Assembly 언어 코드로 출력 어셈블러(Assembler) : Assembly 언어 코드를 executable code로 출력 링커(Linker) : 하나 이상의 바이너라 파일을 실행 가능한 프로그램 파일 로더(Loader)

  • 역할
    • 실행 파일은 디스크에 저장되어 있다.
    • 실행 파일이 실행되면 로더는 실행 파일을 메모리로 load한 후 실행을 시작한다.
    • 실질적으로 로더는 운영체제의 기능 중 하나이다.
  • 작업 순서
    • 실행 파일의 header를 읽어 필요한 메모리 용량을 계산한다.
    • 메모리를 할당한 후, 프로그램을 메모리에 적재한다.
    • 메인 함수에서 사용할 수 있도록 프로그램 실행 인자를 스택에 복사한다.
    • 프로그램 시작 전에 CPU 레지스터를 초기화 한다
    • 프로그램의 메인 함수를 시작한다.
    • 프로그램이 종료하면 메인 함수의 반환 값을 운영체제에 전달한다.

프로그래밍 패러다임에 따른 분류

  • 패러다임: 바라보는 시각
  • 객체 지향 프로그래밍 패러다임 :프로그램을 상호작용하는 객체들의 집합으로 표현 (object-c, python, swift, c++, c#, ruby, java, pearl, ..)
  • 함수형 프로그래밍 패러다임 : 프로그램 상태값을 지니지 않는 함수값들의 연속으로 표현 (python, swift, c++, c#, pear, ruby, java, …)
  • 다중 패러다임 : 다중 패러다임을 지원한다는것은 원하는 패러다임을 채택해서 사용하면된다. 요즘에는 함수형 프로그램으로 전환하는 추세이다. 대규모 병렬처리에는 함수형 프로그래밍이 용이하기 때문이다.

객체지향 프로그래밍 패러다임

컴퓨터 프로그램을 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 “객체”들의 모임으로 파악하여, 객체간의 상호작용으로 프로그램의 동작을 구현하고자 하는 것이다.

!!! 클래스 > 객체 !!!

  • object : 의식과 행위를 가지는 형체
  • class : 객체가 가질 수 있는 속성과 행위를 정의하는 틀 (템플릿, 설계도)
  • 클래스의 인스턴스 : 객체

예 : 사람 class {머리색, 성별, 나이, 싸운다(누구랑), 밥을먹는다(누구랑,무엇을)}

절차지향 프로그래밍

절차지향형 언어의 특이점은 모든 것이 ‘상태’를 중심으로 돌아간다. ‘상태’란 메모리 등 저장 공간의 상태를 말한다. 즉, 절차형 프로그램은 특정 변수나 메모리 주소의 상태를 변경하고 특정 변수나 메모리 주소의 상태를 읽어서 참조하는 방식으로 만들어진다.

  • 하드웨어에 가까운 프로그래밍이 가능
  • 하드웨어의 성능을 최대한 끌어낼 수 있음

프로그램 용어

  • 개발자(Developer) : 무언가를 만들어 내는 사람 (예: 프로그래머, 디자이너, 기획자, …)
  • Server-Client : 주로 데이터를 주는 쪽을 서버, 받는 쪽을 클라이언트
  • Front-end / Back-end
    • 웹 페이지 : 사용자(외부)에게 보여주냐에 따라
    • 서버내에서 : [back-end - API(front)] - 클라이언트
  • Thread : 프로세스 내에서 작업이 실행되는 흐름의 단위
    • 멀티프로세스 : 하나 이상의 프로세서가 협력하여 일을 처리하는 것
    • 멀티태스크 : 여러개의 프로세스를 한번에 실행하는 것
    • 멀티쓰레드 : 하나의 프로세스 안에서 여러가지 일을 병렬적으로 처리 (자원공유 가능, 프로그래밍을 통해 구현 가능)
  • Library : 특정 기능을 수행할 수 있는 클래스 또는 함수의 집합체 (수학 라이브러리, 애니메이션 라이브러리, …)
  • API : 응용소프트웨어 프로그래밍 접합부
    • 응용 소프트웨어와 프로그램워크 사이의 중간 매체(방법)
    • 소프트웨어간의 통신을 위해 메시지를 전달하는 방식 등이 결정된 것
    • 프로그램간의 소통 창구
  • 프레임워크 : 구조적으로 고정된 부분을 재사용할 수 있도록하고, 응용별 특정 기능을 추가적인 사용자 작성 코드에 의해 선택적으로 구현가능하도록 하는 포괄적인 추상구조, 그리고 이를 지원하는 소프트웨어 플랫폼
    • 프레임워크 vs 라이브러리
      • 라이브러리는 우리가 원하는 기능(예를들면 절대값을 구하는 수학식을) 이미 코드로 구현, 구지 우리가 새로 코드를 작성하지 않아도 됨 , 특화된 기능을 짜논 소스를 가져다 씀
      • 프레임워크는 응용소프트웨어를 만들기 위해 교두부 역할을 하는 것이다. 예를들어 파이썬으로 장고를 이용하면 웹 서버 제반시설이 다 구현해되어있다. 장고를 이용해 지도관련 앱을 만드려면 지도관련 부분만 작성하면된다.
  • 비유해보자면 : 회사를 만든다고하면
    • 프레임워크 - 국가 (정부)
    • 프레임워크의 하위 프레임워크 - (정부부처)
    • API - 국가 기관
    • 라이브러리 - 직무 전문가
    • 프로그래밍 - 국가 통용 언어
    • 레퍼런스 문서 - 국가 조직도 및 기능 설명서
      • 장고프레임워크 + 파이썬 : 장고라는 나라 모양에서 내가 원하는 일을 할 수 있는 기업을 세우는 것. 장고라는 나라에서는 파이썬이라는 언어를 통해 의사소통할 수 있다.
  • 디자인 패턴 : 프로그램 개발에서 자주 나타는 과제를 해결하기 위한 방법 중 하나이다. 과거의 소프트웨어 개발과정에서 발견된 설계의 노하우에 이름을 붙여 이후에 재이용하기 좋은 형태로 묶어서 정리한 것이다. (설계 패턴을 모아둔것)
    • MVC
    • MVVM
    • Observer
    • Singleton
    • Protytype
  • Reference Document : API에 대해 서술해 놓은 문서
  • IDE : 통합개발환경
  • SDK : 소프트웨어 개발에 필요한 도구의 모음(IDE+Framework+Tools+… 3개 모두 들어간다는 건아니고 필요한것만 배포)

공부법

  • 컴퓨터 개론책을 3번 정도 보는게 좋다.
  • 검색 할 때는 위키백과 먼저보고, 블로그를 보는게 좋다.(블로그를 10개정도 비교해가며 봐야함)
  • 쉽게 얻을수 있는 지식은 없다.
  • 정보처리 기술사는 해볼만하다.