2019년 5급 공채 기술 2차 소프트웨어공학
문제 4개 · 100점. 참고 답안·채점 기준은 앱에서 볼 수 있습니다.
제1문 (20점)
다음 Java 메소드를 테스트하려고 한다. 물음에 답하시오. (총 20점)
void myMethod(int x, int y, int z) {
if ( ((x % 2) == 0) && ((y % 3) == 0) )
z = x * y;
z = z + x + y;
if (y > 5)
z = z - y;
System.out.println(z);
}
if ( ((x % 2) == 0) && ((y % 3) == 0) )
z = x * y;
z = z + x + y;
if (y > 5)
z = z - y;
System.out.println(z);
}
- (1) 문장 커버리지(statement coverage) 테스트가 무엇인지 기술하고 문장 커버리지를 위한 테스트 데이터를 작성하시오. (8점)
- (2) 위 메소드를 문장 커버리지로 테스트하는 경우의 문제점을 설명하시오. (4점)
- (3) 결정 커버리지(decision coverage) 테스트가 무엇인지 기술하고 결정 커버리지를 위한 테스트 데이터를 작성하시오. (8점)
제2문 (20점)
애자일(agile) 기법과 관련하여 다음 물음에 답하시오. (총 20점)
- (1) 애자일 기법의 등장 배경과 원리를 기술하시오. (5점)
- (2) 익스트림 프로그래밍(XP)의 프로세스를 설명하고 실무 관행(practice)에 대해 5가지 이상 기술하시오. (10점)
- (3) 익스트림 프로그래밍에서 테스팅의 주요 특성에 대해 기술하시오. (5점)
제3문 (30점)
<그림1>과 <그림2>는 Person, Player, Guitar 클래스와 DB 접근을 위한 범용 목적의 DataAccessObject 클래스를 포함하는 수정 전, 후의 클래스 다이어그램의 일부이다. 다음 물음에 답하시오. (총 30점)
| <그림1> 수정 전 클래스 다이어그램 |
Person -name -age -phone +insert() +update() +delete() +eat() +walk() Player -name -age -phone +insert() +update() +delete() +eat() +walk() +playMusic() Guitar +play() |
| <그림2> 수정 후 클래스 다이어그램 |
Guitar +play() Person -name -age -phone +eat() +walk() <<interface>> Instrument +play() Player +playMusic() DataAccessObject +insert() +update() +delete() -dao |
- (1) <그림1>의 Person과 Player 클래스는 범용 목적의 메소드를 포함하여 여러 가지 중복된 속성과 메소드를 가지고 있다. 이러한 중복 때문에 발생할 수 있는 일반적인 문제점들을 설명하고 <그림2>에서 이 문제를 어떻게 해결하였는지 설명하시오. (10점)
- (2) SOLID 설계 원칙 중에서 <그림2>의 DataAccessObject 클래스를 별도로 정의하는데 적용한 설계 원칙의 이름과 내용을 쓰고 이 원칙을 적용한 후의 장점을 기술하시오. 또한, 수정 전과 후의 응집도(cohesion)를 비교하시오. (10점)
- (3) Guitar 외에 Piano나 Violin 등의 다른 악기 클래스들을 추가하는 경우와 같이 변경 또는 확장성 측면에서 수정 전과 후의 설계를 비교하시오. (단, Player, Instrument, Guitar 등의 클래스를 예로 들어 설명한다) (5점)
- (4) SOLID 설계 원칙 중에서 <그림2>의 Player가 구체 클래스(concrete class)인 Guitar를 직접 사용하지 않고 Instrument 인터페이스에 의존하도록 한 것과 가장 관련이 깊은 설계 원칙의 이름과 내용을 쓰시오. 그리고 이 원칙을 적용한 후의 장점을 기술하시오. (5점)
제4문 (30점)
다음 C 프로그램에 대해 물음에 답하시오. (총 30점)
| 모듈 A | 모듈 B |
| void A( ) { int base, n, sel; int result; scanf("%d %d %d", &base, &n, &sel); result = B(base, n, sel); if(sel == 1) printf("sum=%d\n", result); else printf("power=%d\n", result); } | int B(int base, int n, int sel) { int sum = 0; int pow = 1; for(int i = 1; i <= n; i++) if(sel == 1) sum = sum + i; else pow = pow * base; if(sel == 1) return sum; else return pow; } |
- (1) 모듈 B의 응집도(cohesion)는 무엇이고, 이에 대한 근거를 설명하시오. (5점)
- (2) 모듈 A와 B 간에는 어떤 결합도(coupling)가 존재하는지 기술하고, 이에 대한 근거를 설명하시오. (5점)
- (3) 모듈 B를 재구조화하여 기능 응집도(functional cohesion)를 갖도록 코드를 개선하시오. (단, 새로운 모듈 이름은 수행되는 기능에 맞추어 적절하게 수정하면 된다) (10점)
- (4) 3)의 모듈 B를 재구조화하여 생성된 모듈과 모듈 A 사이의 결합도가 개선되도록 모듈 A의 코드를 수정하시오. (10점)