[CS] 기본이론_1


0. CS기본이론을 배워야 하는 이유

  • 수년 경력을 지닌 경력자가 스택과 큐의 차이점을 설명할 수 없다면 무엇을 믿고 그 사람에게 일을 맡길 수 있을까?
    모든 고급 개발 지식과 업무의 기본 근간은 알게 모르게 우리가 배웠던 CS 기본 지식으로 연결된다.
    우리는 실무에서 스택과 큐를 직접 구현할 일은 거의 없지만 구현하려는 코드에 어떤 자료구조가 알맞은지, 어떤 알고리즘이나 자료구조를 선택해야 하는지에 대한 의사결정은 CS기본기에서 나온다고 해도 과언이 아니다.
  • CS 기본이론의 필요성
    • 컴퓨터(시스템)에 대한 이해 (컴퓨터와 제대로 소통하기)
    • 자료구조, 알고리즘 활용법(일의 효율을 높이기)
    • Coder에서 Developer로 성장
    • 기업목적에 따른 기본적 CS지식이 필요

1. 소프트웨어 공학

  • 소프트웨어 개발 생명주기
    • 계획 단계에서 유지보수 단계에 이르기까지 일어나는 일련의 절차
정의단계
What                     타당성 분석 -> 개발 계획 -> 요구사항 분석          - 사용자의 요구사항 확인 및 타당성 검토
(계획, 요구분석)                                                          - 개발에 필요한 요구사항 명세화

개발 단계
How                      설계 -> 개발 -> 테스트                            - 코딩을 통한 프로그램 개발
(설계, 개발, 테스트)                                                       - 단위/통합/시스템/인수/설치 테스트

유지보수 단계
Change                   유지보수 -> 폐기                                  - 시스템 운영 및 운영 중 발생한 문제점들에 대한 유지보수
(적용, 예방, 폐기)                                                         - 새로운 시스템 개발로 인한 기존 시스템 폐기
  • 소프트웨어 개발 프로세스 정의
    • 작업(task)순서의 집합 + 제약조건(일정, 예산, 자원)을 포함하는 일련의 활동
좁은의미 : 사용자의 요구사항을 SW로 구현하기 위한 절차, 과정

넓은의미 : 사용자의 목적을 이루기 위한 기획, 프로젝트 관리 등을 포함한 절차, 과정, 방법

소프트웨어 개발 7단계 : 계획 - 요구분석 - 설계 - 구현 - 테스트 - 반영 - 유지보수
  • 소프트웨어 프로세스 모델(1)
    • 폭포수 모델
    • 프로토타입 모델
    • 나선형 모델
    • 통합프로세스 모델
  • 소프트웨어 프로세스 모델(2)
    • 애자일 프로세스 모델
      • 고객의 요구에 민첩하게 대응하고 그때그때 주어지는 문제를 풀어나가는 방법론
  • 소프트웨어 아키텍처 정의
    • 소프트웨어 아키텍처
      • 소프트웨어에 대한 전체적인 구조
      • 소프트웨어를 이루고 있는 여러 구성요소(서브시스템, 컴포넌트)
      • 구성 요소들의 인터페이스 간의 상호작용 정의
      • 시스템 설계와 개발 시 적용되는 원칙과 지침
    • 소프트웨어 아키텍처의 구성
      • 구성 요소
      • 구성 요소들 사이의 관계
      • 구성 요소들이 외부에 드러내는 속성
      • 구성 요소들과 주변 환경 사이의 관계
      • 구성 요소들이 제공하는 인터페이스
      • 구성 요소들의 협력 및 조립방법
  • 아키텍처 모델(1)
    • 데이터 중심형 모델
      • 주요 데이터가 repository에서 중앙 관리
      • repository와 여기에 접근하는 서브시스템으로 구성
      • 데이터가 한군데에 모여 있기 때문에 데이터를 모순되지 않고 일관성 있게 관리 가능
      • 새로운 서브시스템의 추가 용이
      • repository의 병목 현상 발생 가능
      • 서브시스템과 repository 사이의 강한 결합 - repository 변경 시 서브시스템에 영향을 줌
  • 아키텍처 모델(2)
    • Client-Server 모델
      • 네트워크를 이용하는 분산 시스템 형태
      • 데이터와 처리 기능을 클라이언트와 서버에 분할하여 사용
      • 서버 :클라이언트(서브시스템)에 서비스 제공
      • 클라이언트 : 서버가 제공하는 서비스를 요청(호출)하는 서브시스템
  • 아키텍처 모델(3)
    • Layering 모델
      • 기능을 몇 개의 계층으로 나누어 배치
      • 구성 : 하위 계층은 서버, 상위 계층은 클라이언트 역할
  • 아키텍처 모델(4)
    • Model/View/Controller 모델
      • 같은 모델의 서브 시스템에 대하여 여러 뷰 서브시스템을 필요로 하는 시스템에 적합
      • 장점
        • 데이터를 화면에 표현(뷰)하는 디자인과 로직(모델)을 분리함으로써 느슨한 결합 가능
        • 구조 변경 요청 시 수정 용이
      • 단점
        • 기본 기능 설계로 인한 클래스 수의 증가로 복잡도 증가
        • 속도가 중요한 프로젝트에 부적합

