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

12. 모듈 구현 - 1과목 소프트웨어 구축

by 공불러 2024. 3. 20.
728x90
반응형

12. 모듈 구현 - 1과목 소프트웨어 구축

이번 파트에서는 정보처리기사에서 자주 출제되는 결합도와 응집도에 대한 설명이 포함됩니다. 정처기 시험전에 꼭 확인해야할 개념이기 때문에 반드시 읽어 보시길 바랍니다. 팬인,팬아웃도 챙겨가시길 바랍니다.

본 포스팅에서는 결합도를 C언어로 구현해 놓았으니, 높은 난이도로 출제될 것을 대비하여 미리 공부해보시길 바랍니다.

목차

    단위 모듈 구현

    소프트웨어를 기능단위로 분해하여 개별적으로 구현하는 기법, 여기서 단위별로 구분하는 것은 Divide & Conquer(분할과 정복)에 해당하며 이이 야기는 소프트웨어 설계에서 나왔던 것입니다. 즉, 모듈 설계는 소프트웨어 설계와 크게 다르지 않습니다.

     

    효과적인 모듈화

    • 결합도는 낮추고 응집도는 높여야함
    • FAN-OUT 최소화, FAN-IN 최대화 해야함

    단위모듈 설계 원리

    소프트웨어 설계원칙과 동일함으로 알아두면 유용합니다.

    설계 원리 설명
    단계적 분해 큰 문제를 해결 가능한 작은 단위로 분해하여 해결합니다.
    추상화 복잡한 시스템을 간결하고 이해하기 쉬운 모델로 단순화합니다.
    독립성 모듈이 다른 모듈에 독립적으로 동작하여 개별적으로 변경이 가능해야 합니다.
    정보은닉 모듈의 내부 구현을 외부로부터 숨기고, 오직 인터페이스만을 노출하여 모듈 간의 의존성을 최소화합니다.
    분할과 정복 복잡한 문제를 해결 가능한 작은 단위로 나누어 해결하고, 이후에 조합하여 전체적으로 해결합니다.

    결합도 (코드 설명)

    모듈 간의 관련성이나 의존성 정도를 말합니다. 모듈 사이가 너무 좋으면 수정이 용이하지 않으므로 낮아야합니다.

    자료결합도가 가장 낮은 결합도

     

    data : 인터페이스 값이 전달됨. 변수

    // 데이터 결합도 예시
    #include <stdio.h>
    
    // 데이터 결합도: 함수의 매개변수로 값이 전달되는 경우
    int calculate_area(int radius) { // 데이터 결합도에 의해 radius가 전달됨
        return 3.14 * radius * radius;
    }
    
    int main() {
        int r = 5; // 데이터 결합도에 의해 변수 r에 값이 전달됨
        int area = calculate_area(r);
        printf("원의 넓이: %d\n", area);
        return 0;
    }

    stamp : 배열이나 오브젝트, 스트럭처 등이 전달. for 문

    // 스탬프 결합도 예시
    #include <stdio.h>
    
    // 스탬프 결합도: 함수의 매개변수로 배열이나 객체가 전달되고, 반복문이 이를 순회하는 경우
    int calculate_total(int prices[], int length) { // 스탬프 결합도에 의해 배열 prices와 변수 length가 전달됨
        int total = 0;
        for (int i = 0; i < length; i++) { // 스탬프 결합도에 의해 배열 prices를 반복문으로 순회함
            total += prices[i];
        }
        return total;
    }
    
    int main() {
        int prices[] = {10, 20, 30, 40, 50}; // 스탬프 결합도에 의해 배열 prices에 값이 전달됨
        int length = sizeof(prices) / sizeof(prices[0]); // 스탬프 결합도에 의해 변수 length에 값이 전달됨
        int total_price = calculate_total(prices, length);
        printf("총 가격: %d\n", total_price);
        return 0;
    }

    control : 어떻게 처리한다는 제어 요소가 전달 될 때. if 문

    // 제어 결합도 예시
    #include <stdio.h>
    
    // 제어 결합도: 함수의 매개변수로 조건문이나 반복문을 제어하는 변수가 전달되는 경우
    char check_grade(int score) { // 제어 결합도에 의해 변수 score가 전달됨
        if (score >= 90) {
            return 'A';
        } else if (score >= 80) {
            return 'B';
        } else if (score >= 70) {
            return 'C';
        } else {
            return 'F';
        }
    }
    
    int main() {
        int student_score = 85; // 제어 결합도에 의해 변수 student_score에 값이 전달됨
        char grade = check_grade(student_score);
        printf("학점: %c\n", grade);
        return 0;
    }

    external : 외부 변수 사용 

    // 외부 결합도 예시
    #include <stdio.h>
    
    // 외부 결합도: 함수 내에서 외부 스코프의 변수를 참조하는 경우
    int total = 0; // 외부 결합도에 의해 전역 변수 total이 외부 스코프에서 참조됨
    
    void add_to_total(int number) {
        total += number;
    }
    
    int main() {
        add_to_total(5);
        add_to_total(10);
        printf("총합: %d\n", total);
        return 0;
    }

    common : 전역변수 참조하고 갱신하는 방식. C언어 전역변수

    // 공통 결합도 예시
    #include <stdio.h>
    
    // 공통 결합도: 여러 모듈이 공통된 전역 변수를 참조하거나 갱신하는 경우
    int common_variable = 100; // 공통 결합도에 의해 전역 변수 common_variable이 공유됨
    
    void increase_common_variable() {
        common_variable++;
    }
    
    void print_common_variable() {
        printf("공통 변수 값: %d\n", common_variable);
    }
    
    int main() {
        increase_common_variable();
        print_common_variable();
        return 0;
    }

    content : 다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우

    // 내용 결합도 예시
    #include <stdio.h>
    
    // 내용 결합도: 다른 모듈의 내부 구현에 직접 의존하여 해당 모듈의 내부 기능을 호출하거나 변수를 사용하는 경우
    // 모듈 A
    void module_a_function() {
        printf("모듈 A의 기능 수행\n");
    }
    
    // 모듈 B
    void module_b_function() {
        module_a_function(); // 내용 결합도에 의해 모듈 B에서 모듈 A의 내용을 직접 호출함
        printf("모듈 B의 기능 수행\n");
    }
    
    int main() {
        module_b_function();
        return 0;
    }

     

     

    결합도 표

    자스제외 공내 (게스제외공내) -> 높아지는 순서

    결합도 유형 설명 예시
    데이터 (Data)
    가장 낮음
    모듈 간에 인터페이스 값이 전달되는 정도입니다. 함수의 매개변수로 값이 전달되는 경우
    스탬프 (Stamp) 배열이나 객체 등의 데이터 구조가 전달되는 정도입니다. 함수의 매개변수로 배열이나 객체가 전달되고, 반복문이 이를 순회하는 경우
    제어 (Control) 어떻게 처리할지를 결정하는 제어 요소가 전달되는 정도입니다. 함수의 매개변수로 조건문이나 반복문을 제어하는 변수가 전달되는 경우
    외부 (External) 외부 변수가 모듈 내에서 사용되는 정도입니다. 함수 내에서 외부 스코프의 변수를 참조하는 경우
    공통 (Common) 전역 변수가 모듈 간에 공유되는 정도입니다. 여러 모듈이 공통된 전역 변수를 참조하거나 갱신하는 경우
    내용 (Content)
    가장 높음
    다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 정도입니다. 다른 모듈의 내부 구현에 직접 의존하여 해당 모듈의 내부 기능을 호출하거나 변수를 사용하는 경우

    응집도

    우논시절통순기 -> 높아지는 순서

    모듈 내부에서 밀접한 관계를 맺고 있는 정도, 응집도는 높아야합니다.

    응집도 유형 설명
    우연적 (Coincidental) 모듈 내부의 요소들이 아무 상관 없이 우연히 함께 묶여 있는 경우입니다.
    논리적 (Logical) 모듈 내부의 요소들이 유사한 성격을 가지거나 특정 형태로 분류되는 활동에 관련되어 있을 때 발생합니다.
    시간적 (Temporal) 모듈 내부의 요소들이 특정 시간에 처리되어야 하는 활동에 관련되어 있을 때 발생합니다.
    절차적 (Procedural) 모듈이 다수의 관련 기능을 가지고 있을 때, 모듈 내부의 요소들이 그 기능을 순차적으로 사용할 때 발생합니다.
    통신적 (Communicational) 모듈 내부의 요소들이 동일한 입력과 출력을 공유하고 있을 때 발생합니다.
    순차적 (Sequential) 한 활동에서 나온 출력 값을 다른 활동이 사용할 때 발생합니다.
    기능적 (Functional) 모듈 내부의 요소들이 단일한 목적을 위해 수행되는 활동에 관련되어 있을 때 발생합니다.

     

    팬인(Fan-in), 팬아웃( Fan-out)

    팬인(Fan-in)

    팬인은 하나의 모듈이 다른 모듈로부터 받는 의존성의 수를 나타냅니다.

    즉, 얼마나 많은 모듈이 특정 모듈을 호출하는지를 나타냅니다. 높은 팬인 값은 해당 모듈이 다른 모듈에 의해 많이 사용되고 있다는 것을 의미합니다.

    팬아웃(Fan-out)

    팬아웃은 하나의 모듈이 다른 모듈에 의존하는 수를 나타냅니다.

    즉, 특정 모듈이 다른 모듈을 호출하는 수를 나타냅니다. 높은 팬아웃 값은 해당 모듈이 많은 다른 모듈에 의존하고 있다는 것을 의미합니다.

    공통 모듈 구현 순서(자바 개발 순서)

    1. DTO/VO (Data Transfer Object / Value Object) 구현
      • DTO 또는 VO 클래스를 만들어서 데이터 전송을 위한 객체를 정의합니다.
      • 데이터베이스 테이블의 각 열에 해당하는 멤버 변수들을 포함하고, 적절한 getter와 setter 메서드를 구현합니다.
    2. SQL 구현
      • 데이터베이스와 상호 작용하기 위한 SQL 쿼리를 작성합니다.
      • 필요한 테이블 생성, 조회, 삽입, 갱신, 삭제 등의 기능을 포함합니다.
    3. DAO (Data Access Object) 구현
      • DAO 클래스를 작성하여 데이터베이스와의 상호 작용을 담당합니다.
      • SQL 쿼리를 실행하고 DTO/VO 객체와 데이터베이스 간의 매핑을 수행합니다.
      • 데이터베이스 연결 및 해제, 트랜잭션 관리 등의 기능을 구현합니다.
    4. Service 구현
      • 비즈니스 로직을 수행하는 Service 클래스를 작성합니다.
      • DAO를 사용하여 데이터베이스와의 상호 작용을 수행하고, 필요한 비즈니스 로직을 구현합니다.
      • 트랜잭션 관리, 예외 처리 등의 기능을 구현합니다.
    5. Controller 구현
      • 웹 애플리케이션의 요청을 처리하는 Controller 클래스를 작성합니다.
      • 사용자의 요청을 받아서 적절한 Service 메서드를 호출하고, 그 결과를 사용자에게 반환합니다.
      • 요청에 대한 입력 검증, 응답의 포맷팅, 세션 및 인증 관리 등의 기능을 구현합니다.

    Annotation

    주석이란 의미. 

    프로그래밍 언어나 프레임워크에서 코드에 부가적인 정보를 제공하기 위해 사용되는 메타데이터의 일종입니다.

    주석과 유사하게 코드에 정보를 추가하고, 이 정보를 바탕으로 컴파일러나 런타임 시스템이 특정한 동작을 수행하도록 지시할 수 있습니다.

     

    Annotation 종류 Annotation  설명
    @Override 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이딩함을 표시합니다.
    @Deprecated 해당 요소가 더 이상 권장되지 않음을 나타냅니다.
    @SuppressWarnings 컴파일러가 발생시키는 경고 메시지를 억제하도록 지시합니다.
    @FunctionalInterface 함수형 인터페이스임을 나타냅니다.
    @RunWith 테스트 케이스를 실행할 때 사용할 테스트 러너를 지정합니다.
    @Before 테스트 메서드가 실행되기 전에 실행되는 메서드임을 나타냅니다.
    @After 테스트 메서드가 실행된 후에 실행되는 메서드임을 나타냅니다.
    @Test 테스트 메서드임을 나타냅니다.
    @Autowired 의존성 주입을 표시하며, Spring에서 빈을 자동으로 주입할 때 사용됩니다.
    @Controller Spring MVC 컨트롤러 클래스임을 나타냅니다.
    @Service Spring 서비스(비즈니스 로직) 클래스임을 나타냅니다.
    @Repository Spring 데이터 액세스 객체(DAO) 클래스임을 나타냅니다.
    @Entity JPA에서 엔티티 클래스임을 나타냅니다.
    @Column 엔티티 클래스의 필드가 데이터베이스 테이블의 열과 매핑되는지 여부를 지정합니다.
    @Id 엔티티 클래스의 주요 식별자 필드를 지정합니다.

     

    728x90
    반응형

    댓글