오늘부터 소프트웨어 공학에 대해 배우는 날입니당!
전 이론을 좋아하는 이상한 감자에요. 호홓 재밌겠당 ><


우리가 공부할 교재에용. 왜 소프트웨어 공학을 배워야하는 가?!?!
- 사용자의 요구를 잘 파악해야 함.
- 프로젝트의 성격 및 여건을 고려해서 설계해야 함.
- 디자인 패턴의 종류와 적용 방법 알아야 함
- 테스트 작업, 유지보수 작업의 방법과 절차 알아야 함.
cf) 애자일 프로세스
: 개발 팀의 팀워크, 변경을 고려한 설계, 짧은 개발 주기의 반복, 사용자의 적극적인 참여 등을 강조한 방법
이제부터 본격적으로 SW 공학에 대해서 공부해 보자구용~! 고고씽!

[학습목표]
- 소프트웨어가 뭐게여? 특징은 뭐게요?
- SW 공학이란?
- SW 품질을 어떻게 정의하고, 뭐가 결정하게요?
- 프로젝트에는 어떤 유형이 있고, 중요한 작업은 뭐게요?
- SW 프젝에는 어떤 작업이 있게여?
- 객체지향 방식의 SW 개발 방법이 다른 방법이랑 어떻게 다르게요?
: 입력된 자료를 처리하여 결과를 출력하는 프로그램과 프로그램의 개발, 운용, 보수에 필요한 자료 일체를 말한다. (하드웨어의 반대말)
cf) 소프트웨어 위기
: 소프트웨어가 지닌 복잡한 성질에 더하여, 경제 원리를 적용하기 어렵고. 인간의 작업을 기계처럼 정확히 예측하기 어렵다는 것에서 비롯됨.
소프트웨어의 유형
ㅇ 공급 방식에 따른 유형
1) 주문형 소프트웨어
: 특정 고객의 수요를 만족시키기 위해, 개발된 소프트웨어
=> 사용자가 한정되고, 개발의 성패가 사용자의 결정과 필요에 절대적으로 좌우된다.
ex) 웹 사이트, 제어 시스템, 재정 관리 시스템
2) 패키지형 소프트웨어
: 공개된 시장에 내놓고 판매하기 위한 것
=> 전적으로 시장의 요구에 따라 결정된다.
3) 임베디드 소프트웨어
: 시장에서 판매되는 하드웨어 장치에 탑재되어 실행되는 소프트웨어.
ㅇ 자료를 처리하는 방식에 따른 유형.
: 공학적 원리를 소프트웨어 개발에 적용하는 것.
=> 고객의 문제를 해결해주기 위해, 품질 좋은 대규모 소프트웨어 시스템을 정해진 시간과 비용으로 개발하거나 발전시키는 체계적인 과정.
: 사용 용이성, 효율성, 신뢰성, 유지보수성, 재사용성
고객: 업무에 관련된 문제를 지불 가능한 비용과 사용 가능한 자원으로 해결함.
사용자: 사용하기 쉬움. 효율적임, 업무 기능이 향상됨.
개발자: 설계가 쉬움, 유지보수 작업이 용이함, 재사용이 용이함.
개발 관리자: 매출 신장, 개발 및 유지보수 작업 비용을 줄여 소비자를 행복하게 함.
새로운 시스템 개발
: 아무것도 없는 상태에서 완전히 새로운 시스템을 개발하는 프로젝트 유형.
=> 오류나 문제점에 의한 제한을 받지 않는다. but, 많은 작업과 시간이 소요됨.
=> 구조 설계와 핵심 컴포넌트의 성능을 깊이 다뤄야 한다.
진화 유형
: 현존하는 시스템을 변경하는 유형. 중요한 새기능을 추가하고 개선하는 작업.
=> 리모델링해서 많은 부분 개선하는 과정과 동일.
cf) 초기 시스템 설계에 반영한 의견이나 SW 구조 유형이 사라짐.
cf) 컴포넌트(Component) = 반찬통
설명: 하나의 기능을 하는 작은 조각이야.
cf) 프레임워크: 다른 프로젝트에 사용할 목적으로 설계한 공통의 틀.
-> 전체 구조와 규칙을 제공하는 뼈대야.
cf) 글루: 컴포넌트들을 연결하기 위해, 작성한 프로그램.
=> 프레임워크나 컴포넌트를 사용하면, 이미 신뢰성을 확증한 소프트웨어를 다시 사용함으로써 얻는 이득이 있다.
: 요구 분석 -> 설계 -> 구현 -> 테스트 -> 유지 보수
=> 각 단계에 대해서 자세히 살펴볼 예정이다.

