이전 포스팅에서 정보처리기사 실기 3회 11~15번 이후 16번부터 20번까지 풀어보는 시간을 가지도록 하겠습니다.
16. 설명에 맞는 알맞은 보기 고르기
( ) 패턴은 객체지향 디자인 패턴 중, 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴으로 자식 클래스가 어떤 객체를 생성할지 결정하도록 하는 패턴임. 또한 부모 클래스 코드에 구체 클래스 이름을 숨기기 위한 방법으로도 사용됨
16번 문제는 디자인 패턴의 설명을 보고 알맞은 답을 쓰는 문제입니다. 실제 기출 문제에서는 영문 보기가 주어진다고 하는데, 구체적인 특정을 모르면 틀릴 수 밖에 없는 문제죠. 앞에서도 말씀드렸던 것처럼 디자인 패턴에는 생성, 구조, 행위 패턴이 있다고 설명드렸습니다. 이미 1번 자바 코드 문제에서 싱글톤(Singleton)을 설명하면서 대강 어떤 것들이 있는지 언급했었는데요. 문제 풀이에 앞어서 우선 부모 클래스와 자식 클래스, 추상 클래스, 구체 클래스에 대해서 간단히 짚고 가보겠습니다.
자바나 C++과 같은 객체지향 언어에서 상속을 배우다 보면 부모 클래스와 자식 클래스의 개념이 나오죠. 부모 클래스는 말 그대로 부모가 되는 상위 클래스 입니다. 부모 클래스를 상속 받아서 하위 클래스인 자식 클래스가 만들어지는데요. 이 때는 부모 클래스(Super class)가 가진 함수, 변수 등이 그대로 상속이 되서 자식 클래스(Sub Class)에서 사용할 수 있죠. 물론 public이나 private, protect와 같은 접근 제어 지시자에 의해 사용할 수 있는 범위가 제한되긴 하지만 여기서는 넘어가도록 하겠습니다.
그럼 추상 클래스(Abstract class)와 구상 클래스(Concrete class)는 무엇일까요? 추상 클래스는 쉽게 말해서 자바에서 new를 통해 인스턴스를 만들 수 없는.. 클래스 내에 있는 함수에 구현 부분이 존재하지 않는다고 알고 계시면 됩니다. 추상 클래스로 부터 상속을 받아 구상 클래스를 만들게 되는데, 추상 클래스에 있던 함수 구현 부분을 구체 클래스에서 정의해줍니다.
구상 클래스는 사실 해외 원서에서 'Concrete class'가 번역되면서 구체 클래스, 구상 클래스, 실체 클래스 등 다양한 이름으로 불리는데, 쉽게 말해서 추상 클래스를 상속 받아서 만든 클래스라고 생각하시면 됩니다. 자.. 다시, 추상 클래스에는 구현 부분이 없는 함수가 존재하고(보통 추상 메소드 또는 개념적으로 인터페이스라고도 부름) 추상 클래스를 상속 받아, 구상 클래스에서 해당 함수를 구현해준다고 아시면 무리가 없을 듯 합니다.
여기까지 간단하게 부모, 자식, 추상, 구체 클래스의 개념에 대해서 말씀드렸고, 다시 문제로 돌아와서 설명된 것 중 핵심만 뽑아보면, "자식 클래스에서 어떤 객체를 생성할지 결정하는 패턴"만 보신다면 답은 팩토리 메서드(Factory Method) 패턴 입니다. 팩토리 메서드 패턴은 객체를 생성하기 위한 인터페이스를 추상 클래스로 만들어 놓고.. 즉, 구현이 없는 추상 메소드만 있는 추상 클래스를 상속 받아서 하위 클래스에서 어떤 객체를 생성할지 정해주는 특징을 가지고 있죠. 팩토리 메서드 패턴은 인스턴스를 만드는 일을 서브 클래스에게 맡긴다라고 알고 계시면 될 것 같습니다.
사실 위와 같이 말로만 설명해서는 어떤 패턴인지 잘 와닿지 않을 거라고 생각합니다. 실제 현업에서 일했던 저도 이런식으로 외우고 패턴들을 사용하진 않기 때문인데요. 많고 많은 디자인 패턴들 중에서 사용하는 패턴들이 한정적이기도 하고, 나중에 구현하고 보니 '아 이런게 이 패턴이었구나'하는 것들도 꽤 있습니다. 하지만 디자인 패턴은 실기에서는 높은 확률로 나오기 때문에, 시험을 위해서는 각 패턴의 대표적인 키워드를 꼭 외우셔서 위와 같은 문제가 나오면 반드시 맞추시길 바랍니다.
17. 다음 C언어 코드에 대한 알맞은 출력값 쓰기
#include <stdio.h>
struct jsu {
char nae[12];
int os, db, hab, hhab;
};
int main(){
struct jsu st[3] = {{"데이터1", 95, 88},
{"데이터2", 84, 91},
{"데이터3", 86, 75}};
struct jsu* p;
p = &st[0];
(p + 1)->hab = (p + 1)->os + (p + 2)->db;
(p + 1)->hhab = (p + 1)->hab + p->os + p->db;
printf("%d\n", (p+1)->hab + (p+1)->hhab);
}
17번 문제는 C 언어의 구조체와 포인터가 혼합된 문제입니다. 개인적으로 시간이 없을 때 패스하는 문제이기도 합니다. 아마 학부에서 C 언어를 배울 때 거의 기말고사 쯤 되서 나가는 진도인데, 그마저도 시간이 부족하면 개념만 대충 이야기하고 건너뛰는 부분이기 때문에 모르시는 분들도 많으실거라고 생각합니다. 구조체에 설명하기 전에 앞서서 배운 내용들을 다시 한번 짚고 넘어가겠습니다.
앞에서 저희는 int, double, char와 같은 자료형을 배웠습니다. 'int a, b, c;'와 같이 변수를 하나씩 선언해가면서 변수 안에 데이터를 저장했죠. 그러다가 int형 변수 10개를 선언해야하는데 'int a,b,c,d...,j;' 이렇게 선언하기 귀찮으니 배열을 만들어서 'int a[10];'으로 선언하고 이 안에 인덱스를 이용해서 각 요소에 데이터를 저장했습니다. 그리고 만약 이름과 각 과목별 점수를 저장하고 싶다면, char와 int를 같이 저장할 수 있어야할 겁니다. 이때 사용하는게 구조체(Structure)로 기본 자료형을 가지고 새롭게 정의할 수 있는 사용자 정의 타입입니다.
구조체의 개념을 이해하셨다면 구조체를 정의해서 값을 넣어볼 줄도 알아야겠죠. 구조체를 정의하는 것 자체는 간단합니다. strcut 키워드와 사용할 구조체의 이름을 써주고 함수를 정의하듯이 중괄호로 묶어서 'struct st{ char ch; int num;};'처럼 나타내면 됩니다. 이와 같이 정의하면 main 함수에서 'struct st a={'a', 10};'과 같이 쓸 수 있는데, struct st라는 사용자가 정의한 구조체 변수 a를 선언해서, a 안의 ch 변수에 a를, num에는 10을 넣는 것과 같습니다.
구조체를 정의하고 선언하는 것까지 이해가 되셨다면, 구조체 내부의 변수에 접근하는 방법도 아셔야겠죠. 구조체 내부 변수에 접근하는 방법은 '.' 콤마를 이용하게 됩니다. 앞에서 구조체 변수 a에 있는 내부 int형 변수 num에 20을 저장하기 위해서는 'a.num = 20'과 같이 쓸 수 있습니다. 여기까지는 기본적인 내용이고, 우리는 앞에서 배열과 포인터에 대해서 배웠습니다. 배열과 포인터를 응용하실 줄 안다면 사실 이 문제는 쉽게 풀 수 있는데요. 먼저 구조체를 여러 개 만들고 싶다면, 배열을 이용해서 int형 변수 여러 개를 선언했던 것과 같이 'struct st a[10]'과 같이 나타낼 수 있겠죠.
위 문제의 코드에서는 struct jsu라는 사용자 정의 타입으로 구조체 변수 st를 3개 저장할 수 있는 배열을 만들었네요. 그리고 바로 '"데이터1", 95, 88'과 같이 구조체 내부 변수에 초기화를 해주고 있습니다. 즉 struct st 내부 변수 문자열을 저장할 수 있는 char형 배열 nae에는 '데이터1'이 저장되고, int형 os에는 95, db에는 88이 들어가죠. 그럼 나머지 int형 두 변수 hab과 hhab에는 아무것도 안들어가있겠죠(보통 저러면 0이나 쓰레기값으로 채워집니다). 그럼 구조체 배열에 데이터가 대강 어떤식으로 저장되어 있는지 아셨을 겁니다.
다음 줄로 넘어가면, 'strcut jsu* p;'가 보이는데, 구조체도 포인터로 선언이 가능하다는 것을 보여주고 있죠. struct jsu 구조체의 메모리 주소를 구조체 포인터 변수 p에 저장할 수 있는 겁니다. 포인터는 데이터의 메모리 주소를 저장할 수 있다고 말씀드는데요. 바로 다음 줄 'p = &st[0];'에서 구조체 배열 st의 첫 번째 요소의 주소값을 저장하고 있는 것을 볼 수 있죠. '&'는 데이터의 메모리 주소를 반환해주고, 배열로 선언된 변수 뒤에 대괄호로 인덱스를 붙여서 각 요소에 접근이 가능하다고 했습니다. 인덱스의 시작이 1이 아닌 0이기 때문에 0이 첫 번째 요소라는 것도 기억하시고 계실 거라 생각합니다.
자.. 그럼 구조체 포인터 변수 p에는 구조체 배열 st의 첫 번째 요소가 저장되어 있고, 이 상태에서 구조체 내부 변수에 접근하는 방법을 보겠습니다. 위에서 포인터가 아닌 단순 구조체의 내부 변수에 접근하는 방법은 '.'을 이용한다고 말씀드렸는데요. 또한 포인터를 설명하면서 포인터 변수에 메모리 주소가 저장되어 있고, '*' 참조 연산자를 이용해서 메모리 주소에 접근하여 값을 변경할 수 있다고 했습니다. 그럼 st[0] 구조체 내부 변수인 os에 접근하고 싶다면 어떻게 해야할지 보이실 겁니다. 구조체 포인터 p는 현재 구조체 st[0]의 메모리 주소를 가지고 있으니 '*p'는 'st[0]'와 같을 것이고, '(*p).os'는 'st[0].os'와 동일하겠죠. 연산자 우선순위 때문에 괄호를 씌우긴 했지만 대강 '(*구조체포인터).멤버'라고 생각하시면 될 것 같습니다.
그런데 위의 문제에서는 '->' 화살표 연산자라고 부르는 녀석을 사용하고 있습니다. 저 화살표 연산자를 어렵게 생각하실 필요없이 참조 연산자'*'와 접근 연산자 '.'를 묶어서 표현한다고 생각하시면 됩니다. 앞선 '(*p).os'를 간단히 'p->os'로 축약해서 쓸 수 있다는 거죠. 자.. 거의 다 왔습니다. 코드에서 '(p + 1)->hab = (p + 1)->os + (p + 2)->db'로 나온 부분 중, p+1과 p+2가 나타내는 것은 설명하지 않아도 직관적으로 아실 수 있으리라 생각합니다. p가 st의 첫 번째 요소 메모리 주소였으니, p+1는 두 번째 요소고 p+2는 세 번째 요소가 되겠죠. 자세한 풀이는 생략하도록 하고 앞서 설명드린 것을 모두 이해하셨다면 답은 501이 됩니다.
17번 문제를 정말 길게 설명드렸는데 처음 보신다면 한 번에 이해가 가지 않으실테니 여러 번 읽고, 제일 좋은 것은 직접 코딩을 해보면서 구조체 정의와 선언, 포인터 주소 접근, 값 변경 등을 직접 해보는 것 입니다. 그렇지 않다면 노트에 한 번씩 똑같이 따라 쓰면서 개념도를 작성해 보는 것도 도움이 될 것이라고 생각합니다. 3회차 시험이 꽤 어려웠던 시험이 었기 때문에, 위 문제를 풀 수 있으면 대부분 구조체 문제는 풀 수 있다고 생각하셔도 되는데, 시간이 없다면 구조체 선언과 초기화 방법 정도라도 알고 가시는 것을 추천드립니다.
18. 파일 구조에 대한 설명 중 괄호에 알맞은 답 작성하기
파일 구조는 파일을 구성하는 레코드들이 보조기억장치에 편성되는 방식으로, 순차 접근, ( ) 접근, 해싱 접근이 있는데, ( ) 접근은 레코드들을 키-값 순으로 정렬하여 키록하고 레코드 키 항목만을 모은 ( )를 구성하여 편성하는 방식이며 레코드를 참조할 때 ( )가 가리키는 주소를 사용하여 직접 참조할 수 있음
18번 문제는 보조기억장치에서 사용되는 파일 구조에 대한 설명입니다. 답은 색인(Index) 접근이며, 저장되는 레코드들의 키를 인덱스라고 생각하시면 될 것 같습니다. 여기서 인덱스라는 개념 자체가 앞서 설명드렸던 포인터(메모리 주소)와 동일하다고 보시면 됩니다. 각각의 파일 구조 특징이나 장단점에 대해 알고 있다면 쉽게 풀 수 있는 문제지만, 출제 빈도는 그렇게 높지 않기 때문에 우선 힙, 리스트, 트리와 같은 자료구조의 특징들을 공부하시고 시간이 남으면 파일 구조에 대해서 공부하시는 것을 권장드립니다.
19. 다음의 설명에 대한 알맞은 답을 영문 약어로 작성하기
( )는 사용자가 그래픽을 통해 컴퓨터와 정보를 교환하는 환경을 말하고,키보드 뿐만 아니라 마우스를 이용하여 화면의 메뉴 중 하나를 선택하여 작업을 수행하며 MS의 윈도우, Apple의 맥 운영체제가 있음
19번의 답은 별도로 설명할 필요가 없이 GUI(Graphic User Interface)죠. 그래픽 사용자 인터페이스라고 불리는 GUI와 반대되는 개념으로 CLI(Command Line Interface) 또는 CUI(Character User Interface)가 있습니다. CLI라고 줄여서 부르는 커맨드 라인 인터페이스는 는 말 그대로 명령어를 통해 사용자와 컴퓨터가 대화하는 방식으로 현재의 윈도우가 아닌 옛날의 DoS 컴퓨터나 서버용 리눅스에서 사용하는 방식이죠. 윈도우에서도 실행창에 cmd를 입력하시면 CLI 환경을 보실 수 있습니다. GUI가 나왔으니 CLI(CUI)도 기억해두시면 좋을 것 같습니다.
20. 소프트웨어 통합 테스트에 대한 설명 중 괄호에 알맞은 답 작성하기
( 1 ) 방식은 하위 모듈부터 시작하여 상위 모듈로 테스트를 진행하는 방식이며 ( 2 )가 필요하고, ( 2 )는 이미 존재하는 하위 모듈과 존재하지 않는 상위 모듈에 대한 인터페이스 역할을 함
20번 문제는 테스트 하네스(Test Harness)에 관한 문제입니다. 테스트 하네스란 개발된 시스템이나 컴포넌트가 정상적으로 작동하는지 시험하는 환경의 일부분으로, 아직 통합되지 않은 컴포넌트의 동작을 테스트 하기 위한 목적 하에 만들어진 코드와 데이터를 의미합니다. 테스트 방식에는 하향식(Top-Down) 방식과 상향식(Bottom-Up) 방식이 존재하는데, 하향식 방식은 상위 모듈부터 시작하여 하위 모듈로 테스트를 진행하며 하위 모듈 역할을 대신하는 테스트 스텁(Stub)이 있고, 반대로 상향식 방식은 하위 모듈부터 상위 모듈로 진행하며 상위 모듈을 대신하는 테스트 드라이버가 있습니다. 즉, (1)은 상향식, (2)는 테스트 드라이버가 답이 되겠습니다.
위에서는 이론적으로 설명드렸지만, 테스트 하네스라는 개념 자체가 특정 시스템의 컴포넌트가 완료되지 않은 상황에서 테스트를 해보기 위한 것으로, 상향식 방식에서는 하위 모듈이 이미 만들어져 있고 상위 모듈을 임시로 만들어 더미 컴포넌트 역할을 하는 테스트 드라이버가 존재하는 겁니다. 이해가 어려우시면 하향식-스텁, 상향식-드라이버 이렇게 외우시고 계시면 될 듯 합니다. 테스트에 관련한 문제들이 시험마다 빠짐없이 출제되고 있는 것으로 보이는데, 특히 2021년 2회차 실기 시험에서도 테스트 하네스에 대한 지문 자체가 출제되었습니다. 이전에는 하향식 방식이 나와서 이번에 상향식 방식이 출제된 것으로 보이니, 소프트웨어 테스트에 대한 부분은 자세히 공부하시길 바랍니다.
여기까지 2021년 3회차 실기 기출에 대한 풀이를 모두 끝냈습니다. 문제에 대해 해설하면서 어느 정도 외워야 할 것들과 시간이 없으면 스킵하고 넘어가도 되는 것들을 대강 설명드렸으니 어느 정도 감이 잡히셨으리라 생각합니다. 물론 제가 설명을 잘 못해서 이해가 안되는 부분도 있겠지만, 풀이가 이상하거나 궁금한 점이 있으시다면 언제든지 댓글로 달아주시면 자세히 설명드리도록 하겠습니다. 그럼 이것으로 마치도록 하죠. 긴 글 읽어주셔서 감사합니다.
'Certificate' 카테고리의 다른 글
오탐과 미탐(False Positive, False Negative) (0) | 2022.07.31 |
---|---|
쉽게 풀어보는 정보처리기사 실기 기출 2021년 3회 (2) (0) | 2022.05.05 |
쉽게 풀어보는 정보처리기사 실기 기출 2021년 3회 (1) (0) | 2022.01.11 |
댓글