Lina's Toolbox

소프트웨어 설계 본문

스파르타 내일 배움 캠프 AI 웹개발 과정/CS

소프트웨어 설계

Woolina 2024. 7. 26. 14:06

 

 

파이썬 자료형

데이터가 저장되는 형식

 

ex) 정수, 실수, 논리형, 문자열, 리스트, 튜플, 딕셔너리. 세트 ...


자료구조

데이터를 효과적으로 저장하기 위해 어떤 논리나 규칙으로 자료를 모아 놓은 구조

 

1. 선형 구조

자료들 간에 관계가 1:1로 순차적으로 나열되어 있는 것 (순서가 있음!)

배열 (물리적으로 연결된 구조)

매모리상에 연속적인 공간에 데이터를 저장하는 방법

리스트 (논리적으로 연결된 구조)

메모리상에 임의의 위치에 데이터를 저장하지만 각 데이터들이 앞뒤 관계를 갖게 하는 방법

리스트에서 물리적인 위치는 임의적으로 지정됨

파이썬에서는 배열, 리스트의 구분이 크지 않음

스택

선입후출 방식의 자료구조

선입후출(후입선출): 먼저 들어온 데이터가 나중에 처리되는 것

스택은 히스토리 기능을 구현할 때 유용하고 DFS(깊이 우선 탐색), 후위연산, 백트래킹, 유효성 검사 등 다양한 곳에 사용됩니다.

ex) ctrl+z 로 최근 실행한 것부터 취소됨.

 

선입선출 방식의 자료구조

선입선출: 먼저 들어온 데이터를 먼저 처리하는 것

 

작업 스케줄링 기능을 구현하거나, 캐시, BFS(), 티켓팅 시스템 등 다양한 곳에서 사용된다.


2. 비선형 구조

자료들 간에 관계가 1:N로 나열되어 있는 것을 의미

ex. 집안 가계도나 회사 구조같은 것들

 

그래프

노드(요소)와 간선으로 이루어진 자료 구조

 

(간선이) 무방향인 그래프의 형태

 

방향 그래프의 형태

 

가중치 그래프(ex. 다익스트라)

 

그래프는 위의 3가지가 있으며 방향과 가중치를 모두 갖는 그래프도 있다.


트리

트리는 그래프의 한 종류이며 나무의 가지나 뿌리가 뻗어나는 모양과 비슷하다 하여 붙여진 이름이다.

 

트리의 형태

 

 

이진 트리의 종류

트리인데 자식이 최대 2개만 있다 (자식이 없어도 상관은 없음)  ➡️ 무조건 이진트리!

 

이진트리: 각 부모노드의 자식노드가 최대 2개인 트리

 

편향트리: 한쪽으로만 자식을 갖는 트리

❓편향트리는 리스트가 아닌가? ➡️ 아님. 

리스트 : [A, B, C]

트리: [A, [B, [C]]] ➡️ 이 나눠져야 트리임!

 

포화이진트리: [A, [B, [D, E]], [C, [F]]]

포화 이진트리: 자식이 아예 없던가, 모든 자식이 다 차있어야함.

 

완전이진트리: 왼쪽에서부터 차있는 이진트리.


노드

  • 루트노드: 제일 상단에 있는 노드
  • 부모노드: 자식노드를 갖는 노드
  • 자식노드: 부모노드를 갖는 노드
  • 자손노드: 부모노드 하위에 있는 모든 노드

프로그래밍 기본

컴파일러

고급 프로그래밍 언어로 작성된 소스코드를 기계어로 번역 및 실행하기 위한 프로그램

가장 큰 특징으로는, 소스코드 전체를 분석하고 그 다음 기계어로 분석 후 실행합니다.

 C, JAVA는 컴파일러에 의해 컴파일(기계어로 번역)되고 실행됨

 

인터프리터

컴파일러와 마찬가지로 고급 프로그래밍 언어로 작성된 소스코드를 기계어로 번역 및 실행하기 위한 프로그램

다만, 컴파일러와 가장 큰 차이점은 한줄씩 소스코드를 번역하고 실행한다.

Python, javascript와 같은 언어들이 인터프리터에 의해 번역 및 실행된다.


메모리 영역

우리가 사용하는 메모리에는 작업을 효율적으로 하기 위해 다양한 영역들로 나뉩니다.

이 영역들은 운영체제에 의해 알아서 관리됩니다.

 

메모리 영역

 

코드 영역

프로그램을 실행하기 위해 명령어들이 저장되는 공간. 
우리가 작성한 실행 코드가 여기 저장되고, 프로그램 종료 시 메모리 해제

 

데이터 영역

static(정적) 변수, 전역 변수와 같은 데이터들이 이곳에 저장된다.