소프트웨어 공학 기출문제

  • 소프트웨어 위기에 대해서 설명하시오.
답변 Point : 소프트웨어 위기에 대한 정형화된 답보다는 실제 사례를 들어서 설명하자

예시 : 2000년대 초반 많은 사람들이 이용했던 싸이월드가 이제는 사용되지 않는 것은
서비스에 대한 다양한 수요를 예측하지 못하고 반영하지 못한 대표적인 사례로 생각합니다.
소프트웨어 위기는 소프트웨어가 더 이상 사용자들의 요구를 충족할 수 없어서 사용자들로부터 외면받는 것을 이야기합니다.

* 소프트웨어 위기란?
소프트웨어 공학 초기에 사용되던 용어로 정돈된 주제가 되기 이전에 사용되었다.
이 용어는 급격한 컴퓨터 계산 용량과 문제의 복잡성이 급격히 증가함에 따라 발생하는 것을 서술하기 위하여 사용되었다.
본질적으로, 이는 정확하고 이해할 수 있고, 검증 가능한 컴퓨터 프로그램을 작성하는 것이 얼마나 어려운가를 뜻한다.
  • 소프트웨어 공학이 필요한 이유는 무엇인지 설명하시오.
답변 Point : 소프트웨어 공학의 적용에 대해서 예시를 들어 설명하자, 소프트웨어들을 비교하면 설명이 쉽다.

예시 : 소프트웨어 공학은 소프트웨어의 개발, 운용, 유지보수 등의 단계를 체계적으로 다루는 학문이라고 합니다.
제가 생각하는 소프트웨어 공학은 **에서 진행했던 프로젝트에서 단기간에 원하는 목적으로 이루기 위해서
소프트웨어를 기획하고, 설계하고, 구현하고, 테스트하고, 보완하는 과정을 걸쳤는데
이 과정을 체계적으로 정리하고 이를 공유하는 과정이 소프트웨어 공학이 아닌가 생각합니다.
  • 소프트웨어 개발 경험과 소프트웨어 개발 시 적용한 개발 방법론이 있다면 설명하시오.
답변 Point : 소프트웨어 개발의 경험을 생각해보면 1개 이상의 방법론이 적용된 것을 알 수 있다.
개발 시 고려한 개발방법론이 없더라도 개발했던 경험을 복기해서 가장 적절한 개발방법론을 적용하자

예시 : **에서 프로젝트를 진행하면서 린 개발 방법을 찾아서 적용했습니다.
린 개발 방법론의 가장 큰 특징인 낭비요소를 제거하고, 지속적인 개선과 수행속도의 향상과 더불어 품질을 효과적으로 개선하는 것인데 **의 프로젝트의 기간이 짧아 어려움을 겪었습니다.
초기 서비스에 대한 방향성을 자신할 수 없어서 지속적으로 서비스를 향상할 수 있는 방법론이 필요했고,
그래서 린 개발 방법론을 찾아서 적용하게 되었습니다.
경험이 많지 않아서 린 개발 방법론의 적용이 쉽지는 않았지만, 단기간에 프로젝트를 완성하는데는 도움이 되었습니다.
  • 소프트웨어 프로젝트 진행 경험에 대해서 설명하시오.
