**Software Engineering Cheat Sheet**

1. **Software Development Methodologies**
	* Waterfall Model: A linear, sequential approach to software development with distinct phases (requirements, design, implementation, verification, maintenance). Changes are difficult to implement once a phase is completed.
	* Agile Model: An iterative, flexible approach that values collaboration, customer feedback, and adaptability. Agile methodologies include Scrum, Extreme Programming (XP), and Kanban.
2. **Agile Concepts**
	* User Stories: Short, informal descriptions of software features written from the perspective of an end user. They are flexible, focused on user needs, and can change as the project progresses.
	* Scrum: An agile framework with key components including Product Backlog, Sprint Backlog, Sprint, Scrum Master, and Product Owner. It promotes effective communication, collaboration, and iterative development.
	* Retrospectives: Meetings held at the end of each sprint to review what went well, what could be improved, and any lessons learned. They promote continuous improvement.
3. **Version Control and Git**
	* Git: A distributed version control system that helps track code changes, manage branches, and collaborate with other developers.
	* Git Commands: Common commands include `git init`, `git clone`, `git add`, `git commit`, `git push`, `git pull`, and `git merge`.
	* Branching Strategies: GitFlow and GitHub Flow are strategies that help manage and organize code changes, making it easier to collaborate, track features, and isolate bug fixes.
4. **Software Testing**
	* Test-Driven Development (TDD): A development practice where tests are written before the code, following the Red-Green-Refactor cycle.
	* Unit Testing: Testing individual units or components of a software system to ensure they function correctly.
	* JUnit: A popular Java testing framework for writing and running unit tests.
	* Android Testing: Espresso is used for UI testing, while JUnit and Mockito are used for unit testing.
	* White-box Testing: Testing the internal workings of a software system using knowledge of the code structure.
	* Black-box Testing: Testing the external behavior of a system without knowledge of the implementation.
5. **Android Development**
	* Activities: Represent a single screen with a user interface in an Android app. They can be started using `startActivity(intent)`.
	* Intents: Used to start activities or services, and can carry data between components in an Android app.
	* onSaveInstanceState() and onRestoreInstanceState(): Methods to save and restore the state of an Android activity when it's destroyed and recreated.
6. **Design Patterns**
	* Adapter Pattern: A structural pattern that allows incompatible interfaces to work together.
	* Observer Pattern: A behavioral pattern that establishes a one-to-many relationship between objects, allowing them to communicate in a decoupled manner.
	* Singleton Pattern: Ensures that a class has only one instance and provides a global point of access to it.
7. **Dependency Management and Inversion of Control**
	* Dependency Injection: A technique for creating and managing dependencies between objects, promoting modularity, testability, and maintainability.
8. **Software Quality**
	* Functional Requirements: Describe the features and functionality of a software system.
	* Non-Functional Requirements: Describe the characteristics or qualities the software should possess, such as performance, reliability, and usability.
	* Software Validation: Ensuring the system meets the requirements and satisfies user needs.
	* Software Verification: Ensuring the system complies with its specifications and is error-free.
9. **Design Principles**
	* Law of Demeter: A design guideline that encourages minimal coupling between objects by limiting the interactions between them. It promotes code maintainability and understand