: 무엇을 개발할 지 결정하는 작업.
: 소프트웨어 엔지니어가 개발하려는 분야의 배경지식을 알아가는 과정
cf) 도메인이란 말은 소프트웨어를 사용할 것으로 예상되는 고객이 일하는 분야의 비즈니스나 기술을 의미한다.
-> 도메인 분석으로 얻을 수 있는 장점으로는 빠른 개발, 좋은 시스템, 확장 예견이 있다.
: 문제를 이해하기 위해 정보를 수집하고 사용자에게 무엇이 필요한지 찾아내는 것.
기능적 요구
: 시스템이 무엇을 하는지, 즉 사용자나 다른 시스템을 위해 제공하는 서비스가 무엇인지 기술한 것.
비기능적 요규
: 비기능적 요구는 소프트웨어를 개발하는 동안 고수해야 할 제약 조건으로, 사용하는 하드웨어의 제약, 소프트웨어 품질의 특성에 대한 수준의 범위를 정해놓은 것.
: 문제와 현재의 상태를 파악하고 요구를 도출한 후 해결책을 제시하고 소프트웨어가 어떤 기능을 가져야 하는지 정확히 기술하는 단계.
: 도출한 요구 사항이 적절한지 검토하고, 수정이 필요하면 다시 요구 추출 단계로 돌아간다.
: 사용할 수 있는 기술을 이용하여, 요구 사항을 어떻게 구현할 것인지 결정하는 작업.