답변 Point : 소프트웨어 진행 경험은 '무엇을 개발하였다' 라기 보단 '어떻게 개발하였다'라고 말하는 것이 필요하다.
그 안에는 개발방법론이나 소프트웨어 아키텍처를 들어서 설명하는 것이 필요하다.

예시 : 대학교 졸업을 위한 프로젝트로 빅데이터를 통한 관광정보 제공 서비스를 개발하였습니다.
관광정보에 대한 빅데이터를 수집하고 분석하여 이용자의 특성(연령, 성별, 지역)에 맞추어 관광정보를 제공하는 서비스를 개발하였습니다.
린(Lean)개발 방법론이 짦은 기간 개발에 적용하기에 적절하다고 하여 적용하였습니다.

2. 프로그래밍

  • 객체지향(1)
    • 객체지향 개요
      • 소프트웨어 객체는 현실 세계의 객체를 필드와 메서드로 모델링한 것
      • 소프트웨어 객체는 상태를 필드(Field)로 정의하고, 동작을 메서드(Method)로 정의
      • 필드는 객체 내부에 ‘선언된 변수’를 의미하고, 메서드는 객체 내부에 ‘정의된 동작’을 의미함
    • 절차지향
      • 일련의 동작을 순서에 맞추어 단계적으로 실행하도록 명령어를 나열
      • 데이터를 정의하는 방법보다는 명령어의 순서와 흐름에 중점
    • 객체지향
      • 현실 세계를 객체 단위로 프로그래밍하여, 객체는 필드(데이터)와 메서드(코드)를 하나로 묶어 표현
      • 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소트프웨어 개발에 많이 사용
      • 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능
  • 객체지향(2)
    • 캡슐화(정보은닉)
      • 필드와 메서드를 하나의 캡슐처럼 포장해 세부 내용을 외부에서 알 수 없도록 감추는 것
    • 상속
      • 상위 객체를 상속받은 하위 객체가 상위 객체의 메서드와 필드를 사용하는 것
    • 다형성
      • 대입되는 객체에 따라서 메서드를 다르게 동작하도록 구현하는 기술
      • 실행 도중 동일한 이름의 다양한 구현체 중에서 메서드를 선택 가능
  • Jave의 목적
    • Write Once Run Anywhere
    • Java는 platform independent하게 동작
    • Super Computer부터 Smart Card까지 한번 작성된 코드는 코드의 수정이 없이, 코드의 재컴파일 없이 실행가능
  • Java 언어의 개발 목적
    • Program 개발을 쉽게 하였다
    • Compile환경이 아니라, Interpreted 환경이다.
    • 한 개 이상의 thread를 사용할 수 있다.
    • 동적으로 program을 변화시킬 수 있다.
    • Code 자체적으로 security를 보장해준다.
  • JVM(Java Virtual Machine)
    • JVM은 System 마다, 그리고 운영체제 마다 다름
  • Garbage Collection (GC)
    • Java는 프로그래머에게 메모리를 release(최적화)하게 하는 책임을 지우지 않음
    • GC는 Java Program의 life cycle 동안 자동적으로 동작하여 메모리의 부족을 제거
  • Process의 개념
    • 프로그램 - 저장장치에 저장되어 있는 정적인 상태
    • 프로세스 - 실행을 위해 메모리에 올라온 동적인 상태
    • 프로그램이 프로세스가 된다는 것은 운영체제로 부터 프로세스 제어 블록을 얻는다는 뜻
    • 프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻
  • Thread의 개념
    • 프로세스에서 실행 제어만 분리한 실행 단위(프로세스 실행부)
    • 프로세서를 사용하는 기본 단위이며, 명령어를 독립적으로 실행할 수 있는 하나의 제어 흐름
    • 같은 그룹의 스레드는 코드, 주소 공간, 운영체제의 자원(파일, 신호) 등을 공유
  • 멀티태스킹 : 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법
  • 멀티 프로세싱 : CPU를 여러 개 사용하여 여러 개의 Thread를 동시에 처리하는 작업 환경
  • CPU 멀티 Thread : 하드웨어적인 방법으로 하나의 CPU에서 여러 Thread를 동시에 처리하는 병렬 처리 기법
  • 멀티 Thread : 운영체제가 소프트웨어적으로 프로세스를 작은 단위의 Thread로 분할하여 운영하는 기법
  • 병행성(concurrency) 문제
    • 두 개 이상의 Thread가 어떤 객체에 있는 하나의 데이터에 접근하게 되는 경우
    • 서로 다른 두 스택에서 실행되는 메소드가 객체에 있는 동일한 객체에 대한 getter/setter 메소드를 호출하게 되는 경우
    • Thread는 자신이 잠시 중단된 적이(interrupt) 있다는 것을 기억할 수가 없음
  • Thread에서의 동기화
    • 다중 Thread 환경에서 한번에 하나의 쓰레드 만이 공유 데이터를 접근할 수 있도록 제어하는 것
    • 여러 Thread가 동시에 실행되는 다중 Thread에서 데이터를 공유하기 위해서는 어떤 Thread가 다른 Thread의 상태와 행동 들을 고려
  • 형상관리 (1)
    • 정의 : SW개발 및 유지보수 과정에서 발생하는 변경 사항들을 관리하기 위해 개발된 일련의 활동 (소프트웨어 개발의 전 단계에 적용되는 활동으로, 유지보수 단계에서 수행)
    • 목적 : 형상 관리는 소프트웨어 개발의 전체 비용을 줄이고, 개발 과정의 여러 방해 요인이 최소화되도록 보증함
  • 주요 기능 : 버전관리, 리비전 관리, 소스관리, 소스코드 관리
  • 형상관리(2)
    • 종류 : SVN, git, Mercurial, Bazaar 등, 주로 SVN과 git 사용
    • SVN : 소규모 시스템 적합
    • git : 대규모 시스템 적합
  • 빌드도구
    • 소스코드를 컴파일, 테스트, 정적 분석 등을 실시하여 실행 가능한 애플리케이션으로 자동 생성하는 프로그램(프로젝트를 진행하며 시간이 지남에 따라 라이브러리의 버전을 자동으로 동기화)
    • ANT : XML 기반 빌드 스크립트 개발, 명확한 빌드 절차 정의가 필요
    • MAVEN : 프로젝트에 필요한 모든 종속성(Dependency)를 리스트의 형태로 관리, 전자정부 프레임원크
    • Gradle : ANT와 MAVEN의 단점을 보완한 오픈소스 기반의 Build 자동화 도구, 안드로이드 스튜디오

