CS

컴퓨터 공학 지식(5) : 소프트웨어 공학

hxx_1 2024. 1. 22. 16:07

< 리팩토링: Refactoring >

- 외부적으로 드러나는 기능을 변경하지 않음 (결과의 변경 없이 코드를 조정)

- 소스 코드의 가독성과 유지 보수의 용이성을 높이기 위해 내부 구조를 변경

-> 기존 기능은 유지하되 개발 과정에서 편리한 코드가 되도록 재작성 하는 것

-> 새로운 기능을 추가하거나, 버그를 제거하기 위한 목적은 아님

 

< 필요성 >

- 대규모 프로젝트를 진행하기 위해 유지보수의 용이성이 요구됨

-> 소프트웨어의 구조, 구현, 설계를 개선하면서 기능을 보존

 

- 소스 코드의 가독성이 떨어지는 경우, 다른 사람과의 협업이 어려울 수 있음

- 리팩토링을 통해 코드의 중복을 제거하고, 수정이 편리해질 수 있음

-> 코드의 품질이 좋아 수정하기 용이하다면, 궁극적으로는 개발 속도가 개선

 

< 리팩토링이 필요한 상황 > 

- 유사한 코드가 세 번 이상 반복될 때

-> But, 개발 일정 및 계획을 감안해야 함

 

- 코드 리뷰를 통해 다른 사람에게 코드를 공유할 때

->  But, 너무 많은 인원이 참여하지 않는 것을 권장

 

- 새로운 기능을 추가할 때

-> 현재 코드를 유지한 상태로 새 기능을 추가하는게 어렵다면, 리팩토링 고려하기

 

- 버그를 수정해야 할 때

 

< 리팩토링을 하지 말아야 할 때 >

- 현재의 코드가 정상 동작조차 하지 않는 상황 ( 재작성 필요 )

- 개발 일정 마감이 다가온 상황

 

< Two Hats 원칙 >

1) 기능을 추가할 때: 기존 코드를 수정하지 말고, 기능 및 테스트만 추가한다.

2) 리팩토링 할 때: 기능을 추가하지 말고, 기존 동작을 유지한 상태로 내부 구조만 변경한다.

-> 추가 오류를 최소화하기 위하여 리팩토링에만 집중할 수 있도록 한다. 

 

< 클린 코드: Clean Code>

: 개발자가 보기에 깔끔한 코드 ( 이해하기 쉬운 코드 )

 

< 작성 팁>

- 가능한 잘 알려진 코드 컨벤션을 따르며 코딩하기

-> Camel Case, Snake Case 등 언어에 맞는 적절한 컨벤션을 따르자

- 나중에 다시 보아도 빠르게 이해할 수 있는 코드를 작성하기

- 핵심적인 기능을 담당하는 코드는 주석을 통해 세부 내용을 추가적으로 친절히 설명하기

- 동사를 사용하기 

ex) 함수 이름: saveFile( )

- 하나의 파일에서는 하나의 프로그래밍 언어 사용하기

 - 참조되거나 수정되는 코드는 기존 코드보다 clean 해야 한다. 

 

< TDD: 테스트 주도 개발 >

- 소프트웨어 개발 방법론 중 하나로, 작은 단위의 테스트 케이스를 활용

- ① 먼저 테스트 케이스를 작성한 뒤에 ② 이를 통과하는 코드를 작성하는 방식으로 개발

- 짧은 개발 주기를 반복하는 개발 과정에 적합

-> 애자일 개발 방법론 중 XP의 "Test-First" 와 맥락을 같이 한다. 

 

< 개발 과정 > 

: 테스트 코드를 작성한 뒤에 실제 코드를 작성 ( 테스트 케이스 필요 )

< 특징 > 

- 생산성 저하 ( 개발 속도 저하 )

-> 계속해서 테스트 과정을 거치며 코드를 고쳐 나간다.

- 해당 과정에 익숙하지 않은 개발자에게 TDD 방법을

체득하기 위한 시간이 필요하다. 

 

< 애자일 Agile >

: 소프트웨어 개발 방법론 중 하나

- 사용자로부터 요구사항을 한꺼번에 받아서 개발을 시작하지 않음

- 일정한 주기를 가지고 반복적으로 프로토타입을 만듦

-> 그 때마다 필요한 요구 사항을 받아 수정하며 확장시킨다. 

 

① 계획 -> ② 설계 -> ③ 발전 -> ④ 테스트 -> ⑤ 검토 (반복)

 

< 객체 지향 프로그래밍 >

: 현실 세계의 사물 (개체) 를 코드로 모델링하여 프로그램을 작성하는 방식

: 다양한 부품을 조합하여 하나의 완성된 프로그램을 조립하는 것에 비유할 수 있다.

: 코드의 재사용성이 높지만, 일반적으로 절차 지향 방식에 비해 느리다. 

 

< 특징 >

1. 추상화: 객체들의 공통적인 속성과 메서드를 정의한다.

ex ) 클래스 정의

 

2. 상속: 하나의 클래스가 가진 정보 ( 속성, 메서드) 를 다른 클래스가 물려 받아 사용한다.

-> 코드의 재사용성을 높여 생산성을 높일 수 있음

 

3. 캡슐화: 실제 구현부를 외부에 드러나지 않도록 은닉한다.

-> 각 객체가 독립적으로 기능하며, 데이터와 기능(메서드)을 하나로 묶어 관리할 수 있다.

 

4. 다형성: 다른 방법으로 동작하는 함수를 동일한 함수명으로 호출할 수 있다.

1) 오버라이딩: 부모 클래스의 메소드와 같은 이름 및 매개변수를 갖는 코드를 재정의한다.

2) 오버로딩: 함수 이름은 같지만 매개변수가 다른 함수를 정의한 뒤에, 필요에 따라 호출해 사용한다. 

 

< 절차 지향 vs 객체 지향 >

 

< 함수형 프로그래밍 >

: 순수 함수를 조합하여 프로그램을 개발하는 방식

: 대입 구문이 없는 프로그래밍

 

< 특징 >

- 데이터를 처리하는 과정을 일종의 수학적 함수를 계산하는 것으로 다룬다. 

- 데이터는 불변한 (immutable) 것으로 간주한다.

- 함수형 프로그래밍에서는 문제를 함수로 분해하여 해결한다.

- 함수형 프로그래밍 언어는 조건문 및 반복문을 지원하지 않는다.