하향식 설계
: 가장 높은 수준의 구조부터 시작하여 점차 낮은 수준의 구조로 내려오면서 각종 설계 이슈에 관한 의사 결정을 하는 방법이다.
상향식 설계
: 재사용이 가능한 낮은 수준의 기능을 먼저 정한 다음, 높은 수준의 구조를 만들기 위해 이것들을 어떻게 배치할지 결정한다.
아케텍처 설계
: 시스템의 전체 구조와 구성 요소 간의 관계를 정의하여 큰 틀을 설계하는 단계.
클래스 설계
: 객체지향 설계에서 데이터와 동작을 포함한 클래스를 정의하고 관계를 구성하는 과정.
사용자 인터페이스 설계
: 사용자와 시스템이 상호작용하는 화면과 조작 방식을 시각적, 기능적으로 구성하는 작업.
데이터베이스 설계
: 데이터 구조와 관계를 정의하여 효율적이고 일관된 데이터 저장 및 접근 방식을 설계하는 과정.
알고리즘 설계
: 문제 해결을 위한 절차적 논리 흐름을 정의하고 최적의 처리 방법을 결정하는 작업.
프로토콜 설계
: 시스템 간 통신을 위한 규칙과 메시지 형식을 정의하여 올바른 데이터 교환이 가능하도록 만드는 과정.
목표와 우선순위 결정
: 본격적인 설계를 시작하기 전에, 여러 가지 품질 측면에 대해 목표와 우선순위를 수립해야 한다.
=> 순서도 없이, 프로세스도 없이 일 처리하면 될까요? 안될까요?!?! 당근 안되는거지!!!! 그러다가, 우리 설계 꼴 나는 거에요!!!
비용 효과 분석
: 설계할 때, 고려해야 할 중요한 점은 비용을 줄이고 효과를 높이는 방법.
- 소프트웨어 엔지니어링 작업에 드는 추가 비용
- 특정 개발 기술에 드는 추가 비용
- 사용자 및 제품 지원 인력에 드는 추가 비용
- 소프트웨어 엔지니어링 작업 시 절약 시간
- 매출 향상이나 사용자의 금전적 이익
: 설계한 내용을 구현하는 작업.
: 프로그램을 구현한 후, 기능이 원하는 대로 작동하는 지 테스트하는 작업.
: 개발된 소프트웨어를 완벽해질 때까지, 계속 발전시켜나가는 작업.
: 객체지향 프로그래밍 언어에 특화된 소프트웨어 공학. 시스템이 객체로 구성되고, 관련된 객체 사이의 상호작용이라는 관점을 중요하게 여김.
=> 시스템을 함수의 집합체로 보는 절차적인 프레임과 다름!!
: 개발작업을 엄격하게 순차적으로 이뤄지는 것이 아니라, 반복 및 점증적으로 이뤄짐.
: '언제 무엇을 할 것인가'를 다룬다. 즉, 어떻게 작업을 수행하는 지 정의한다. 그래서 UML을 배움.
왜?!?!?!?
: 객체지향 방법론으로 설계한 내용을 모델링하는데 사용하는 언어거든. 그래서 분석과 설계 과정에서 나온 아이디어를 다이어그램으로 표현한다.
=> 추상, 분석과 설계 방법, 사용자 인터페이스 프로토타이핑, 소프트웨어 구조, 소프트웨어 프로세스, 재사용, 측정, 도구와 통합 환경
추상화
: 중요하지 않은 부분을 생략하고, 문제의 핵심을 개괄적으로 표현하여 집중하는 것.
cf) 객체: 시스템에서 다루어야 할 데이터와 함수에 대한 추상적인 표현.
분석과 설계 방법
: 설계 의도와 아이디어를 잘 표현할 수 있는 표준 방법(UML)
사용자 인터페이스 프로토 타이핑
프로토타이핑: 기능이 제한된 소규모 시스템 버전을 구축하는 것.
-> 사용자에게 시스템이 어떤 기능을 가질 것인지 미리 보여주어, 개발자의 의도와 사용자의 요구가 일치하는 지 점검.
cf) 인터페이스: 서로 다른 것들이 약속한 방식대로, 소통할 수 있게 해주는 연결 통로.
소프트웨어 구조
: 시스템이 어떤 컴포넌트로 나뉘고, 각 컴포넌트가 어떤 역할을 담당하며 어떻게 인터페이스하는 지를 나타낸 것.
ex) 클라이언트-서버, 중앙 리포지처리, 계층형
소프트웨어 프로세스
: 전체 개발 작업 과정을 확립하고 진척을 관리하는 일
재사용
: 서로 다른 애플리케이션이라도 공통 부분이 있다면, 조금만 고쳐서 다음 시스템 개발에 사용.
측정
: 정확히 작업을 정의하고 수행한 후, 객관적으로 평가함.
도구와 통합 환경
: 플랫폼 통합, 표현 통합, 프로세스 통합, 데이터 통합, 제어 통합.
문제 3번
: 소프트웨어 품질 목표 중 사용자가 요구하는 기능을 충적시키는 정도를 의미하는 것은?
=> 정확성
문제 8번
=> 소프트웨어 공학은 협동 작업으로 이루어지는 개발 과정에 적용되는 공학적 원리.
문제 10번
=> 고객은 소프트웨어의 개발 및 구매를 발주하고 확보하는 역할을 한다.
문제 11번
=> 객체는 자료와 관련 함수의 집합체이다.
- 소프트웨어가 뭐게여? 특징은 뭐게요?
-> SW는 입력된 자료를 처리하여, 결과를 출력하는 프로그램과 프로그램의 개발, 운용, 보수에 필요한 자료 일체를 말함.
-> 특징: 무형, 복제 및 수정이 쉬움. but, 시간이 지날 수록 관리가 필요함.
- SW 공학이란?
: 고객의 문제를 해결해주기 위해, 품질 좋은 대규모 소프트웨어 시스템을 정해진 시간과 비용으로 개발하거나 발전시키는 체계적인 과정.
- SW 품질을 어떻게 정의하고, 뭐가 결정하게요?
: 사용 용이성, 효율성, 신뢰성, 유지보수성, 재사용성
- 프로젝트에는 어떤 유형이 있고, 중요한 작업은 뭐게요?
: 새로운 시스템 개발, 진화 유형, 컴포넌트 기반,
- SW 프젝에는 어떤 작업이 있게여?
: 요구 분석, 설계, 구현, 테스트, 유지 보수
- 객체지향 방식의 SW 개발 방법이 다른 방법이랑 어떻게 다르게요?
: 전통적인 프로세스는 순차적으로 진행하는데, 요구의 변경 시, 비용이 많이 듦. 객체지향 방식은 반복 및 점증적으로 이루어지도록 발전함. '언제 무엇을 할 것인가'를 다룬다. 어떻게 작업을 수행할건데?를 정의함.

