반응형

9. 코딩

1. 객체지향 코딩 단계의 로드맵을 순서대로 잘 나열한 것은?
코드 표준 작성 메서드 구현 클래스 인스펙션 단위 테스트 통합

 

2. 다음은 흔히 일어나는 오류를 설명한 것이다. 바른 설명이 아닌 것은?
하나 차이(Off-by-one) 오류: 배열의 크기가 하나 차이 나는 오류 (이는 배열 인덱스 오류를 뜻함)

 

3. 프로그램을 더 빨리 수행하도록 하기 위하여 고려하여야 할 사항을 아닌 것은?
코드의 질, 코드 표준, 사용자의 요구보다 수행 속도를 최우선적으로 고려하여야 한다.

 

4.  다음은 코딩 스타일에 대한 설명이다. 좋은 코딩 스타일이라 할 수 없는 것은?
바른 프로그램보다 먼저 ᄈᆞ른 프로그램을 작성하라.

 

5. 다음에 제시한 프로그램 중에서 가장 코딩 스타일이 좋은 것은?
// Set counter to read next case
i3 = i3 + 1;

 

6. 다음 클래스 정의에 따라 ~문장을 수행할 때, 오류가 발생하지 않는 것만을 모두 고른 것은?
② ㉡,

 

7. 주석에 대한 바른 코딩 스타일이 아닌 것은?
잘못된 코드에는 주석을 달지 말고 다시 작성

 

8. 다음 중 헤더 주석에 꼭 포함하여야 할 사항이 아닌 것은?
어떤 모듈이 호출되는가?

 

9. 다음 Java 코드의 MyEmployeeService, EmployeeService, EmployeeDao, Employee 클래스를 UML 클래스 다이어그램으로 표현하였을 때 클래스 다이어그램에 나타나지 않는 관계는? (, MyEmployeeService, EmployeeService, EmployeeDao, Employee 클래스는 이 외 다른 클래스와 아무 관계가 없다)

실체화(realization)

 

10. 다음과 같은 Java 코드를 클래스 다이어그램으로 표현하고자 한다. 생성된 클래스 다이어그램에 표현되는 객체 사이의 관계와 가장 거리가 먼 것은?

집합 (composition) 관계

 

