본문 바로가기
정보처리기사/필기

[정보처리기사] Part04-01-2. 공통 모듈 구현

by 채연2 2022. 2. 10.

재사용

    ☞ 기존 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

                 모듈 내부 각 구성 요소들이 연관 없는 경우

 

320x100

댓글