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번 문제)
다시 공부할 항목들
-28번 리펙토링 : Inline variable / Encapsulate variable/ Split variable
-34번 리펙토링 : Replace error code with exception / Replace parameter with exception
-32. 아키 스타일 : 블랙보드/파이프 필터/마이크로 커널/리플랙션
-43번: 디자인패턴Command. Adapter 패턴
-29. 복잡도 Switch. Case 의경우 복잡도Case 1개당 단일조건으로 복잡도 1증가
-30번 풀이 다시
-32번 다시공부
1. Refactoring 기법
리펙토링 전체 설명 영상 ( 전체는 아니고, 몇가지 주요사항에 대해서 설명한 영상임) - 잘 설명됨
https://www.youtube.com/watch?v=B9B3TqzOZp4
- Encapsulate 기법 : 캡슐화 기법
(아래는 변수캡슐화 설명이 잘되어있음)
https://developer-tj.tistory.com/24
리팩터링 기법. 변수 캡슐화하기 (Encapsulate Variable)
변수 캡슐화하기(Encapsulate Variable)는 이러한 전역 데이터 문제를 해결하기 위한 방법 중 하나입니다. 전역 데이터를 사용하지 않고 클래스 내부 변수로 변경함으로써 클래스 내에서 데이터를 캡
developer-tj.tistory.com
-아래 블러그는 리펙토링 전체를 설명해 놓은 곳임 : 특히 소스 예제가 동일함
https://cornswrold.tistory.com/550#google_vignette
리팩토링(refactoring) 기법
1. 함수 추출하기 (Extract Function) 코드 조각을 찾아 무슨 일을 하는지 파악한 다음, 독립된 함수로 추출하고 목적에 맞는 이름을 붙인다. When? 언제 독립된 함수로 묶어야 할지에 관한 의견이 분분
cornswrold.tistory.com
- 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
GPT 답변 : 이진검색 알고리즘
- search\(list, 3\)을 호출하면, 리스트에서 3을 찾고 인덱스 2를 반환합니다. 따라서 출력 결과는 2가 됩니다.
- 최초 나의 관점은 반복문 계산문제로 인식 --> 이진 검색, 인덱스 검색 문제임, 3의 index를 찾고, 이의 값을 return 하는 문제 - 3의 index는 2임
이진 검색 알고리즘:
초기화: left는 리스트의 첫 번째 인덱스(0), right는 마지막 인덱스(list.size(\) - 1), result는 -1로 초기화됩니다.
반복문: left가 right보다 작거나 같을 때까지 반복합니다.
중간 인덱스 계산: mid는 left와 right의 중간 인덱스를 계산합니다.
비교:
list.get(mid) > k: 중간 값이 찾는 값보다 크면, right를 mid - 1로 설정하여 왼쪽 부분을 검색합니다.
list.get(mid) == k: 중간 값이 찾는 값과 같으면, result를 mid로 설정하고, right를 mid - 1로 설정하여 같은 값이 더 있는지 확인합니다.
list.get(mid) < k: 중간 값이 찾는 값보다 작으면, left를 mid + 1로 설정하여 오른쪽 부분을 검색합니다.
결과 반환: 반복문이 종료되면 result를 반환합니다. 만약 찾는 값이 없으면 -1을 반환합니다.
메인 메서드:
Integer\[\] intArr = {1, 2, 3, 4};: 정수 배열을 생성합니다.
List<Integer> list = Arrays.asList(intArr);: 배열을 리스트로 변환합니다.
System.out.println\(search(list, 3\));: search 메서드를 호출하여 리스트에서 3을 찾고 결과를 출력합니다.
출력 결과
search\(list, 3\)을 호출하면, 리스트에서 3을 찾고 인덱스 2를 반환합니다. 따라서 출력 결과는 2가 됩니다.
이 코드는 정렬된 리스트에서 특정 값을 효율적으로 찾는 데 사용되는 이진 검색 알고리즘을 구현한 것입니다.
mid=1, left=0,right=3result=-1
mid=2, left=2,right=3result=-1
2
3. TC coverage 계산(33번 문제)
white box test coverage 계산하기
문제는
IF ( (x > 0) && (y <=0))
임으로, Dupoint = 0, a=0, b=0 이 제외됨
만약 - IF ( (x > 0) or (y <=0))
임으로, Dupoint = 1, a=1, b=1 이 제외됨
위 설명 자료) - 아래 영상 여러번 스터디 필요
https://www.youtube.com/watch?v=K59d8XduE28
4. 아키텍처 스타일 (32번 문제)
1. 블랙보드 아키텍처 스타일
블랙보드(Blackboard) 아키텍처 스타일은 해결 전략이 명확하지 않은 문제를 해결하기 위해 설계된 소프트웨어 아키텍처 패턴입니다. 이 패턴은 특히 인공지능(AI), 머신러닝, 자연어 처리와 같은 분야에서 많이 사용되며, 다양한 모듈이 협력하여 복잡한 문제를 해결하는 데 적합합니다. 블랙보드 아키텍처는 세 가지 주요 구성 요소로 이루어져 있으며, 각 요소는 특정 역할을 수행합니다.
블랙보드 아키텍처의 활용 사례
- 음성 인식: 블랙보드 아키텍처는 음성 데이터를 처리하고 텍스트로 변환하는 데 사용됩니다. 각 모듈이 일정 부분의 음성 데이터를 처리하고 결과를 블랙보드에 저장합니다[1][4].
- 차량 식별 및 추적: 복잡한 차량 데이터를 분석하고 추적하는 데 사용됩니다. 각 모듈이 차량의 특징을 분석하고 결과를 블랙보드에 공유합니다[4].
- 단백질 구조 식별: 생물학적 데이터를 분석하여 단백질의 구조를 예측하는 데 활용됩니다. 다양한 모듈이 단백질 데이터를 처리하고 결과를 공유합니다[4].
- 수중 음파 탐지기 신호 해석: 해저에서 수집된 음파 데이터를 분석하여 물체를 식별하는 데 사용됩니다[4].
<전체 아키텍처 스타일의 설명함 >
https://www.youtube.com/watch?v=sfUfOEx9uoU
5. 아티텍처 평가 - CBAM, ATAM (36번 문제)
- ATAM : 비 기능 요구사항에 대한 품질속성간 Trade off를 고려한 평가, 즉 품질속성간에 상출관계, 상호작용 등을 고려하여 평가
- CBAM : COST를 고려한 평가 방법
https://www.youtube.com/watch?v=-tGKFQwSWJU
6. Spring - 모듈간 상호의존 관계 (39번 문제)
- Spring 설명. Java기반 web application개발을 위한 open source framework
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번 문제)
(패턴 강의는 아래 링크가 잘 설명되어 있음- 내가 쉽게 이핼 할 수 있게되어있음)- 소스도 따라하기도 쉽게 설명함
코드없는 프로그래밍
프로그래밍에 중요한 지식들을 코드없이 설명합니다.
www.youtube.com
1) command pattern : 명령들을 object 처럼 사용 ( 예: printf() ), 명령이 객체화 됬다는 것이 중요한 패던임
아래 영상이 설명이 잘 되어 있음. - command를 각각의 클래스로 구현하기 위한 패턴 (예로, 강아지 커멘드, 세탁기 커멘드 등등)
https://www.youtube.com/watch?v=bUULgkwaicQ
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=IHU-wDglGM0
https://www.youtube.com/watch?v=gJDZ7pcvlAU
Tiger class를 수정하지 않고, Animal class처럼 사용하고자 할때, TigerAdapter를 생성하여, 상속받으면 된다. 이것이 adapter pattern 이다.
- 디자인패턴 3가지 유형 :
1) Creational patterns : Object 생성과 연관된 패턴 : 중요 패턴들 - Factory 패턴, Singleton 패턴
2) Structual patterns : Class 간의 구조관계를 나타내는 패턴 : 중요 패턴들 - Proxy 패턴, Composite 패턴, Adapter패턴
3) Behaviroral 패턴 : 주요 패턴들 - State 패턴, Command 패턴, Chain of Responsibility 패턴
코드없는 프로그래밍
프로그래밍에 중요한 지식들을 코드없이 설명합니다.
www.youtube.com
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 = CBO 공식 : Fan-in + Fan-out = 0 + 2 = 정답 2로 분석
- B의 CBO = Fan-in + Fan-out = Fan-iin(2, E, A) + Fan-out(2, C, D) = 4 임
- 년도별 기출정리가 잘 되어 있는 사이트 : 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
'- 배움이 있는 삶 > - 소프트웨어 공학' 카테고리의 다른 글
2023년 기출문제 - 소공 (2) | 2025.02.27 |
---|---|
2024년 기출문제 - 소공 (4) | 2024.12.30 |
2020년 기출문제 - 소공 정리(디자인패턴 다시 공부) (2) | 2024.12.20 |
2021년 기출문제-소공 (11) | 2024.12.06 |
소공-기본과정 정리 (3) | 2024.10.02 |