**소프트웨어 엔지니어링 치트 시트**1. **소프트웨어 개발 방법론** 1.	* 폭포수 모델: 뚜렷한 단계(요구사항, 설계, 구현, 검증, 유지보수)를 가진 선형적이고 순차적인 소프트웨어 개발 접근 방식. 한 단계가 완료되면 변경 사항을 구현하기 어렵습니다.	* 애자일 모델: 협업, 고객 피드백, 적응성을 중시하는 반복적이고 유연한 접근 방식입니다. 애자일 방법론에는 스크럼, 익스트림 프로그래밍(XP), 칸반이 포함됩니다.2. **애자일 개념** 2.	* 사용자 스토리: 최종 사용자의 관점에서 작성된 소프트웨어 기능에 대한 짧고 비공식적인 설명입니다. 유연하고 사용자 요구에 초점을 맞추며 프로젝트가 진행됨에 따라 변경될 수 있습니다.	* 스크럼: 제품 백로그, 스프린트 백로그, 스프린트, 스크럼 마스터, 제품 소유자 등의 주요 구성 요소가 포함된 애자일 프레임워크입니다. 효과적인 커뮤니케이션, 협업 및 반복 개발을 촉진합니다.	* 회고: 각 스프린트가 끝날 때마다 열리는 회의로, 잘된 점, 개선할 수 있는 점, 배운 교훈을 검토합니다. 지속적인 개선을 촉진합니다.3. **버전 관리 및 Git** 3.	* Git: 코드 변경 사항을 추적하고 브랜치를 관리하며 다른 개발자와 협업하는 데 도움이 되는 분산 버전 관리 시스템입니다.	* Git 명령어: 일반적인 명령으로는 `git init`, `git clone`, `git add`, `git commit`, `git push`, `git pull`, `git merge` 등이 있습니다.	* 브랜치 전략: GitFlow와 GitHub Flow는 코드 변경 사항을 관리하고 구성하는 데 도움이 되는 전략으로, 공동 작업, 기능 추적, 버그 수정을 더 쉽게 할 수 있도록 도와줍니다.4. **소프트웨어 테스트**	* 테스트 중심 개발(TDD): 레드-그린-리팩터링 주기에 따라 코드보다 먼저 테스트를 작성하는 개발 방식.	* 단위 테스트: 소프트웨어 시스템의 개별 단위 또는 구성 요소를 테스트하여 올바르게 작동하는지 확인하는 작업.	* JUnit: 단위 테스트를 작성하고 실행하는 데 널리 사용되는 Java 테스트 프레임워크.	* 안드로이드 테스트: UI 테스트에는 Espresso가, 단위 테스트에는 JUnit과 Mockito가 사용됩니다.	* 화이트박스 테스트: 코드 구조에 대한 지식을 사용하여 소프트웨어 시스템의 내부 작동을 테스트합니다.	* 블랙박스 테스트: 구현에 대한 지식 없이 시스템의 외부 동작을 테스트하는 방법.5. **안드로이드 개발** 5.	* 활동: 안드로이드 앱에서 사용자 인터페이스가 있는 단일 화면을 나타냅니다. 시작 액티비티는 `startActivity(intent)`를 사용하여 시작할 수 있습니다.	* 인텐트: 활동 또는 서비스를 시작하는 데 사용되며, 안드로이드 앱의 컴포넌트 간에 데이터를 전달할 수 있습니다.	* onSaveInstanceState() 및 onRestoreInstanceState(): 안드로이드 액티비티가 소멸 및 재생성될 때 상태를 저장하고 복원하는 메서드입니다.6. **디자인 패턴** 6.	* 어댑터 패턴: 호환되지 않는 인터페이스가 함께 작동할 수 있도록 하는 구조적 패턴.	* 옵저버 패턴: 객체 간에 일대다 관계를 설정하여 객체가 분리된 방식으로 통신할 수 있도록 하는 동작 패턴.	* 싱글톤 패턴: 클래스에 인스턴스가 하나만 있고 이에 대한 전역 액세스 지점을 제공하도록 보장합니다.7. **의존성 관리 및 제어의 역전** 7.	* 의존성 주입: 객체 간의 의존성을 생성하고 관리하여 모듈성, 테스트 가능성, 유지보수성을 높이는 기법.8. **소프트웨어 품질** 8.	* 기능적 요구사항: 소프트웨어 시스템의 특징과 기능을 설명합니다.	* 비기능적 요구사항: 성능, 신뢰성, 사용성 등 소프트웨어가 갖추어야 할 특성 또는 품질을 설명합니다.	* 소프트웨어 검증: 시스템이 요구 사항을 충족하고 사용자 요구 사항을 충족하는지 확인합니다.	* 소프트웨어 검증: 시스템이 사양을 준수하고 오류가 없는지 확인합니다.9. **설계 원칙** 9.	* 데메테르의 법칙: 객체 간의 상호 작용을 제한하여 객체 간의 결합을 최소화하도록 권장하는 설계 지침. 코드 유지보수성과 이해를 촉진합니다.