11. UML의 각 설계 요소에 대한 구현 방법 중 잘못된 것은?
시퀀스 다이어그램에서 A 객체에서 B 객체로 나가는 화살표의 메시지는 A 객체에서 구현한다. (해설: A 객체가 B 객체의 메서드를 호출하는 것이므로 B 객체에서 구현해야 한다.

 

12. 코드 품질 향상 기법에 설명 중 옳지 않은 것은?
코드 인스펙션은 다른 개발자가 개발한 프로그램을 실행하여 오류를 찾는 작업이다. (해설: 실행하지 않고 코드를 검토하며 오류를 찾는다.)

 

13. 자동화 테스팅 도구의 정적분석 도구에 대한 설명으로 옳은 것은?
프로그램에서 오류 가능성이 있는 부분을 지적하는 코드분석 도구

 

14. 리팩토링에 대한 설명으로 옳지 않은 것은?
리팩토링은 실행 중인 프로그램의 기능 변경이 수반되어야 한다.

 

15. 다음은 리팩토링 전후의 코드 변화이다. 적용된 리팩토링 기법에 해당하는 것은?
메서드 내용 직접 삽입(Inline Method)

 

16. 테스트 주도 개발(Test-driven development)은 애자일 기법에서 개발되는 증분과 해당 증분을 위한 테스트 코드를 함께 작성해 나가는 방법이다. 이에 대한 설명으로 옳지 않은 것은?
멀티 스레드를 사용하는 어플리케이션의 테스트를 위해 개발 되었다.

 

17. 코드 리뷰(Code Review)의 기능을 직접적으로 수행할 수 있는 XP(eXtream Programming)의 실무관행(Practice)?
짝 프로그래밍(pair programming)

 

18. 소스 코드에 나타나는 bad smell과 이를 해결하기 위한 마틴 파울러(M. Fowler)의 리팩토링 기법으로 적절하지 않은 것은?
긴 메서드 파라미터 객체를 소개 (해설: 파라미터 객체를 소개하는 것이 아니라 적정 수준의 크기로 나눠야 한다.)

 

19. 다음의 그림 ()()는 변경요청과 이에 따른 수정이 필요한 모듈간의 관계를 보여 준다. ()의 경우 변경요청1에 의해서 시스템을 구성하는 많은 수의 모듈이 변경되고 있으며 ()의 경우에는 여러 개의 변경요청이 하나의 모듈에 집중되고 있다. 이러한 형태의 bad smell을 부르는 용어로 가장 적절한 것은?
() shotgun surgery, () divergent change
- 여러 클래스 동시에 수정: shotgun surgery
- 산발적 수정: 두가지 이상의 이유로 수정되는 클래스, SRP 위배
- 지나치게 많은 케이스 포함: switch statements, 클래스가 가진 메서드 대부분이 다른 클래스에게 책임을 넘김: middle man

 

20. 다음 중 테스트 주도 개발에 사용되는 JUnit에 관한 바른 설명이 아닌 것은?
테스트 코드는 클래스 코딩이 완성된 후 명세를 기초로 작성한다.

 

21. 코딩 단계의 작업이 끝나면 통합 테스트를 위하여 모듈이 릴리스 된다. 이때까지의 작업의 로드맵을 그림으로 작성하고 설명하라.
계획(프로젝트 계획서) 요구분석(요구분석 명세서: SRS) 기본 설계(소프트웨어 아키텍처) 상세 설계(상세 설계서) 코딩(원시코드) 단위 테스트(테스트 케이스 및 결과) 통합 테스트(테스트 케이스 및 결과)
가장 먼저 계획 단계에서 프로젝트의 목표, 범위, 일정, 예산, 리스크, 프로세스 관리 방법, 품질 관리 방법 등을 계획하고 진행하기로 결정이 나면 요구분석을 진행한다. 요구분석 단계에서는 사용자의 기능적 요구사항 및 비기능적 요구사항을 유스케이스 다이어그램으로 나타내고 요구분석 명세서를 도출한다. 다음으로 이전 단계의 산출물을 기반으로 적합한 아키텍처 스타일을 결정하고 기능별로 어떻게 구현할 것인지 클래스 다이어그램과 시퀀스 다이어그램과 같은 UML을 이용하여 상세 설계를 진행한다. 다음으로 상세 설계서를 기반으로 코딩을 하면서 각각의 모듈을 코딩할 때마다 단위 테스트를 진행한다. 이후, 여러 모듈을 통합하여 테스트를 진행한다. 이때는 빅뱅식 테스트, 연쇄식 테스트, 하향식(스텁) 테스트, 상향식(드라이브) 테스트와 같은 방법을 선택하여 진행할 수 있다.

 

22. 헝가리안 표현법이란 무엇이며 그 사례를 들어 설명하라.
헝가리안 표현법이란 변수의 타입을 변수 이름 앞에 붙여서 표현하는 방법이다. 예를 들어, 회원 가입 클래스에서 String 타입의 name 변수를 선언하는 경우 strName과 같이 명명하는 것이 예시에 해당한다.

 

23. 다음 Java 프로그램에 사용될 식별자의 이름을 보고 명명 스타일을 평가하라.
(1) 패키지 이름
- com.sun.eng: 적절하다.
- com.Apple.Quicktime.v2: 패키지 이름은 모두 소문자로 이루어져 있어야하는데 대문자가 포함되어 있으므로 옳지 않다.
- edu.cmu.cs.bovik.cheese. 적절하다.
(2) 클래스 이름
- class Raster; - 적절하다.
- class imageSprite; - 클래스 이름은 대문자로 시작해야 하는데 소문자로 시작하기 때문에 부적절하다.
(3) 인터페이스 이름
- interface rasterDelegate; - 인터페이스 이름도 클래스 이름과 같이 대문자로 시작해야 하는데 소문자로 시작하기 때문에 부적절하다.
- interface Stroing; - 적절하다.
(4) 메서드 이름
- run(); - 적절하다.
- runFast(); - 적절하다.
- GetBackground(); - 메서드 이름은 소문자로 시작해야 하기 때문에 부적절하다.
(5) 변수 이름
- int i; - 변수가 무엇을 나타내는지 알기 어려워 부적절하다.
- char c; - 변수가 무엇을 나타내는지 알기 어려워 부적절하다.
- float myWidth; - 적절하다.
+ 추가 학습 내용
매개 변수와 지역 변수에는 더 짧은 이름 사용, 필드와 정적 변수에는 더 긴 이름을 사용
(6) 상수 이름
-static final int MIN_WIDTH = 4; - 적절하다
-static final int MAX_width = 999; - 상수는 모두 대문자로 표현해야 하기 때문에 부적절하다.
-static final int GetTheCpu = 1; - 상수는 모두 대문자로 표현해야 하기 때문에 부적절하다.

 

24. 원시코드를 이해하기 위하여 주석은 매우 중요한 역할을 한다. 원시코드에서 발견할 수 있는 주석의 종류를 3가지 이상 들고 각 용도와 사용 방법을 설명하라.
1) 설명 주석: 코드의 이해를 돕기 위한 주석, 복잡한 알고리즘이나 특수한 코드가 있는 부분에 설명 주석을 추가한다.
2) TODO 주석: 할 일 목록을 작성할 때 쓰는 주석, 코드에서 개선이 필요하거나 추가 작업이 남아있는 부분에 TODO 주석을 추가한다.
3) 변경 이력 주석: 코드 변경 이력이나 버전 정보를 기록한 주석, 코드 상단에 삽입되어 코드 변경 내용, 버전, 작성일 등을 기록한다.

 