프로그래밍 기출문제

  • JAVA와 C의 차이를 설명하시오.
답변 Point : 절차지향 vs 객체지향 / 하드웨어 최적화 vs 하드웨어 독립적 등의 여러 관점에서 비교 설명하자.

예시 : C언어는 아두이노를 활용한 IoT 수업에 사용하였었고, 자바는 안드로이드 어플 제작할 때 사용했습니다.
하드웨어를 제어할 때 C언어가 적합한 언어라고 생각합니다.
자바를 사용할 때에는 다양한 유형의 데이터를 정의와 데이터 간의 관계를 설정, 사용자의 동작을 정의, 구현하는 과정을 거쳤는데,
실제 업무와 유사하여 규모 있는 프로젝트를 개발할 때 자바가 적합했던 언어였습니다.

또한, 개발 환경에 있어서도 윈도우 환경에서 개발한 프로그램을 그대로 리눅스 기반으로 알고 있는 안드로이드 환경에서 동작하는 것을 통해서
하드웨어 독립적으로 운영이 가능한 것이 C언어와 차이라고 할 수 있습니다.
  • JVM 가비지컬렉션 동작 과정을 설명하시오.
답변 Point : 가비지 컬렉션은 메모리와 연관된다.
소프트웨어 개발 경험 중 메모리 부족 현상을 겪은 경험이 있으면, 경험을 토대로 설명하자.

