정보시스템 감리 기출해설/소프트웨어공학 해설

(제 25회) 소프트웨어 공학 / (40)~(41) 해설

아이티신비 2025. 1. 20. 09:00

40. 다음 중 코드 스멜과 이를 해결하기 위한 리팩토링 방법을 가장 적절하게 연결한 것만으로 짝지은 것은?

 

 
코드 스멜
리팩토링
(가) 다른 클래스를 지나치게 애용 (Feature Envey)
(a) 여러 클래스에 흩어진 유사한 기능을 한 곳으로 모은다.
(나) 여러 클래스를 동시에 수정 (Shotgun Surgery)
(b) 메소드를 그들이 애용하는 데이터가 있는 클래스로 옮긴다.
(다) 유사 데이터의 중복 (Data Clumps)
(c) 다형성으로 바꾼다. (같은 메소드를 가진 여러 개의 클래스를 구현한다.)
(라) 너무 많은 Switch, if 문장
(d) 해당 데이터들을 독립된 클래스로 정의 한다.

 

① (가) - (a), (다) - (c)

② (가) - (b), (다) - (d)

③ (나) - (a), (라) - (d)

④ (나) - (b), (라) - (c)

 

■ 해설

Code smell
설명
해결방법(Refactoring)
중복된 코드
(Duplicated Code)
  • 한 클래스내 2개 이상의 메소드에 중복코드
  • 두개 이상의 서브클래스내 중복 코드
  • 같은 일을 하는 메소드 두 개이상의 연관 없는 클래스 내의 중복코드
  • Extract Method/Class
  • Extract Method 한 뒤 Pull Up Field
  • 비슷한 부분 Extract Method
  • Substitute Alogrithm
긴 메소드
(Long Method)
  • 메소드, 함수, 프로시저의 길이가 매우 김
  • Extract Method
  • Replace Temp With Query, Introduce Parameter Object, Preserve Whole Object
  • 조건문이나 루프 자주 보일 때 - Decompose Conditional
거대한 클래스
(Large Class)
  • 지나치게 커진 클래스
  • 많은 코드를 가진 클래스 역시 코드 중복과 혼돈을 양산하는 원인임
  • 수 많은 변수들 - Extract Class, Extract Subclass
  • 꼭 항상 사용되지는 않는 인스턴스 변수들 - Extract Class, Extract Subclass
  • UI 클래스내 데이터부 중복 시 - Duplicate Observed Data AWT → Swing Component 바꿀 때 - Duplicate Observer Date
긴 파라미터 리스트
(Long Parameter List)
  • 긴 파라미터 리스트는 이해 어렵고 계속 수정함.
  • Replace Parameter With Method
  • Preserve Whole Object
  • Introduce Parameter Object
확산적 변경
(Divergent Change)
  • 하나의 클래스가 다른 이유로 인해 다른 방법으로 자주 변경되는 경우에 발생
  • 여러 종류의 변경 때문에 하나의 클래스가 시달리는 경우
  • 바뀌어야 하는 경우들을 명확하게 한 뒤 하나의 클래스에 모은다 - Extract Class
산탄총 수술
(Shotgun Surgery)
  • 변경을 할 때마다 많은 클래스를 조금씩 수정됨
  • 확산적 변경과 유사하지만 정반대(하나의 수정으로 여러 클래스가 수정되는 경우)
  • 바뀌는 부분들에 대해 Move Method, Move Field 하여 하나의 클래스에 넣는다.
  • 모든 동작을 하나로 모은다 - Inline Class
기능에 대한 욕심
(Feature Envy)
  • 메소드가 자신이 속한 클래스보다 다른 클래스에 관심을 가지는 경우
  • Move Method, Extract Method
데이터 덩어리
(Data Clumps)
  • 3개 이상의 데이터 항목이 여러 곳에 중복되어 나타난다
  • 덩어리들을 객체로 바꾼다 -Extract Class
  • 파라미터 리스트를 단순하게 수정 - Introduce Parameter Object, Preserve Whole Object
기본타입에 대한 강박관념
(Primitive Obsession)
  • 객체 형태 그룹을 만들지 않고, 기본 데이터 타입만 사용한다
  • 데이터 값이 코드이고, 값이 동작에 영향을 미치치 않는다면 - Replace Type Code With Class
  • 타입코드에 의존하는 조건문이 있는 경우 - Replace Type Code With Subclasses
  • 항상 몰려다녀야 할 필드 그룹이 있다면 - Extract Class
  • 배열을 쪼개서 쓰고 있는 자신을 발견하면 - Replace Array With Object
Switch, if 문장
  • switch 문장이 지나치게 많은 case 를 포함한다
  • 대부분 polymorphism 으로 해결 가능
  • Replace Type Code with Subclasses 를 사용할 것인지 Replace Type Code with State/Strategy 를 사용 결정한다.
  • polymorphism 이용 시 너무 작아 오히려 cost 가 더 드는 경우
  • Replace Patameter With Explicit methods
게으른 클래스(Lazy Class)
  • 사용하지 않거나 비용대비 효율이 떨어지는 클래스
  • 많이 사용않는 subclass 들 - Collapse Hierarchy(계층병합)
  • 거의 쓸모없는 클래스들 - Inline Class
추측성 일반화
(Speculative Generality)
  • 일어날 가능성이 거의 없는 일까지 다 대비한 필요없는 코드
  • 추상클래스들이 별로 하는 일이 없을 때- Collapse Hierarchy
  • 불필요한 Delegation - Inline Class
  • 사용하지 않는 parameter 가진 메소드 - Remove Parameter
  • 두리뭉실한 메소드 이름 - Rename Method

 

정답 : ②

 

 

41. 다음 Python 프로그램의 출력 결과로 가장 적절한 것은?

 
language = ['python', 'java', 'go', 'ruby', 'c']
pop = language.pop()
pop2 = language.pop(1)
language.insert(1, pop)
language.insert(2, pop2)
print(language.index('go'))

 

① 3 ② 2

③ 1 ④ 0

 

■프로그램 요약 : 이 Python 코드는 리스트 연산 메서드를 사용하여 리스트 요소를 추가, 삭제, 삽입하고 있음. 리스트 인덱스를 활용하여 특정 요소의 위치를 확인하는 것도 포함되어 있음

 

● 프로그램 수행 과정 단계별 설명

  1. 리스트 선언

language = ['python', 'java', 'go', 'ruby', 'c'] ← 5개의 문자열 요소로 구성된 리스트 language가 선언

 

2. 리스트 요소 삭제

pop = language.pop() ← language 리스트의 마지막 요소 'c' 가 pop 변수에 저장되고, 리스트에서 삭제함

pop2 = language.pop(1) ← language 리스트의 두 번째 요소 'java' 가 pop2 변수에 저장되고, 리스트에서 삭제함

 

3. 리스트 요소 삽입

language.insert(1, pop) ← language 리스트의 두 번째 위치(인덱스 1) 에 앞서 삭제된 'c' 가 삽입됨

language.insert(2, pop2) ← language 리스트의 세 번째 위치(인덱스 2)에 앞서 삭제된 'java' 가 삽입됨

 

4. 리스트 요소 위치 확인

print(language.index('go')) ← language 리스트에서 'go' 의 인덱스 위치(3)가 출력

 

정답 : ①

 

 




 

공감과 댓글은 아이티신비에게 큰 힘이 됩니다.

블로그 글이 유용하다면 블로그를 구독해주세요.♥