재사용
☞ 기존 SW 또는 SW 지식 재활용하여, 새로운 SW 개발하는 활동
▶ 이해
→ SW나 SW 지식은 재사용 가능한 자산
→ 재사용 대상에는 설계, 요구명세, 검사, 아키텍처 등 포함
→ 라이브러리는 SW 재사용 좋은 사례
→ 프로그래머는 프로그램 일부 재사용하기 위해서 공통 라이브러리 생성
→ SW 재사용하기 쉽게 하는 주요 특성 : 모듈화, 낮은 결합도, 높은 응집도, 캡슐화, 관심사 분리 등
▶ 코드 재사용
→ 가장 일반적인 재사용 가능한 자산 중 하나는 프로그램 코드
→ 특정 시점에 작성된 프로그램 일부 또는 전부를 다른 프로그램 만들 때 재활용하는 활동
→ 장황한 코딩 작업에 소비하는 시간과 에너지 절약하는 전형적인 기법
▶ 재사용 프로그래밍 기법
▷ 객체 지향 프로그래밍
→ 객체 단위로 재사용 이루어지도록 설계하여 구조화된 구현 가능
▷ 제네릭 프로그래밍
→ 데이터 형식에 의존 않고, 하나의 값이 여러 다른 데이터 타입을 가질 수 있는 기술에 중점 두어 재사용성 높일 수 있는 프로그래밍 방식
▷ 자동 프로그래밍
→ 프로그램이 사용자가 설정한 일련 변수에 근거, 규칙에 의거하여 자동으로 프로그램 생성
▷ 메타 프로그래밍
→ 자기 자신 혹은 다른 컴퓨터 프로그램 데이터로 처리함으로써 프로그램 작성 및 수정
▶ 유형
1. 편의적 재사용 (opportunistic reuse)
☞ 프로젝트 시작 시 재사용 가능한 컴포넌트 있는지 찾아보고 재사용
ㄱ. 내부 재사용
→ 팀 내에서 만든 컴포넌트 재사용
→ 계획적 활동 아니기에 인터페이스 조정 등에 추가적인 노력이나 비용 발생 가능
ㄴ. 외부 재사용
→ 외부에서 만든 컴포넌트 활용
→ 유상인 경우, 조달 비용은 자신이 직접 개발 시 드는 비용의 20% 이하로 잡는 것이 좋음
→ 조달한 컴포넌트 학습, 활용하는데 걸리는 시간 고려
2. 계획적 재사용 (planned reuse)
☞ 컴포넌트를 차후에 재사용 가능토록 전략적으로 설계
▶ 사례
1. 소프트웨어 라이브러리
→ 코드 재사용의 매우 일반적인 예로서 라이브러리를 사용하는 것
→ 라이브러리 코드 호출하여 작업 실행 가능
→ 성능 향상이나 출력 형식 바꾸고자 할 때 세부사항 조절 불가
→ 라이브러리 취득하여 학습 및 설정에 시간과 비용 낭비
2. 디자인 패턴
→ 비슷한 문제 풀기 위한 범용적인 설계 해법
→ 개별 상황에 따라서 수정 가능
3. 프레임워크
→ 개발자는 일반적으로 타 응용 프로그램 및 프레임워크 통해 많은 소프트웨어 재사용
→ 개발 언어와 도메인에 따라 다름
모듈화
☞ 프로그램 구성요소 일부로 관련된 데이터와 함수들이 묶여서 모듈 생성
☞ 주로 파일 단위로 구성
▶ 원리
▷ 분할과 지배 (Divide & Conquer)
→ 복잡한 문제 분해, 모듈 단위로 문제 해결
▷ 정보 은닉 (Information hiding)
→ 어렵거나 변경 가능성 있는 모듈을 타 모듈로부터 은닉
▷ 자료 추상화 (Data Abstraction)
→ 각 모듈 자료구조 액세스하고 수정하는 함수 내에 자료구조 표현 내역 감춤
▷ 모듈 독립성 (Module Independence)
→ 독립성 강한 모듈은 낮은 결합도와 높은 응집도 특징 가짐
▶ 측정 척도
▷ 응집도 (Cohesion) //높을수록 좋음
→ 모듈 독립성 나타내는 개념
→ 하나의 모듈 내부 처리 요소 간 기능적 연관도 측정하는 척도
▷ 결합도 (Coupling) //낮을수록 좋음
→ 소프트웨어 구조에서 모듈 간 연관성 측정하는 척도
→ 모듈 간 상호 의존성
▶ 종류
ㄱ. 설계 측면
▷ 모듈
→ 설계 시 관련 있는 기능을 한 부분에 모아 라이브러리 형태로 사용
▷ 컴포넌트
→ 바이너리 형태의 재사용 가능한 실행 프로그램으로 인터페이스에 의해 호출하여 로직 수행할 수 있는 모듈
▷ 서비스
→ 기존 컴포넌트보다는 Loosely-coupled 형태 서비스 제공하는 모듈 단위
ㄴ. 구현 측면
▷ 매크로
→ 프로그램 구현 시 반복되는 부분 특정 이름 부여하고 이름 호출하여 실행 가능토록 하는 프로그래밍 기법
→ 전처리기가 매크로가 사용된 모든 곳에 코드 대체
→ #define MAX_SIZE 100, #define MIN(a,b) (a<b) ? a:b
▷ 함수
→ 프로그램 구현 시 커다란 프로그램 일부 코드
→ 특정한 작업을 함수로 구현하고 상대적으로 다른 코드에 비해 독립적인 모듈
→ void func (arg1, arg2)
▷ 인라인
→ 프로그램 구현 시 반복되는 부분 특정 이름 부여하고 이름 호출하여 실행 가능토록 하는 프로그래밍 기법
→ 컴파일러는 인라인이 사용된 모든 곳에 코드 복사
→ Inline int max(arg1, arg2){...}
▶ 결합도
→ 모듈 내부가 아닌 모듈 간 연관도 (상호의존성)
→ 소프트웨어 구조에서 모듈 간 관련성 측정하는 척도
▷ 특징
→ 서로 다른 상위 모듈에 의해 호출되어 연관성 없는 서로 다른 기능 수행
→ 자료 전달이 인터페이스 통하므로 인터페이스 복잡성에 의존적
→ 낮은 결합도는 복잡성 감소시킴
→ 에러 발생 시 오류 전파되어 다른 오류의 원인이 되는 리플 효과 최소화
▷ 단계
ㄱ. 자료 결합도 (Data Coupling)
→ 모듈 간 인터페이스로 전달되는 파라미터 통해서만 모듈 상호 작용 발생
ㄴ. 스탬프 결합도 (Stamp
→ 모듈 간 인터페이스로 배열이나 오브젝트, 스트럭처 등 전달되는 경우
ㄷ. 제어 결합도 (Control
→ 단순 처리 대상인 값만 전달하는 것 아니라 어떻게 처리해야 한다는 제어 요소 전달되는 경우
ㄹ. 외부 결합도 (External
→ 모듈에서 외부로 선언한 데이터를 다른 모듈에서 참조할 때의 경우로 외부에서 도입된 데이터 포맷, 통신 프로토콜 또는 디바이스 인터페이스 공유 시 주로 발생
ㅁ. 공통 결합도 (Common
→ 파라미터가 아닌 모듈 밖 선언되어 있는 전역변수 참조하고 전역변수 갱신하는 식으로 상호 작용하는 경우
ㅂ. 내용 결합도 (Content
→ 다른 모듈 내부에 있는 변수나 기능을 또 다른 모듈에서 사용하는 경우
▶ 강결합 (Tightly-Coupled)
→ Main은 Sub에 종속됨. Sub에 변경 사항 있다면 Main을 변경해야 함
class Main {
Sub s = new Sub();
public void subCall() {
s.PrintTightCoupling();
}
}
class Sub {
public void PrintTightCoupling() {
System.out.println("강 결합");
}
}
▶ 약결합 (loosely-Coupled)
→ Sub1과 Sub2는 서로 약하게 결합됨. 클래스 변경 시 서로 영향도 적음
public interface Sub {
void PrintLoosely();
}
class Sub1 implements Sub {
public void PrintLoosely() {
System.out.println("Sub1 Loosely");
}
}
class Sub2 implements Sub {
public void PrintLoosely() {
System.out.println("Sub2 Loosely");
}
}
public class Main {
public static void main(String[] args) {
Sub s = new Sub1();
s.PrintLoosely();
}
}
▶ 응집도 (Coheision)
→ 정보 은닉 확장된 개념
→ 하나의 모듈이 하나의 기능 수행하는 집적도의 척도
→ 모듈 독립성 나타내는 개면으로 모듈 내부 구성원 간 연관도 의미
→ 응집도 높을수록 좋음. 모듈 내부에 독립성 보장 위해 하나의 기능만 구현하는 것 의미
→ 낮은 응집도는 하나의 모듈 내부에 다양한 기능 구현하여 독립성 낮아짐
→ 높은 응집도는 하나의 모듈에 하나의 기능만 분리 구현하여 독립성 보장되여 변경 및 유지보수 쉬움
▷ 특징
→ 클래스 목적에 부합하는 같은 기능 함수들로 구성
→ 함수 개수가 상대적으로 적으며 오로지 자신이 할 수 있는 책임 부여받음
→ 하나의 함수에 많은 기능 부여 않고 다른 기능 가진 함수와 상호 협력
▷ 단계
ㄱ. 기능적 응집도 (Functional Cohesion)
→ 모듈 내부 모든 기능이 단일한 목적 위해 수행
ㄴ. 순차적 응집도 (Sequential
→ 모듈 내에서 한 활동으로부터 나온 출력 값을 다른 활동이 사용하는 경우
ㄷ. 통신적 응집도 (Communication
→ 동일한 입출력 사용하여 다른 기능 수행하는 활동들이 모여 있을 경우
ㄹ. 절차적 응집도 *Procedural
→ 모듈이 다수 관련 기능 가지 ㄹ때, 모듈 안 구성 요소들이 그 기능을 순차적으로 수행하는 경우
ㅁ. 시간적 응집도 (Temporal
→ 연관된 기능이라기보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리하는 경우
ㅂ. 논리적 응집도 (Logical
→ 유사한 성격 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우
ㅅ. 우연적 응집도 (Coincidential
→ 모듈 내부 각 구성 요소들이 연관 없는 경우
'정보처리기사 > 필기' 카테고리의 다른 글
[정보처리기사] Part04-01-4. 배치 프로그램 구현 (0) | 2022.02.15 |
---|---|
[정보처리기사] Part04-01-3. 서버 프로그램 구현 (0) | 2022.02.15 |
[정보처리기사] Part04-01-1. 개발환경 구축 (0) | 2022.02.10 |
[정보처리기사 필기 요약] 시스템 소프트웨어 (0) | 2021.03.04 |
[정보처리기사 필기 요약] 프로그램 개발 언어 (객체지향, 선언형) (0) | 2021.03.04 |
댓글