할 수 있다.. 할 수 있다!! 할 수우웅 있어어어어어!! 흐으앙 너무 많아.. 땡벌..지쳤당께
[학습목표]
- 절차 지향 패러다임 vs 객체지향 패러다임
- 클래스 vs 객체
- 인스턴스 변수 vs 클래스 변수, 메소드 vs 오퍼레이션
- 클래스의 상속 계층이 무엇? 다형성이 어떻게 적용?
- UML이 뭐야?
- 객체지향 설계랑 코딩이랑 무슨 관계? 너네 무슨 사이니??
객체지향 프로그램은 '추상화라는 개념'을 이용함.
=> 프로시저 추상화와 데이터 추상화를 묶어 놓은 것.
cf) 추상화: 자세한 묘사를 생략하고 특징만 포착해서, 그리는 것.
프로시저 추상화
: 특정 포러시저를 사용할 때, 프러시저 안에서 어떤 계산이 이루어지는 지 자세히 모르더라도 어떻게 호출하고 무엇을 수행하는지만 알고 있으면 자세한 것은 걱정할 필요가 없는 것을 의미(말이 너무 길다;;)
=> 프로그램에 대한 프로그래머의 관점이 단순해지고, 복잡한 것을 쉽게 이해할 수 있게 된다.
데이터 추상화
: 데이터에 대한 조작, 즉 오퍼레에션도 함께 정의하는 개념.
=> 시스템의 복잡성을 줄이는데 도움이 된다.
cf) 데이터 추상화를 적용한 시스템: 서비스를 제공하는 객체들의 집함.
-> 다음은 절차지향 패러다임으로 분석해본다.
프러시저 추상화 관점
: 어떻게 동작하는지는 몰라도, 그냥 써
예) print("Hello")
: 우리가 내부에서 글자가 화면에 어떻게 출력되는지 몰라도 그냥 쓰면 됨.
o 초점: "무엇을 할지"만 알고, "어떻게 할지"는 몰라도 되는 구조
o 비유: 커피 자판기 버튼만 누르면 커피가 나오는 것처럼, 속 동작은 숨기고 결과만 보여줌
데이터 추상화 관점
: 데이터가 어떻게 생겼는지 몰라도, 다룰 수 있게 해줘"
예) 리스트(list), 스택(stack), 큐(queue) 같은 자료구조.
=> 내부적으로 배열인지 연결리스트인지 몰라도, 그냥 push, pop 같은 함수로 사용함.
o 초점: "어떤 데이터가 있는지"만 알고, "어떻게 저장되는지"는 몰라도 됨.
o 비유: 택배 상자만 보면 내용물은 모르지만, ‘상자’라는 형태로 다룰 수 있는 것처럼
: 데이터 및 데이터에 접근하고 수정하는 프러시저를 같은 범주 안에 두고 캡슐화하는 접근 방법.
cf) 객체: 프로그램을 이루는 구문 단위인 클래스의 인스턴스로서, 데이터 추상화와 프로시저 추상화를 모두 실현한 개념.
- 인형(객체): 고양이, 자동차, 사람, 계산기 등 역할이 있는 물건
- 속성(데이터): 고양이의 이름, 자동차의 색깔 같은 정보
- 동작(기능): 고양이가 걷기, 자동차가 달리기 등
=> 즉, 객체 = 정보 + 행동을 가진 주체야!
cf) 객체지향 프로그램은 클래스의 모임으로 이루어지며, 각 클래스에는 클래스의 인스턴스인 객체의 값을 조작할 수 있는 포러시저들이 모여 있다.
=> 클래스들이 프로그램 구문의 기초 단위를 이루며, 호출 관계가 아닌 다른 형태의 관계로 계층을 형성한다.
객체
: 실행되는 프로그램에 존재하는 구조화된 데이터의 덩어리.
즉, 데이터를 객체라 불리는, 식별 가능한 분리된 개체로 만든 것.
=> 모든 객체는 상태(state)와 행위(behavior)라는 두 가지 요소를 갖는다.
클래스
: 객체지향 프로그램에서 데이터를 추상화하는 단위.
=> 유사한 객체들을 정의한 프로그램 모듈. 같은 상태와 행위를 가진 모든 객체는 같은 크래스에 속한다.
cf) 인스턴스: 어떤 클래스에 속하는 특정 사례. (관계를 나타냄)
: 각 인스턴스에 존재하는 데이터를 저장하기 위해 여러 개의 변수를 정의.
cf) 변수: 데이터를 저장하는 장소.
: 클래스에 속하는 객체들이 공유해야 하는 값이 필요한 경우가 있는데, 이를 부름.
메소드
: 클래스의 행위를 구현하는 데, 사용하는 일종의 프러시저.
오퍼레이션
: 클래스 행위의 타입. 즉, 메소드와 독립된 함수 타입.
: 실행 중인 프로그램은 같은 이름의 메소드 중 어떤 것을 호출할 지 결정하는 것을 말함.
: 슈퍼클래스에 정의한 변수와 메소드를 서브 클래스가 묵시적으로 소유하게 하는 것
-> 기본 클래스를 정의하고, 여기서 파생된 구체적인 클래스로 특수화하는 것이 좋음.
일반화
: 여러 개의 서브클래스로부터 공통점을 찾아내어, 나의 슈퍼 클래스를 도출하는 과정
상속 계층 구조, is-a구조
: 일반화 관계를 여러 단계 형성한 것.
is-a 규칙
: 'an A is a B'가 성립하면, A 클래스가 B 클래스의 서브클래스가 된다는 것.
: 다양한 모양을 가지는 성질
1) 다형성은 오퍼레이션이나 속성의 이름이 하나 이상의 클래스에서 정의되고 각 클래스에서 다른 형태로 구현될 수 있는 개념.
2) 다형성은 속성이나 변수가 서로 다른 클래스에 속하는 객체를 지칭할 수 있는 성질.
cf) 함수 재정의
: 슈퍼클래스에서 정의된 메소드가 서브 클래스에서 다시 정의되는 것.
cf) 오버 로딩
: 같은 클래스 안에 이름이 같은 여러 오퍼레이션을 정의하는 것.
: 소프트웨어를 시각적으로 모데링하기 위해 사용한다.
-> 기호와 심볼, 그림을 사용해서 나타낼 수 있음.
: 소프트웨어 개발에 도움을 주기 위해서다!
다이어그램으로 설계하면, 구조도 좋아지고. 개발자들 간의 의사소통이 쉬워진당! 객체 지향 모델링할 때 방법이 많은데, 시스템 통합시킴.
: 액터와 사용 사례를 통해 시스템의 기능을 모델링 하는 데 사용한다.
-> 개발하려는 시스템의 기능적 요구 또는 업무 프로세스의 개관을 나타낸다.

