재사용
1. 재사용(Reuse)의 개념
- 목표 시스템의 개발 시간 및 비용 절감을 위하여 검증된 기능을 파악하고 재구성하여 시스템에 응용하기 위한 최적화 작업
- 기존의 소프트웨어 또는 소프트웨어 지식을 활용하여 새로운 소프트웨어를 구축하는 작업이다.
2. 재사용의 유형
- 재사용의 유형에는 함수/객체 재사용, 컴포넌트 재사용, 애플리케이션 재사용등이 있다.
- 함수와 객체 재사용 : 클래스나 함수 단위로 구현한 소스 코드를 재사용
- 컴포넌트 재사용 : 컴포넌트 단위로 재사용, 컴포넌트의 인터페이스를 통해 통신
- 애플리케이셔 재사용 : 공통기능 제공 애플리케이션과 기능을 공유하여 재사용
cf : 컴포넌트(Component): 특정한 기능을 수행하기 위해 독립적으로 개발되어 보급되는, 잘정의된 인터페이스를 가지며 다른 부품과 조립되어 응용시스템을 구축하기 위해 사용되는 소프트웨어 프로그램이다.
3. 코드 재사용(Code Reuse)
- 코드 재사용은 프로그램의 일부 또는 전부를 이후의 다른 프로그램을 만들때 사용하는 기법이다.
- 코딩(Coding) 작업에 소비하는 시간과 에너지를 절약하는 전형적 기법
- 프로그램 이전 버전에서 시작해 다음의 버전을 개발하는 작업도 코드 재사용에 속한다.
- 기존 프로그램에서 코드를 일부 또는 전체를 추출하여 새로운 프로그램에 복사할 경우 중복 코드로 인한 문제가 발생할 수 있다.
4. 재사용 프로그래밍 기법
- 재사용을 빠르고 용이하게 하기 위한 프로그래밍 기법이다.
- 객체지향 프로그래밍 : 객체 단위로 재사용이 이루어지도록 설계, 구조화된 프로그래밍 구현이 가능
- 제네릭 프로그래밍: 하나의 값이 여러 데이터 타입을 가질 수 있음, 재사용성을 높일 수 있는 프로그래밍 방식
- 자동 프로그래밍 : 사용자가 설정 변수에 근거한 프로그램 생성
- 메타 프로그래밍 : 런타임에 수행해야 할 작업의 일부를 컴파일 타임동안 수행하는 프로그램
cf : 런타임(Runtime) : 컴파일 과정을 마친 프로그램은 사용자에 의해 실행되어 지며, 이러한 응용프로그램이 동작되어지는 시점을 런타임이라고 부른다.
cf : 컴파일 타임(Compile Time) : 소스 코드를 작성하고 컴파일이라는 과정을 통해 기계어 코드로 변환되어 실행 가능한 프로그램이 되기 위한 편집 과정을 컴파일 타임이라 한다.
5. 재사용의 사례
1. 라이브러리(Library)
- 소프트웨어 개발 시 공통으로 사용될 수 있는 특정한 기능을 모듈화한 기법이다.
- 라이브러리의 종류로 표준 라이브러리와 런타임 라이브러리가 있다.
1. 표준 라이브러리
- 특정 언어의 개발 환경에 기본적으로 포함된 것들은 대부분 표준 라이브러리라고 불림
- 기본적인 기능 수행과 더불어 디버깅, 성능측정 등을 위한 별도의 API가 졵재
2. 런타임 라이브러리
- 프로그램이 실제 환경에서 실행되기 위해 필요한 모듈
- 대부분 위의 표준 라이브러리에서 기능 수행에 필요한 것들만 제공
2. 프레임워크(Framework)
- 소프트웨어 개발에서 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 툴이다.
- 프레임워크는 클래스와 라이브러리가 합쳐진 형태라고 볼 수 있다.
- 재사용 가능한 수많은 클래스들과 라이브러리들을 융합한 채로 제공한다.
3. 소프트웨어 아키텍처(Software Architecture)
- 시스템에 대한 기본 조직체계로 시스템을 이루는 구성요소 간 관계를 나타낸 지침과 원리를 포함하는 청사진이ㅏㄷ.
- 재사용 가능한 시스템의 추상화를 제공함으로써 소프트웨어 아키텍처는 시스템을 구성하는 요소와 관계를 간략하고 명확하게 나타낼 수 있다.
2. 모듈화(Modularization)
1. 모듈화(Modularization)의 개념
- 프로그램을 개발 시 생산성과 최적화, 관리에 용이하게 기능 단위로 분할하는 기법이다.
- 프로그램을 구성하는 데이터와 함수들을 묶어서 모듈을 형성
2. 모듈화의 장점
- 프로그램의 효율적인 관리 및 성능 향상이 가능
- 소프트웨어 이해의 용이성 증대와 복장성이 감소
- 기능의 분리가 가능하고 인터페이스가 단순
- 모듈의 재사용 가능으로 개발과 유지보수가 용이
3. 모듈화의 원리
- 모듈화의 원리는 분할과 정복, 정보 은닉, 데이터 추상화, 모듈 독립성이 있다.
- 정보은닉(information Hiding) : 어렵거나 변경 가능성이 있는 모듈을 타 모듈로부터 은폐
- 분할과 정복(Divide & Conquer) : 복잡한 문제를 분해, 모듈 단위로 문제해결
- 데이터 추상화(Data Abstraction) : 각 모듈 자료 구조를 액세스하고 수정하는 함수 내에 자료 구조의 표현내역을 은폐
- 모듈 독립성(Module Independency) : 낮은 결합도와 높은 응집도를 가짐
4. 모듈화 측정 지표
- 모듈화 적정성을 측정하는 지표는 응집도와 결합도이다.
- 좋은 모듈화란 용도에 맞게 잘 구분된 기능을 가진 모듈들로 세분화하는 것이다.
- 개별 모듈은 독립적으로 주어진 역할 만을 수행하며, 타 모듈에 의존성이 높지 않아야 한다.
cf: 응집도(Cohesion) : 모듈 내부에서 구성요소 간에 밀접한 관계를 맺고 있는 정도
cf: 결합도(Coupling) : 모듈과 모듈 간에 어느 정도 관련성이 있는지를 나타내는 정도
5. 모듈화의 유형
- 모듈화의 유형에는 설계 측면과 구현 측면으로 나뉜다.
[설계 측면]
- 모듈(Module) : 설계 시 연관 기능을 한 부분에 모아놓고 라이브러리 형태로 사용
- 컴포넌트(Component) : 바이너리 형태의 재사용 가능한 형태, 인터페이스에 의해 로직을 수행할 수 있는 모듈 단위
- 서비스(Service) : 기존 컴포넌트보다는 느슨한 결합 형태의 기능을 제공하는 모듈 단위
cf : 느슨한 결합(Loosely coupled) : 다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄여 코드 재사용성과 유연성을 높은 기법
[구현 측면]
- 매크로(Macro) : 프로그램의 반복되는 부분을 특정 이름을 부여하고 실행 할 수 있도록 하는 기법
- 함수(Function) : 프로그램 구현 시 커다란 프로그램의 일부 코드로 특정한 작업을 수행하고 상대적으로 다른 코드에 비해 독립적인 모듈
- 인라인(Inline) : 프로그램 구현 시 반복되는 부분을 특정 이름을 부여하여 실행할 수 있도록 프로그램 기법
3. 결합도
1. 결합도(Coupling)의 개념
- 모듈 내부가 아닌 외부의 모듈과의 연관도 또는 모듈 간의 상호의존성이다.
- 소프트웨어 구조에서 모듈 간의 관련성을 측정하느 척도이다.
2. 결합도의 특징
- 결합도는 모듈 연관성 없음, 인터페이스 의존성, 복잡성 감소, 파급효과 최소화 등의 특징을 가지낟.
- 모듈 연관성 없음 : 서로 다른 상위 모듈에 의해 호출되어 처리상 연관성이 없는 다른 기능을 수행
- 인터페이스 의존성 : 자료전달이 인터페이스를 통과하여 인터페이스 복잡성에 의존적
- 복잡성 감소 : 낮은 결합도를 통해 복잡성 감소
- 파급효과 최소화 : 에러 발생 시 오류가 전파되어 다른 오류의 원인이 되는 파급효과를 최소화
3. 결합도의 유형
- 결합도의 유형은 내부, 공통, 외부, 제어, 스탬프, 자료 결합도 순으로 결합도가 낮아 진다.
- 내용 결합도(Content Coupling) : 다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우
- 공통 결합도(Common Coupling) : 파라미터가 아닌 모듈 밖에 선언되어 있는 전역 변수를 참조하고 전역 변수를 갱신하는 식으로 상호 작용하는 경우
cf : 전역 변수 : 어떤 변수 영역 내에서도 접근할 수 있는 변수를 의미하는 용어로 지역 변수와 대비되는 개념
4. 응집도
1. 응집도(Cohesion)의 개념
- 모듈의 독립성을 나타내는 개념으로, 모듈 내부 구성요소 간 연관 정도이다.
- 정보 은닉 개념의 확장개념으로, 하나의 모듈은 하나의 기능을 수행하는 것을 의미
2. 응집도의 특징
- 응집도의 특징으로 유사기능 영역구성, 단일 책임할당, 함수 간 상호협력이 있다.
- 유사기능 영역구성 : 클래스 목적에 부합하는 같은 기능영역의 함수들로 구성
- 단일 책임할당 : 함수의 개수가 상대적으로 적고 오로지 자신만이 할 수 있는 책임을 할당받음
- 함수 간 상호협력 : 하나의 함수에 많은 기능을 넣지 않고 다른 함수와 협력
3. 응집도의 유형
- 응집도의 유형에는 우연적, 논리적, 시간적, 절차적, 통신적, 기능적 응집도 순서로 응집도가 높아진다.
- 우연적 응집도(Coincidental Cohesion) : 모듈 내부의 각 구성요소들이 연관이 없을 경우
- 논리적 응집도(Logical Cohesion) : 유사한 성격을 갖거나 특정 형태로 분류되는 처리요소들이 한 모듈에서 처리되는 경우
- 시간적 응집도(Temporal Cohesion) : 연관된 기능이라기보다는 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우
- 절차적 응집도(Procedural Cohesion) : 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행할 경우
- 통신적 응집도(Procedural Cohesion) : 동일한 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여 있을 경우
- 순차적 응집도(Sequential Cohesion) : 모듈 내에서 한 활동으로부터 나온 출력값을 다른 활동이 사용할 경우
- 기능적 응집도(Functional Cohesion) : 모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우
4. 응집도의 사례
- 낮은 응집도의 경우 하나의 모듈 내부에 다양한 기능을 구현하여 독립성이 낮아진다.
- 높은 응집도의 경우 단 하나의 기능만을 분리 구현하여 독립성이 보장되어 변경 시 쉬운 유지보수성을 수행할 수 있다.