예시 : 가비지컬렉션은 JVM에서 메모리 관리를 하는 방법으로 더 이상 사용하지 않는 메모리에 대해서 수집해서 스스로 동작해서 사용을 해제하는 기능입니다.
C언어를 사용할 때에는 코드에서 메모리의 할당과 함께 해제를 같이 처리해주었는데,
자바에서는 직접 해제하는 기능은 없었고, 사용하지 않는 메모리에 대해서는 메모리의 참조변수에 null을 대입해서
참조변수와 연결된 메모리가 더 이상 사용하지 않음을 JVM에 알려주는 것만으로 메모리해제 요청을 하였습니다.
  • JAVA에 적용된 OOP에 대해서 설명하시오.
답변 Point : 실제 작업한 사례를 통해서 설명하자. 설계한 객체와 클래스를 비교해서 설명

예시 : [관광정보 제공 서비스 프로젝트 개발]
* 서비스에서 제공되는 주요 정보인 관광지/ 식당/ 호텔 등을 객체로 정의
* 관광지를 모델링 한 것을 객체/ 모델링한 관광지를 자바의 코드로 정의한 것은 클래스
* 각 클래스에 실제 관광지 값을 대입하여 메모리에 올린 것은 인스턴스
 - 주요 모델링한 정보 : 관광지 이름/ 관광지 주소/ 관광지 위경도/ 관광지 길 탐색 기능
 - 클래스에서는 관광지의 이름은 PLACE_NAME의 String 타입으로 정의
 - 관광지 위/경도는 PLACE_LAT, PLACE_LNG의 double 타입으로 정의
 - 길을 탐색하는 기능은 navigate 라는 메소드로 구현
 - 객체는 실 세계를 모델링 한 것이면 클래스는 모델링 한 것을 실제 코드로 구현한 것
  • 형상관리 활용 경험을 설명하시오.
답변 Point : 형상관리 경험이 있다면, 형상관리 경험을 이야기,
경험이 없다면, 회사에서 제공하는 서비스나 소프트웨어를 대상으로 필요성을 설명

예시 : 저는 4명의 팀원과 함께 프로젝트를 진행하였습니다.
이중에 2명은 라이브러리를 개발하고 1명은 서버 측을 1명은 사용자 화면 및 동작을 개발하였습니다.
동시에 같이 개발하면서 서로의 코드를 참조하고, 확인을 위해 SVN을 이용해서 형상관리를 진행하였습니다.

SVN을 활용한 형상관리를 하면서 코드 작업 후 업데이트할 때 오류가 있는 코드를 업데이트 하거나,
업데이트 시 정확한 코멘트를 남기지 않아서 애를 먹었던 경험도 있습니다.
초반에는 혼란을 겪었지만, 수시로 베이스 라인 변경과 통제를 통해 형상관리 프로젝트를 체계적으로 관리할 수 있었습니다.