프로그램 시작과 함께 할당되고, 프로그램이 종료될 때 소멸된다.

 

Heap 힙 영역

동적 메모리 할당을 위한 곳(이 곳의 크기는 동적으로 할당됨)으로, 프로그래머가 직접 사용 및 관리해야하는 메모리 영역.

본래 해당 영역에서 사용한 메모리는 사용자가 직접 해제해줘야하지만 파이썬은 가비지컬렉터가 있어서 자동으로 해준다.
큐와 같은 자료구조가 여기서 생성 및 사용됨

 

Stack 스택 영역

정적 메모리 할당을 위한 곳으로 함수, 지역변수, 매개변수 등을 사용하기 위한 공간

함수가 시작할 때 지역변수가 살아나고 함수가 끝나면 지역변수는 죽는다.

재귀함수를 사용할 때 이곳을 사용한다. 그래서 스택(쌓는다)라고 하는 것!

 


OOP(Object-Oriented Programming, 객체지향 프로그래밍)

 

객체지향이란?

추상화하고자 하는 객체의 모습을 가상의 공간에 구체화하며 설계해 나가는 것

쉽게 말해서 어떤 대상을 소스코드로 그리기 위한 컴퓨터 공학적 사고 방식을 의미

 

객체(Instance, 인스턴스)란?

현실세계에 있는 어떤 대상을 추상화한 것

ex. 동물, 수강생, 튜터, 학교나 은행과 같은 기관, 감정, 생각 모두 객체로 표현할 수 있다.

 

객체가 나오면 반드시 따라오는 클래스 (내가 만드려고 하는 객체의 설계도!)

클래스(Class)란 객체를 생성하기 위해 어떤 속성과 방법의 집합을 추상화하여 표현한 것.

클래스 안에는 함수, 변수가 있고, 심지어 클래스 안에 클래스를 또 만들수도 있다.

클래스 안에 있는 맴버함수와 변수에 접근하기 위해서는 반드시 객체를 이용해야 한다.

클래스는 사용자 정의 자료형이다.

 

반드시 알아야 하는 개념!

  • 상속
    만약 다른 클래스의 기능을 사용하고 싶다면 상속을 받아서 부모클래스와 자식클래스의 관계를 만들면 된다
    이를테면 '동물'이라는 클래스 안에 '걷기'함수, '숨쉬기'함수가 있고 '개'클래스와 '고양이'클래스가 '동물'클래스를 상속받으면
    굳이 공통되는 기능을 다시 구현하지 않아도 된다.
    (자식 클래스는 부모 클래스의 기능을 쓸 수 있지만, 부모 클래스는 자식 클래스의 기능을 쓸 수 없다.)

  • 오버라이딩
    상속받은 클래스에서 어떤 기능을 재정의하는 것.
    예를 들어서 부모클래스에서 'get()'이라는 함수가 있는데 이름을 똑같이 자식 클래스에서 'get()'이라는 함수를 만들고 그 기능을 다시 정의하는 것.

  • 오버로딩
    연산자 오버로딩, 메소드 오버로딩, 함수 오버로딩 등 다양하게 있지만 일단 파이썬에서는 함수오버로딩은 없다고 생각하면 된다. (구현이 불가능 한 것은 아님.)
    일반적으로 오버로딩이라고 하면 함수의 이름은 같으나 매개변수를 다르게 설정하여 사용 목적에 따라 다르게 불러오는 것을 의미.

 


소프트웨어 개발 방법론

소프트웨어를 개발하기 위해서 어떤 방법으로 개발해 나가는 지에 대한 개념

 

폭포수 방법론

하향식 방법으로 가장 오래된 개발 방법.
보통 '계획,기획 ➡️ 설계 개발 ➡️ 시험 ➡️ 유지보수' 순차적으로 진행하며

SDLC(소프트웨어 개발 생명 주기)가 굉장히 길다. (이 주기를 보통 1번만 실행함)

때문에 보통 매우 큰 규모의 프로젝트에 적합하며, 이미 진행된 작업에 대해서는 변경 및 수정이 어렵다는 단점이 있다.

 

애자일 방법론

반복적이고 점진적으로 개발하는 방법. 
'계획,기획 ➡️ 설계 개발 ➡️ 시험 ➡️ 유지보수'  순차적으로 진행하되 SDLC(소프트웨어 개발 생명 주기)가 굉장히 짧기 때문에 여러번 반복하며 점진적으로 개발해 나간다.

때문에 이해관계자의 피드백을 빠르게 반영할 수 있지만 개발 계획을 세우기 어려울 수 있다.


디자인 패턴

소프트웨어를 설계 및 구현할 때 어떠한 공통된 구조를 띄는 형태

 

비유와 설명

