5급 공채 2차

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);
}
  1. (1) 문장 커버리지(statement coverage) 테스트가 무엇인지 기술하고 문장 커버리지를 위한 테스트 데이터를 작성하시오. (8점)
  2. (2) 위 메소드를 문장 커버리지로 테스트하는 경우의 문제점을 설명하시오. (4점)
  3. (3) 결정 커버리지(decision coverage) 테스트가 무엇인지 기술하고 결정 커버리지를 위한 테스트 데이터를 작성하시오. (8점)

제2문 (20점)

애자일(agile) 기법과 관련하여 다음 물음에 답하시오. (총 20점)
  1. (1) 애자일 기법의 등장 배경과 원리를 기술하시오. (5점)
  2. (2) 익스트림 프로그래밍(XP)의 프로세스를 설명하고 실무 관행(practice)에 대해 5가지 이상 기술하시오. (10점)
  3. (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) <그림1>의 Person과 Player 클래스는 범용 목적의 메소드를 포함하여 여러 가지 중복된 속성과 메소드를 가지고 있다. 이러한 중복 때문에 발생할 수 있는 일반적인 문제점들을 설명하고 <그림2>에서 이 문제를 어떻게 해결하였는지 설명하시오. (10점)
  2. (2) SOLID 설계 원칙 중에서 <그림2>의 DataAccessObject 클래스를 별도로 정의하는데 적용한 설계 원칙의 이름과 내용을 쓰고 이 원칙을 적용한 후의 장점을 기술하시오. 또한, 수정 전과 후의 응집도(cohesion)를 비교하시오. (10점)
  3. (3) Guitar 외에 Piano나 Violin 등의 다른 악기 클래스들을 추가하는 경우와 같이 변경 또는 확장성 측면에서 수정 전과 후의 설계를 비교하시오. (단, Player, Instrument, Guitar 등의 클래스를 예로 들어 설명한다) (5점)
  4. (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. (1) 모듈 B의 응집도(cohesion)는 무엇이고, 이에 대한 근거를 설명하시오. (5점)
  2. (2) 모듈 A와 B 간에는 어떤 결합도(coupling)가 존재하는지 기술하고, 이에 대한 근거를 설명하시오. (5점)
  3. (3) 모듈 B를 재구조화하여 기능 응집도(functional cohesion)를 갖도록 코드를 개선하시오. (단, 새로운 모듈 이름은 수행되는 기능에 맞추어 적절하게 수정하면 된다) (10점)
  4. (4) 3)의 모듈 B를 재구조화하여 생성된 모듈과 모듈 A 사이의 결합도가 개선되도록 모듈 A의 코드를 수정하시오. (10점)