본문 바로가기
- 배움이 있는 삶/- 소프트웨어 공학

2022년 기출문제-소공(ing)

by story of interesting 2024. 11. 20.
반응형

2022년 소공 기출문제를 정리 합니다


Agenda

1. Refactoring 기법 
2. Java code error (30번 문제)
3. TC coverage 계산(33번 문제)
4. 아키텍처 스타일 (32번 문제)
5. 아티텍처 평가 - CBAM, ATAM (36번 문제)
6. Spring - 모듈간 상호의존 관계 (39번 문제)
7. Chidamber, Kemerer의 객체지향 척도 - LCOM, WMC, RFC (40번 문제)
8. Design pattern - command. Adapter pattern (43번 문제)
9. Sequence  와. Class. 과 연계 설명 (45번 문제)
10. Sequence 에서 순환복잡도 cbo. 결합도 (50번 문제)

 


1. Refactoring 기법 

- Encapsulate 기법 : 캡슐화 기법

 

- Refactoring : Replace error code with exception

<변경 전>

int withdraw (int amount) {
    if (amount > _balence)
        return -1;
    else {
        _balence -= amount;
        return 0;
    }
}

<변경 후>
void withdraw(int amount) throws B_exception {
    if (amount > _balence) throw new B_exception();
    _blanece -= amount;
}

 

 


2. Java code error (30번 문제)

아래 코드의 실행 결과

import java.util.*;

public class Search {
    public static int search(List<Integer>list, int k) {
        int left = 0, right = list.size() -1, result = -1;
        
        while (left <= right) {
            int mid = left + ((right - left) / 2);
            System.out.println("mid=" + mid+", left=" + left+",right=" + right);
            //2) list로 1,2,3,4받고, k=3을 받으면, right=3이되고, int mid는 1.5인데, int로 1임
            //6) right=3, left=2 으로 변경, mid=2로 변경
            
            if (list.get(mid) > k) {  // 3) (mid=1 > 3) false 임으로 -> 4)번으로 이동
                right = mid - 1;
                System.out.println("찾으려는 k 보다 list(mid) 값이 더 큼, right값 변경, right ="+right);
                
            } else if(list.get(mid) == k) { 
                result = mid;
                right = mid -1;
                System.out.println("k 값을 찾았음, right값 변경, right="+right);
                
            }else {  
                left = mid +1;  // 4) mid=1 임으로, left=2로 변경됨
                System.out.println("찾으려는 k 보다 list(mid) 값이 작음, left를 mid+1로 변경, left ="+ left);
            } // 5) 다시 while으로 진행
        }
        return result;  
    }
    public static void main(String[] args) {
        Integer[] intArr = {1,2,3,4};
        List<Integer>list = Arrays.asList(intArr);
        System.out.println(search(list,3)); // 1) search함수를 호출함, value= list, k는 3을 할당함
    }
    
}

실행결과

1,2,3,4
3

mid=1, left=0,right=3
찾으려는 k 보다 list(mid) 값이 작음, left를 mid+1로 변경, left =2
mid=2, left=2,right=3
k 값을 찾았음, right값 변경, right=1
2

 


3. TC coverage 계산(33번 문제)

white box test coverage 계산하기

위 설명 자료) - 아래 영상 여러번 스터디 필요

https://www.youtube.com/watch?v=K59d8XduE28


4. 아키텍처 스타일 (32번 문제)



5. 아티텍처 평가 - CBAM, ATAM (36번 문제)

- ATAM : 비 기능 요구사항에 대한 품질속성간 Trade off를 고려한 평가, 즉 품질속성간에 상출관계, 상호작용 등을 고려하여 평가

- CBAM : COST를 고려한 평가 방법

https://www.youtube.com/watch?v=-tGKFQwSWJU

 



6. Spring - 모듈간 상호의존 관계 (39번 문제)

- Sprint 설명

https://www.youtube.com/watch?v=q_QEh3fz0zw&t=397s

 

- Sprint 의존성 설명, spring의존성은 기본적인 개념으로, 일반적으로 교재 맨 처음에 다뤄질 정도임

간단한 설명 : https://www.youtube.com/watch?v=64qjrPrTuU4

 



7. Chidamber, Kemerer의 객체지향 척도 - LCOM, WMC, RFC (40번 문제)

 

 


8. Design pattern - command. Adapter pattern (43번 문제)

1) command pattern : 명령들을 object 처럼 사용 ( 예: printf() ), 명령이 객체화 됬다는 것이 중요한 패던임

https://www.youtube.com/watch?v=Y5vh-6fsW7Q

- 위의 영상에서 command pattern 설명소스는

- Main class

import java.util.LinkedList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<command> list = new LinkedList<>();

list.add(new command() {
            @Override
            public void execute() {
                System.out.println("work1");
            }
        });

list.add(new command() {
            @Override
            public void execute() {
                System.out.println("work2");
            }
        });
for (command command : list) {
    command.execute();
}
    }
}

- command interface 정의 : execute 를 object 처럼 사용하기 위한 interface 정의

public interface command {
    void execute();
}

2) Adapter 패턴

- 연관성 없는 두 객체 묶어서 사용하기

기본설계는 기존의 adaptee 알고리즘을 adapter라는 기능을 통해서 사용하는 개념

- Main class

public class Main {

    public static void main(String[] args) {
        Adapter adapter = new AdapterImpl();

        System.out.println(adapter.twiceOf(100f));
        System.out.println(adapter.halfOf(88f));
    }
}

- Math class

public class Math {
    //두배
    public static double twoTime ( double num) { return num*2; }

    //절반
    public static double half (double num) { return num/2;}

    //강화된 알고리즘
    public static Double aDoubled (Double d) { return d*2;}

}

- AdapterImpl class

public class AdapterImpl implements Adapter{

    public Float twiceOf(Float f) {
        return null;
    }
    public Float halfOf(Float f) {

        return (float) Math.twoTime(f.doubleValue());
    }
}

- Adapter class

public interface Adapter {

    // 원하는 기능
    public Float twiceOf(Float f);
    public  Float halfOf(Float f);
}

 

https://www.youtube.com/watch?v=gJDZ7pcvlAU

 

 

 



9. Sequence  와. Class. 과 연계 설명 (45번 문제)

 



10. Sequence Diagram에서 순환복잡도 cbo. 결합도 (50번 문제)

다음 sequence diagram을 바탕으로 Class1의 m1() 연산에 대한 CC(순환복잡도)와 Class의 CBO(Coupling Between Objects)의 값으로 가장 적 절한 것은?(단, CBO를 계산할 때 Class1을 이용하 는 다른 클래스는 포함하지 않음을 가정한다.)

풀이) 위의 문제에서

- CC = 3 +1 = 4, 3(Loop, Break, opt)

- CBO = Class2, Class 3 = 2

 

- 년도별 기출정리가 잘 되어 있는 사이트 : 50번 문제 풀이 포함

https://blog.naver.com/newzio/222852489536

 

감리사 / 소프트웨어공학 / 2022.50 - CC(순환복잡도)와 Class의 CBO(Coupling Between Objects)

50. 다음 sequence diagram을 바탕으로 Class1의 m1() 연산에 대한 CC(순환복잡도)와 Class의 CBO(...

blog.naver.com

 

 

 

반응형