: 객체 사이의 메시지 교환을 시간의 흐름에 따라 나타낸 것이다.
-> 즉, 사용 사례로 표시된 업무 프로세스에 대해 시스템 안의 존재하는 객체가 어떤 식으로 개입하여 상호작용하는지를 나타낸다.

: 객체지향 시스템의 가장 근간이 되는 다이어그램으로 시스템의 정적인 구조를 나타낸다.
-> 도메인(문제 영역)의 개념과 그것들 사이의 관계를 표시한다.

: 관련된 클래스를 패키지로 그루핑하여 복잡한 시스템을 조직화하는 데 사용한다.

: 외부 자극에 대한 시스템의 동적 상태 변화를 나타낸다.
-> 외부 이벤트에 대해 민감하게 상태를 변화시키는 객체를 모델링 한다.

: 시스템의 내부 프로세스를 단계별 작업 흐름 형태로 모델링 한다.
-> 시스템의 동적 특징을 나타낸다.

: 노드, 컴포넌트, 커넥터 등 시스템의 물리적 자원 배치를 나타낸다.

: 비주얼화, 명세, 구축, 문서화, 테스트 기준
[학습목표]
- 절차 지향 패러다임 vs 객체지향 패러다임
: 객체 지향은 절차가 아닌, '객체'를 중점적으로 바라보는 관점을 말한다. 고정적인 개발 프로세스에 집중하지 않은 것을 말한다.
- 클래스 vs 객체
: 클래스는 객체지향 프로그램에서 데이터를 추상화하는 단위.
객체는 실행되는 프로그램에 존재하는 구조화된 데이터의 덩어리.(상태와 행위로 나뉜다.)
- 인스턴스 변수 vs 클래스 변수, 메소드 vs 오퍼레이션
인스턴스 변수: 각 객체만의 속성
클래스 변수: 클래스 전체가 하나만 갖고, 모든 객체가 같이 쓰는 변수
예) 강아지의 다리는 4개다.
메소드: 객체가 수행하는 함수(행동)
오퍼레이션: 이 클래스는 이런 행동이 가능해요~ 라고 미리 써놓은 목록
- 클래스의 상속 계층이 무엇? 다형성이 어떻게 적용?
상속: 서브 클래스가 묵시적으로 슈퍼클래스에서 정의한 매소드를 소유하게 되는 것.
- UML이 뭐야?
설계를 위해 객치프를 하는데. 객치프를 가시화한 거야.
- 객체지향 설계랑 코딩이랑 무슨 관계? 너네 무슨 사이니??
설계한 걸로, 요구사항 보고 코딩하는 거지.

술.. 술..술.. 알콜이 필요할 것 같아요. 미.칠.것.같.아..