25. 빈칸과 빈 줄을 적당히 넣는 것이 원시 코드의 이해를 돕는다. 빈칸을 넣어야 할 경우와 빈 줄을 넣어야 하는 경우 각각 3가지 이상을 들고 예를 들어 설명하라.
먼저, 빈칸을 넣어야 하는 경우는 다음과 같다.
첫째, 산술 연산자나 논리 연산자를 사용할 때 연산자와 피연산자 사이에는 빈칸을 넣는다. 예를 들어 int sum = a + b; 와 같다.
둘째, if문과 같은 제어문 다음 괄호 사이에는 빈칸을 넣는다.
예를 들면, if (myWeight == 60) { ... }과 같다.
셋째, 제어문에 포함되는 문장은 일반적으로 들여쓰기를 하여 블록 문장으로 나타내야 한다. 예를 들면, 다음과 같다.
if (myWeight >= 100) {
printf(“너무 과도한 체중입니다.”);
}
다음으로 빈 줄을 넣어야 하는 경우는 다음과 같다.
첫째, 코드 블록과 코드 블록 간에는 빈 줄을 넣어야 한다.
둘째, 한 클래스 내에 변수들과 메서드 간에는 빈 줄을 넣어야 한다.
셋째, 예외 처리 코드 블록과 일반 코드 블록 간에 빈 줄을 넣어야 한다.

 

26. 리팩토링의 목적이 무엇이며 그 과정을 설명하라.
리팩토링의 목적은 코드를 정돈하고 중복되는 코드를 제거하여 가독성, 유지보수성, 성능 향상 등 소프트웨어 생산성을 높이고 결함을 줄이는 것이다.
리팩토링 과정은 먼저 코드 스멜을 활용하여 리팩토링 대상을 찾고 단일 리팩토링을 진행한다. 한 부분의 코드의 리팩터링이 끝나면 코드가 잘 작동되는지 테스트를 수행하고 작동이 잘되면 다음 리팩토링을 진행하고 만약 작동하지 않으면, 리팩토링한 코드를 되돌리기하고 다시 리팩토링을 진행한다.

 

27. 미들맨이란 코드 스멜은 무엇이며 어떻게 리팩토링하여야 하나?
미들맨이란 클래스 내 메서드 다수가 다른 클래스에게 책임을 넘기는 것을 뜻한다. 이러한 경우 미들맨 객체를 제거하는 방식으로 리팩토링하여야 한다.

 

28. 다음 프로그램을 정적으로 분석하여 보고 어떤 부분에 어떤 오류가 있는지 찾아라.
첫째, malloc() 함수로 메모리를 할당받은 후, free() 함수를 쓰지 않아 메모리 누수가 발생한다.
둘째, size0인 경우 처리가 없다. 따라서 size0이 입력된다면 오류가 발생한다.
셋째, size1인 경우 NULL을 반환하는데 이는 함수의 반환 타입인 char과 일치하지 않아 오류가 발생한다.

 

29. 테스트 중심 개발이란 무엇이며 그 과정을 설명하라.
테스트 중심 개발이란 코드를 작성하기 전에 테스트 케이스를 먼저 작성하고, 그 후에 해당 테스트를 통과할 수 있도록 코드를 작성하는 접근 방법이다. 그 과정은 테스트를 위한 코드를 먼저 작성하고 테스트가 통과되도록 코드를 작성하고 리팩토링을 하는 과정을 반복하며 소프트웨어를 개발한다.

 

30. 짝 프로그래밍이란 무엇이며 어떤 장점과 단점이 있는가?
짝 프로그래밍은 두 사람이 같은 PC를 사용하며 한 명은 개발, 한 명은 테스팅을 진행하는 방식이다. 장점은 협업이 강화되고 소프트웨어의 품질이 향상될 수 있지만 단점은 생산성이 저하되고 파트너와의 문제가 발생할 수도 있다.

 

추가 문제. 다음 문장을 수식에 관한 규칙에 맞게 고치시오.
a ++
증감 연산자와 같은 단항 연산자는 a++;와 같이 피연산자와 단항 연산자를 붙여 써야 한다.
a++;
a=b+c+d;
피연산자와 연산자 사이에는 빈칸을 넣어 구분하는게 좋다.
a = b + c + d;
a > b ?x: -x;
조건문은 괄호로 묶어주는 것이 좋다.
(a > b) ? x: -x;
sum = kor + (++eng);
증감 연산을 먼저 수행하고 koreng를 더하는 것으로 수정해야 한다.
++eng;
sum = kor + eng;
if(a==0&&b==0)
if 다음에는 빈칸을 넣고 괄호를 열어야 하고 각 조건들도 괄호로 묶어준다. 또한 피연산자와 연산자 사이에 빈칸으로 구분할 수 있도록 작성해야 한다.
if ((a == 0) && (b == 0))
sizeof(a=b+c)
sizeof() 함수에는 인자에 수식을 사용하지 않아야 한다.
sizeof(a)