3. 웹&모바일 서비스

  • 웹 서비스(1)
    • 기존의 웹
      • HTTP, HTML, URL과 같은 기술을 통해 인터넷에 분산되어 있는 정보 자원들에 대하여 표준화된 접근과 정보 표현 방법
    • 웹 서비스
      • ‘XML’과 ‘인터넷 프로토콜’을 통해 ‘표준화된 방식으로 상호작용’
      • 새로운 기술이라기 보다는 컴포넌트, 인터넷, XML등의 기술을 새로운 개념으로 적용하는 방법론
      • 기본적인 표준 인프라가 구축되어 있는 경우에는 그것을 바탕으로 무궁무진한 활용이 가능
    • 웹서비스의 특징
      • 플랫폼에 독립적
      • 동적인 기능(Dynamic Function)
      • 비용 효율적
      • 기존 시스템(Legacy System)에 적용
  • 웹 서비스 동작 흐름
  • 웹 서버
  • 정적페이지와 동적 웹페이지
    • 정적 웹페이지
      • 컴퓨터에 저장된 텍스트 파일 그대로 보는것
      • HTML
    • 동적 웹페이지
      • 저장된 내용을 다른 변수로 가공 처리하여 보는 것
      • PHP, ASP, JSP
  • 클라이언트 - 서버
    • 클라이언트-서버 모델 기반
      • 서버 : 서비스 정보들을 보관하고 이를 제공해주는 컴퓨터
      • 클라이언트 : 사용자가 서버에서 제공하는 정보를 받는 컴퓨터
    • 서버 프로그램
      • 호스트 컴퓨터에 서버 역할을 수행
      • 아파치 또는 IIS등 웹 서버 프로그램
      • FTP 서비스의 경우 FTP 서버 프로그램
    • 클라이언트 프로그램
      • 사용자가 서버에 접속하여 서비스 이용
      • Chrome, Explorer와 같은 웹 브라우저 프로그램/ FTP 클라이언트 프로그램 필요
  • 웹 서버의 구성 예시
    • 윈도우 서버 환경 구축 예시
      • Window Server + TOMCAT + JSP + (Oracle)
    • 리눅스 서버 환경 구축 예시
      • 리눅스 Server + APACHE + TOMCAT + JSP + (My SQL)
  • 모바일 서비스
    • 시스템 소프트웨어
      • 모바일 운영체제(OS) : 모바일 단말기용 시스템 소프트웨어
    • 애플리케이션
      • 다운로드 애플리케이션 (사용자가 직접 다운로드 하여 실행)
      • 모바일 웹 브라우저 (모바일 기기에서 실행되는 웹브라우저)
      • 내장 애플리케이션 (모바일 운영체제에 직접 구현된 프로그램)
    • 모바일 운영체제(OS)
      • 휴대폰에서 PC의 운영체제와 같은 역할을 수행
      • 스마트폰의 프로세서, 메모리, 화면 등의 하드웨어를 관리하고 운영
      • 모바일 애플리케이션이 실행되는 소프트웨어 플랫폼 역할
      • 공개형(Open) 모바일 운영체제가 대세
  • 모바일 앱 vs 모바일 웹 vs 하이브리드 앱
    • 모바일 앱
      • 디바이스에 최적화
      • 플랫폼 전용 언어로 개발함
      • 안드로이드 -java / Kotlin
      • 아이폰 - Object-C / Swift
    • 하이브리드 앱
      • 유지보수의 편의성
      • 하이브리드 앱 전용 언어로 개발함
      • React Native
      • Flutter
      • XAMARIN
      • IONIC
    • 모바일 웹(앱)
      • 모바일 웹가 모바일 앱의 호환
      • 유지보수의 편의성
      • 모바일 웹을 앱으로 제젝
      • HTML5 / CSS3 기반의 모바일 웹 개발 후 WebView에서 제공

웹&모바일 기출문제

  • AJAX가 무엇인지 예를 들어서 설명하시오.
답변 Point : 기술적인 접근보다는 서비스를 예시로 설명하자. 쉽게 접할 수 있는 사례를 찾아서 설명한다.

예시 : AJAX는 비동기적인 웹 애플리케이션의 제작을 위해 아래와 같은 조합을 이용하는 웹 개발 기법으로
주로 회원가입 시 아이디 중복검사나 비밀번호 유효성 검사 등에 사용합니다.
웹 페이지는 화면을 이동할 때 마다 화면의 컨텐츠를 다시 가져와서 표시하는데,
웹 서비스 중에는 현재의 화면을 그대로 둔 채로 특정 영역의 데이터를 추가/ 삭제/ 변경 등의 기능을 쓸 때 AJAX을 활용합니다.
AJAX를 사용하면 화면 전체를 재 로딩함으로 발생하는 트래픽의 증가도 필요한 영역의 적은 데이터만 통신함으로 트래픽을 줄이는 효과도 있습니다.
  • 웹 브라우저 검색창에서 키워드를 입력하면 결과가 나오는 과정을 설명하시오.
답변 Point : 웹 서버의 흐름을 생각하고, 키워드를 입력 받아 웹서버에서 처리해서 반환하는 과정을 도식화해서 설명

예시 : 웹 브라우저에 검색 창에 키워드를 입력하면 웹 사이트의 검색창에 정의된 form의 method(get/post)의 방식으로 action에 기록된 서버로 검색 키워드를 전송하게 됩니다.
서버는 검색 키워드를 전송 받으면 검색 키워드와 관련하여 구현된 비즈니스 로직을 실행시키고,
그 결과를 HTML로 구성하여 다시 웹 브라우저로 전송합니다.
웹 브라우저는 서버로 부터 새로운 HTML이 오면 결과를 화면에 보여지게 합니다.

태그:

카테고리:

업데이트:

댓글남기기