예를 들어서 우리가 어떤 건물을 설계한다면, "나는 아파트를 설계할거야"라고 했을 때 딱 떠오르는 아파트 디자인들(크고 높고 다닥다닥 붙은 구조물), "초등학교를 설계"할 때 떠오르는 초등학교 디자인, 운동장과 높지는 않지만 넓게 건축되어 있는 건축물과 같다.

나는 소프트웨어에서 어떤 패턴으로 개발했어.

라고 했을 때 바로 어떤 의도의 소프트웨어인지, 어떤 구조로 되어있는 지 쉽게 파악하기 위한 것.

 

MTV 패턴

python 기반의 웹 구현을 위한 프레임워크인 Django(장고)가 MTV 디자인 패턴을 지향한다.

M: model(모델)을 의미, DB에 적재할 테이블을 정의를 담당

T: Template(템플릿)을 의미, 사용자에게 보여지는 화면을 의미

V: View(뷰)를 의미하며 요청에 따라 필요한 로직을 수행하는 역할을 담당

 

MVC 패턴

MTV패턴은 MVC패턴에 영감을 많이 받았다. MVC패턴과 MTV패턴은 사실 같은 개념인데,

MTV패턴은 장고에 국한된 개념이라 볼 수 있다. (둘을 다른 개념으로 보기도 한다.)

 

MTV에서 모델 == MVC에서 M모델 같은 개념

MTV에서 T템플릿 == MVC에서 V뷰 같은 개념

MTV에서 V뷰 == MVC에서 C컨트롤러 같은 개념


형상관리

형상관리란 소프트웨어의 변경사항을 추적하고 통제하기위한 작업을 의미

 

형상관리 를 위한 툴

git

분산 버전 관리 시스템. 프로젝트를 관리할 수 있게 해주는 매우 유용한 시스템

gitlab과 github은 차이가 거의 없지만, gitlab은 기업용으로 설계되어 좀 더 많은 기능을 제공하고 비용도 발생한다.

 

gerrit

코드리뷰툴로 효과적으로 코드를 적용할 수 있도록 해주는 툴

 

sourcetree

다소 불편한 git UI를 훨씬 편하게 보며 작어할 수 있게 해주는 툴. (git과 연동 가능)

 

jira (형상관리는 아니고 협업 툴)

서로의 작업을 확인하고 할당할 수 있게 도와준다. (git과 연동 가능)


V&V (Verification & Validation) 검증과 확인

소프트웨어의 완성도 및 신뢰도를 검증 및 확인하는 작업

소프트웨어를 개발하면 우리의 의도대로 동작하는 지 또는 충분한 성능을 나타내는 지, 보안 이슈는 없는 지 등 다양한 방면에서 소프트웨어의 완성도를 검증하는 작업을 거쳐야한다.

QA(Quality Assurance, 품질보증) 분야도 굉장히 복잡하고 어려운 용어들이 많지만 일단 기초적인 개념만 알아보자.

 

Verification(검증)

개발자 중심에서 제품이 '요구사항'에 만족하게 구현되어있는지에 대해 검증하는 작업

 

Validation(확인)

사용자 중심에서 제품이 '사용감'에 만족하게 구현되었는지에 대해 확인하는 작업


Test(시험)

소프트웨어를 test하는 방법은 여러가지가 있습니다.

 

Test 단위

보통 단위->통합->시스템->인수 테스트를 순차적으로 실행하지만

상황에 따라 몇 단계를 생략하거나 추가할 수 있고 순서가 바뀔 수 있다.

  • Unit Test (단위 시험)
    가장 작은 단위의 test, 함수, 모듈 등 제일 작은 단위의 기능을 테스트
  • Intergration Test (통합 시험)
    함수간, 클래스간, 모듈간 어떤 기능이 합쳐져서 잘 동작하는지 테스트
  • System Test(시스템 시험)
    실제 적용하려는 하드웨어나 어떤 시스템에 개발한 소프트웨어를 탑재한 뒤 테스트
  • Acceptance Test(인수 시험)
    출시 및 배포 전 최종 테스트

Test종류

  • 정적 Test
    소프트웨어를 구동하지 않고 test 하는 방법 
    ex. 동료 검토, 코드리뷰, 기술 검토

  • 동적 Test
    소프트웨어를 구동하며 test하는 방법
    - Black Box Test(블랙박스테스트)
    소프트웨어의 작동 원리를 모르는 상태에서 진행하는 test
    결과물이 요구사항과 일치하는 지 알아보기 위한 테스트
    (ex. 프로그래머스에서 코드실행할 때)

    - White Box Test(화이트박스테스트)
    소프트웨어의 작동원리를 보며 진행하는 test
    소프트웨어가 의도한대로 동작하는 지 알아보기 위한 test

 

사실 test의 종류는 더욱 많지만 일단 여기까지만 알아보도록 하자...