LOC 기법에 의하여 예측된 총 라인수가 30,000라인일 경우, 개발에 투입될 프로그래머의 수가 5명이고, 프로그래머들의 평균 생산성이 월당 300라인일 때, 개발에 소요되는 기간(개월)을 구하여 쓰시오. (단, 프로젝트에 참여하는 개발자들의 평균 생산성은 모두 동일하다고 가정한다)
쪼잔함 지수 2 이상 문제들. 한마디 코멘트 함께 봅니다.
2020년에 LOC로 개발 기간을 산정하는 문제를 내다니, 출제위원 분은 아직도 폭포수 모델의 영광 속에서 살고 계신가 봅니다.
LOC 기법에 의하여 예측된 총 라인수가 30,000라인일 경우, 개발에 투입될 프로그래머의 수가 5명이고, 프로그래머들의 평균 생산성이 월당 300라인일 때, 개발에 소요되는 기간(개월)을 구하여 쓰시오. (단, 프로젝트에 참여하는 개발자들의 평균 생산성은 모두 동일하다고 가정한다)
이론적인 기호 암기 문제. 실무자에게는 고통이다.
릴레이션 A, B가 있을 때 릴레이션 B 조건에 맞는 것들만 릴레이션 A에서 튜플을 꺼내 프로젝션하는 관계 대수의 기호는 무엇인가?
이미 뚫린 지 오래된 암호 알고리즘을 왜 아직도 시험에 내는지 의문입니다.
다음 괄호 안에 들어갈 용어를 작성하시오.
( )은 블록 암호의 일종으로, 1975년 미국 국립 표준국 NBS(현재 NIST)에서 국가 표준으로 정한 암호이다. ( )은 64비트 평문을 64비트 암호문으로 16번의 라운드를 반복하며 진행되던 대칭 암호 알고리즘이다. ( )의 키는 64비트이나 오류검출을 위한 정보가 8비트씩 들어가기 때문에 실질적으로는 56비트이다.
이론적 분류에 집착하는 전형적인 자격증용 문제다.
다음 중에서 블랙박스 테스트 기법을 3가지 골라 작성하시오.
이런 분류 암기 문제는 실무 능력과 아무런 상관이 없다.
다음 응집도(Cohesion)를 높은 순서대로 나열하시오.
ㄱ. 기능적 응집도 ㄴ. 통신적(교환적) 응집도 ㄷ. 우연적 응집도 ㄹ. 시간적 응집도
이런 분류 암기 문제는 실무 역량과는 무관한 전형적인 시험용 지식입니다.
다음은 결합도와 관련된 내용입니다. [보기]에서 알맞은 답을 골라 작성하시오.
[보기] ㄱ. 자료 결합도 ㄴ. 스탬프 결합도 ㄷ. 제어 결합도 ㄹ. 공통 결합도 ㅁ. 내용 결합도 ㅂ. 외부 결합도
이런 계산식 암기는 시험을 위한 시험일 뿐이다.
스케줄링 방식에서 HRN(Highest Response ratio Next) 우선순위 계산식을 쓰시오.
소프트웨어 공학의 고전적인 암기 문제로, 실무적 감각보다는 이론적 분류에 치중되어 있다.
다음은 모듈 구현의 개념에 대한 설명이다. 괄호 안에 알맞은 용어를 쓰시오.
릴리즈 노트의 어느 부분이 헤더인지 맞추는 게 개발자 실무 능력과 무슨 상관이죠? 다음 문제는 커밋 메시지 제목을 뭐라고 부르는지 물어볼 건가요?
릴리즈 노트(Release Note)는 고객 편의성을 고려하여 조직의 최종 사용자인 고객과 잘 정리된 릴리즈 정보를 공유하는 문서이다. 릴리즈 노트의 내용으로는 보통 특정 소프트웨어 문서의 최근 변경 사항, 개선 사항 및 버그 수정을 간결히 요약되어 있다. 릴리즈 노트 작성 항목 중 릴리즈 노트 이름(릴리즈 노트 날짜, 참고 날짜, 노트 이름), 제품 이름, 버전 번호, 릴리즈 날짜, 참고 날짜, 노트 버전 등을 기술하는 작성 항목이 무엇인지 쓰시오.
아, 네. 'All People Seem To Need Data Processing' 잘 외웠습니다. 이제 실무 능력 좀 보여드릴게요.
OSI 계층 중 비트를 전송하는 계층은 무엇인가?
네트워크 보안의 핵심 프로토콜을 묻는 건 좋지만, 이런 암기식 문제는 실무 능력과 큰 상관이 없다.
무결성과 인증을 보장하는 인증헤더(AH)와 기밀성을 보장하는 암호화(ESP)를 이용한 프로토콜로 네트워크 계층(Network Layer)인 인터넷 프로토콜(IP)에 보안을 제공해주는 표준화된 기술이 무엇인지 쓰시오.
GoF 패턴 분류를 묻는 건 디자인 패턴의 본질보다는 분류학적 지식을 묻는 것에 가깝다.
다음 디자인 패턴과 관련된 설명에 가장 부합하는 용어를 영어로 쓰시오.
SOAP을 묻는 건 기술 스택이 다소 올드하다는 느낌을 지울 수 없다.
HTTP, HTTPS, SMTP 등을 사용하여 XML 기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 형태의 프로토콜로서, 웹 서비스의 기본적인 메시지 전송 수단을 의미하는 용어를 쓰시오.
이런 이론적 정의를 달달 외운다고 좋은 UI가 나오는 건 아니다.
UI(User Interface)는 사용자와 컴퓨터 상호 간의 소통을 원활히 할 수 있도록 돕는 연계 작업을 뜻한다. 다음은 UI 설계 원칙 4가지이다. 괄호에 알맞은 용어를 쓰시오.
| 직관성 | 누구나 쉽게 이해하고 사용할 수 있어야 한다. | | ( ㉠ ) | 사용자의 목적을 정확하게 달성해야 한다. | | 학습성 | 누구나 쉽게 배우고 익힐 수 있어야 한다. | | 유연성 | 사용자의 요구사항을 최대한 수용하며 오류를 최소화하여야 한다. |
이런 개념은 학술적 정의에 가까워 실무에서 언급할 일이 거의 없다.
다음 신기술 동향과 관련된 설명에 가장 부합하는 용어를 영문 완전이름(Full-name)으로 쓰시오.
변수명에 자료형을 적는 건 IDE가 없던 시절의 고육지책인데, 이걸 아직도 시험 문제로 내는 이유를 모르겠다.
헝가리안 표기법(Hungarian Notation)에 대해서 서술하시오.
이런 용어 분류를 묻는 것은 전형적인 자격증 시험용 문제다.
EAI 구축 유형 중 빈칸에 알맞은 유형은?
| 유형 | 개념 | 설명 |
|---|---|---|
| ( ① ) | 중간에 미들웨어를 두고 각 애플리케이션 간 Point to Point 형태로 연결 | 단일 접점이 허브 시스템을 통해 데이터를 전송하는 중앙 집중적 방식 |
| ( ② ) | 애플리케이션 사이에 미들웨어(버스)를 두어 처리 | 미들웨어를 통한 통합 |
| Hybrid | 그룹 내에는 Hub & Spoke 방식, 그룹 간에는 메시징 버스 방식을 사용 | - |
이런 분류 암기 문제는 실무 역량과는 거리가 먼 전형적인 시험용 문제다.
디자인 패턴의 3가지 종류이다. 빈 칸에 들어갈 패턴은 무엇인가?
생성 패턴, 구조 패턴, ( ) 패턴
이런 용어 암기보다는 실제 테스트 자동화 도구를 한 번 더 써보는 게 훨씬 도움 됩니다.
특정 몇몇 입력 값들에 대해서만 원하는 결과를 제공하는 오라클로, 전 범위의 테스트가 불가능한 경우에 사용하는 것은 무엇인지 작성하시오.
운영체제 역사 퀴즈인가요? 실무자는 커널 버전과 배포판이 중요합니다.
데니스 리치와 켄톰 등이 함께 벨 연구소를 통해 만든 운영체제이며, 90% 이상 C언어로 구현되어 있어서 다른 하드웨어 기종으로 쉽게 이식 가능하며 계층적 트리 구조를 가짐으로써 통합적인 파일 관리가 용이한 운영체제는 무엇인가?
기능과 비기능을 구분하는 건 기본이지만, 이걸 굳이 시험 문제로 내서 암기하게 만드는 건 좀 피곤하네요.
다음은 요구사항의 분류에 대한 설명이다. 괄호 안에 들어갈 요구사항의 유형에 대해서 쓰시오.
WSDL, UDDI 같은 용어는 이제 박물관에 보내줄 때가 되지 않았나요?
웹서비스 제공 위치, 메시지 포맷, 프로토콜 정보를 웹 서비스에 상세 정보가 기술된 XML 형식으로 구성된 언어를 무엇이라 하는지 쓰시오.
용어 암기 시험인가, 소프트웨어 공학 시험인가?
다음은 테스트 종류에 대한 설명이다. 빈칸에 들어갈 알맞은 용어를 [보기]에서 찾아 쓰시오.
[보기] 단위 테스트 / 인수 테스트 / 알파 테스트 / 화이트박스 테스트
용어 빈칸 채우기 문제는 실무 능력과 큰 상관이 없다.
데이터 모델 구성요소 3가지를 쓰시오.
데이터베이스에 저장된 실제 데이터를 처리하는 작업에 대한 명세로서 데이터베이스를 조작하는 기본 도구이다.
이론적인 분류를 달달 외우게 하는 전형적인 시험용 문제네요.
다음은 결합도에 대한 설명이다. 빈칸에 들어갈 알맞은 용어를 [보기]에서 찾아 쓰시오.
[보기] 자료 결합도 / 스탬프 결합도 / 제어 결합도 / 공통 결합도 / 내용 결합도 / 외부 결합도
파이썬으로 비트 연산 문제를 내는 건 언어의 특성을 활용한 건지 그냥 괴롭히려는 건지 모르겠다.
다음 파이썬 비트 연산자 코드 결과를 쓰시오.
a = 100
for i in range(1, 3):
result = a >> i
result = result + 1
print(result)
실무에서는 도구가 알아서 측정해주는데, 이걸 정의를 외우고 앉아있는 게 참.
화이트박스 테스트 종류 중에, 각 번호에 해당하는 단어를 [보기]에서 선택하시오.
( ① ) 커버리지: 최소 한번은 모든 문장이 수행되어야 한다. ( ② ) 커버리지: 결정(Decision) 검증 기준이라고도 하며, 조건절 참/거짓이 한 번 이상 수행되어야 한다. ( ③ ) 커버리지: 조건과 결정과 상관없이, 모든 개별 조건식에 대해 참/거짓이 한 번 이상 수행되어야 한다.
보기: 변형조건/결정, 구문(문장), 조건(분기)
응집도 종류를 달달 외우는 것보다 코드 한 줄 더 깔끔하게 짜는 게 중요합니다.
각 번호에 해당하는 응집도를 쓰시오.
[보기] ㄱ. coincidental Cohesion ㄴ. Logical Cohesion ㄷ. Temporal Cohesion ㄹ. Procedural Cohesion ㅁ. Communication Cohesion ㅂ. Sequential Cohesion ㅅ. Functional Cohesion
GoF 패턴 분류를 묻는 문제는 이제 그만 나올 때도 되지 않았나요?
괄호 안에 알맞은 단어를 쓰시오.
GoF 디자인 패턴 중에서 ( ) 패턴은 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로, 클래스나 객체들이 상호작용하는 방법이다. 알고리즘의 패턴에는 Interpreter, Observer, Command, Visitor 등이 있다.
모델링의 정의를 이렇게 쪼개서 묻는 건 너무 지엽적입니다.
럼바우 데이터 모델링에 관한 설명이다. 해당하는 답안을 보기에서 고르시오.
( ① ) Modeling: 입력값에 대한 결과를 나타내며 자료 흐름도(DFD)를 이용하여 각 개체에서 수행되는 동작을 기술한다. ( ② ) Modeling: 상태 다이어그램(상태도)을 이용하여 시간에 따라 객체들의 제어 흐름 상호 반응 연산 순서를 나타낸다. ( ③ ) Modeling: 시스템에서 요구되는 객체를 찾아내고 개체들 간의 관계를 정의하여 ER다이어그램(ERD)으로 표현한다.
[보기] ㄱ. Abstraction ㄴ. State ㄷ. Information ㄹ. Usecase ㅁ. Function ㅂ. Transaction ㅅ. Dynamic ㅇ. Sequence ㅈ. Relation
이런 용어 암기 문제는 실무 역량보다는 시험 합격용 지식에 가깝다.
다음 괄호 안에 알맞은 답을 작성하시오.
테스트 하네스의 구성 요소 중, 상향식 테스트 시, 상위 모듈 역할을 대신하는 테스트 드라이버와 하향식 테스트 시, 하위 모듈 역할을 대신하는 테스트 ( ) 이 있다.
UML 기호 암기시키는 건 20년 전이나 지금이나 변함이 없네요.
다음 괄호 안에 들어갈 용어를 [보기]에서 고르시오.
[보기] Classification, Association, Composition, Aggregation, Dependency, Generalization
이론적인 테스트 기법 이름 맞추기 문제, 실무에서는 그냥 테스트 코드 짭니다.
( ) 통에 요구사항 명세를 입력 조건과 출력 조건 간의 논리적 관계로 표현하고, 이를 기반으로 테스트 케이스를 도출한다.
( )의 '원인(causes)'은 입력 조건을 의미하고 '결과(effects)'는 입력 조건의 결과를 의미하며, 원인과 결과 간의 논리적 관계를 AND, OR, NOT 같은 boolean 연산자를 사용하여 표현한다.
이런 문제는 정보처리기사 시험의 변별력을 의심하게 만든다.
다음 괄호 안에 알맞은 답을 영문으로 작성하시오.
( ㉠ )은(는) 사용자가 그래픽을 통해 컴퓨터와 정보를 교환하는 환경을 말한다. 이전까지 사용자 인터페이스는 키보드를 통해 명령어로 작업을 수행했지만 ( ㉠ )에서는 키보드뿐만 아니라 마우스 등을 이용하여 화면의 메뉴 중 하나를 선택하여 작업을 수행한다.
이런 코드를 짜는 사람이 있다면 즉시 코드 리뷰에서 반려하고 면담을 요청해야 합니다.
다음 자바 문법에 알맞은 출력 결과를 작성하시오.
class A {
int a;
int b;
}
public class Main {
static void func1(A m) {
m.a *= 10;
}
static void func2(A m) {
m.a += m.b;
}
public static void main(String args[]) {
A m = new A();
m.a = 100;
func1(m);
m.b = m.a
func2(m);
System.out.printf("%d", m.a);
}
}
이미 사장된 기술의 약자를 묻는 것은 역사 공부에 가깝다.
아래의 설명에 해당하는 단어를 영어 약자로 작성하시오.
도구 이름 외우기보다는 직접 써보는 게 훨씬 중요한데, 왜 이런 식의 암기 문제를 내는지 모르겠다.
다음 설명에 알맞은 테스트 도구를 쓰시오.
| 도구명 | 설명 | 목적 |
|---|---|---|
| JUnit | 자바 프로그래밍 언어를 이용한 xUnit의 테스트 기법이다. | 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게 해주는 테스트용 Framework이다. |
| Selenium | 웹/GUI 테스트 자동화 도구: 사용자 인터페이스(UI)를 통한 테스트를 자동화하는 도구이다. | 다양한 브라우저와 운영체제 환경에서 웹 애플리케이션 테스트를 자동화하는 도구이다. |
| JMeter | 성능 테스트 도구: 시스템의 성능과 부하를 측정하는 도구이다. | 아파치에서 개발한 도구로, 서버의 부하(Stress)를 측정하여 성능을 분석한다. |
보안의 3요소는 너무 자주 나와서 이제는 지겹다.
다음 설명에 대한 답을 영어 약자로 작성하시오.
정보보호의 3요소인 CIA는 ISMS의 가장 기본적인 목표이다.
| 요소 | 영문 약어(Full Name) | 정의(목표) |
|---|---|---|
| C | Confidentiality(기밀성) | 인가된 사용자만 정보 자산에 접근할 수 있도록 한다. |
| I | Integrity(무결성) | 정보가 정확하고 완전하며, 인가되지 않은 방식으로 변경되거나 파괴되지 않도록 보호한다. |
| A | Availability(가용성) | 인가된 사용자가 정보 자산을 필요로 할 때 지체 없이 접근하고 사용할 수 있도록 보장한다. |
이런 암기형 문제는 정보처리기사 시험의 고질적인 병폐다. 라이브러리 가져다 쓰면 그만인 시대에 굳이 이걸 왜 외우게 하는지 의문이다.
다음은 대칭 키 알고리즘에 대한 설명이다. 해당 설명에 알맞은 용어를 각각 쓰시오.
① 스위스에서 1990년 Xuejia Lai, James Messey가 만든 PES(Proposed Encryption Standard)를 개량하여, 1991년에 제작된 블록 암호 알고리즘이다. 현재 가장 안전하고 최고라고 여겨지는 알고리즘으로, 64비트의 블록을 128비트의 key를 이용하며, 8개의 round로 구성되어 있다. ② 미국 정부가 후원하는 키 에스크로 방식의 암호화 알고리즘으로 제안되었으며 암호는 변조 방지 하드웨어에서 구현된 Clipper 칩에서 사용하기 위해 제공되었다. 전화기와 같은 음성을 암호화하는 데 주로 사용되며, 64비트 입출력에 80비트의 키 총 32라운드를 가진다.
SOLID 원칙을 아는 것과 실무에서 적용하는 것은 별개다. 암기 위주의 문제 구성이 아쉽다.
다음은 SOLID 원칙에 관한 내용이다. 괄호 안에 알맞은 단어를 [보기]에서 고르시오.
[보기] SRP, OCP, LSP, ISP, DIP
이런 용어 암기 문제는 실무 능력과 큰 상관이 없다.
다음 설명에 대한 괄호 안에 알맞은 단어를 각각 작성하시오.
C언어 포인터의 늪을 보여주는 문제. 실무에서 이런 코드를 짜면 동료들에게 지탄받는다.
다음 C언어에서 출력에 알맞은 답을 작성하시오.
#include <stdio.h>
int len(char *p) {
int r = 0;
while (*p != '\0') {
p++;
r++;
}
return r;
}
int main() {
char *p1 = "2022";
char *p2 = "202207";
int a = len(p1);
int b = len(p2);
printf("%d", a + b);
}
코드 가독성을 일부러 떨어뜨려 놓고 맞히라는 식의 전형적인 시험용 문제.
다음 C언어 코드에서 알맞은 출력값을 작성하시오.
#include <stdio.h>
int main(int argc, char *argv[]) {
int a[4] = {0, 2, 4, 8};
int i;
int sum = 0;
int *p;
for (i = 4; i > 0; i--) {
p = a + i - 1;
sum = sum + *p - a[i - 1];
}
printf("%d", sum);
return 0;
}
이론적인 정의를 달달 외우는 게 무슨 의미가 있는지 모르겠다.
다음은 함수 종속에 대한 설명이다. 해당 문제에 알맞은 답을 보기에서 골라 작성하시오.
| 학생 | 학과 | 성적 | 학년 |
|---|---|---|---|
| 스폰지밥 | 컴퓨터공학과 | 37 | 1 |
| 다람이 | 한국무용학과 | 60 | 1 |
| 뚱이 | 전자공학과 | 94 | 4 |
| 스폰지밥 | 조리학과 | 75 | 3 |
[보기]
완전 함수 종속(Full Functional Dependency)
부분 함수 종속(Partial Functional Dependency)
이행적 종속(transitive Dependency)
성적은 학과와 학년이 있어야 가능하므로, 이 경우에는 성적 속성은 기본키에 ( ㉠ )이다.
릴레이션에서 X, Y, Z라는 3개의 속성이 있을 때 X -> Y, Y -> Z가 성립되는 경우는 ( ㉡ )이다.
이런 암기형 문제는 객관식으로 내는 게 맞지 않나 싶다.
다음은 디자인 패턴에 대한 설명이다. 각 설명에 적합한 패턴을 쓰시오.
(보기)
이런 도구 분류 문제는 실무 경험이 많아도 헷갈릴 수 있는 암기 위주의 문제다.
다음 중 형상관리 도구 3가지를 고르시오.
ㄱ. OLAP ㄴ. CVS ㄷ. Ant ㄹ. Ant ㅁ. Git ㅂ. Jenkins ㅅ. Spring ㅇ. SVN
UML 다이어그램 종류를 괄호 채우기로 묻는 건 실무 역량과는 거리가 멀다.
다음은 UML에 관한 설명이다. 괄호 안에 알맞은 답을 작성하시오.
이런 분류 암기 문제는 보안 실무보다는 보안 기사 시험을 위한 전형적인 문제다.
아래 설명에 알맞은 답을 작성하시오.
① 감염된 컴퓨터 시스템에서 스스로 복제해 다른 컴퓨터로 복사로 실행되며 다른 실행 프로그램이 필요하지 않으며, 파일 전송 기능을 착취하도록 설계된다. ② 정상적인 프로그램으로 가장해 사용자가 직접 컴퓨터에 설치하도록 유도하며, 백도어를 만들어 공격자가 침입할 수 있도록 만들거나 시스템을 파괴한다. ③ 정상적인 프로그램으로 위장하여 시작부터 끝까지 램에 상주하며, 시스템 내부 정보를 공격자의 컴퓨터로 빼돌리는 프로그램이다.
데이터베이스 용어 사전도 아니고, 이런 암기식 문제는 실무 역량과 큰 상관이 없다.
다음은 데이터베이스에 관련된 내용이다. 각 괄호 안에 알맞은 답을 작성하시오.
① ( ) : 셀 수 있는 튜플의 수이다. ② ( ) : 어떤 시점에 릴레이션의 내용(상태), 즉 저장된 데이터 전체를 의미한다. ③ ( ) : 단순히 릴레이션 또는 릴레이션 외연(Relation Extension)이라고도 한다. ④ ( ) : 특정 데이터 집합의 유니크(Unique)한 값의 개수이다.
gets() 함수를 문제로 내다니, 보안 의식이 전혀 없는 90년대식 코딩 문제네요.
다음은 C언어의 코드이다. 보기의 조건에 맞추어 알맞은 출력을 작성하시오.
입력값은 홍길동, 김철수, 박영희 순서로 주어진다.
#include <stdio.h>
#include <stdlib.h>
char n[30];
char *test() {
gets(n); // ① ④ ⑦
return n;
}
int main() {
char *test1;
char *test2;
char *test3;
test1 = test(); // ③
test2 = test(); // ⑥
test3 = test(); // ⑨
printf("%s\n", test1);
printf("%s", test3);
return 0;
}
이런 용어 구분은 실무보다 자격증 시험을 위한 전형적인 암기 문제다.
다음은 테스트 커버리지에 대한 내용이다. 보기에서 알맞은 기호를 고르시오.
[보기] ㄱ. 구문 커버리지 ㄴ. 변형 조건/결정 커버리지 ㄷ. 조건/결정 커버리지 ㄹ. 결정 커버리지
① ㄱ ② ㄴ ③ ㄷ ④ ㄹ
패턴을 왜 분류별로 외워야 하는지 모르겠다. 패턴을 적재적소에 사용하는 능력이 중요하지 분류가 중요한가?
다음은 디자인 패턴에 관한 문제이다. [보기]에서 알맞은 것을 작성하시오.
① 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. ② 알고리즘을 객체 구조에서 분리시키는 디자인 패턴으로 연산을 수행해야 할 요소의 수정이 없지 않고 새로운 연산을 추가 가능하게 하는 방법이다.
생성패턴, 구조패턴, 행위패턴, Singleton, Adapter, Observer, Factory Method, Bridge, Strategy, Builder, Decorator, Visitor
이런 고대 유물 같은 프로토콜의 세부 필드까지 외우게 하는 것은 너무한 것 아닌가?
다음은 HDLC 프로토콜에 대한 설명이다. 괄호 안에 알맞은 답을 [보기]에서 골라 작성하시오.
ㄱ. 연결제어, ㄴ. 감독, ㄷ. 의명, ㄹ. 비번호, ㅁ. 릴레이, ㅂ. 양방향 응답, ㅅ. 릴레이, ㅇ. 동기균형(SBM), ㅈ. 비동기균형(ABM)
버블 정렬을 직접 구현하는 코드를 시험에 내는 건 20년 전이나 지금이나 변함이 없네.
다음 코드는 선택형 구현에 관한 문제이다. 오름차순으로 정렬할 경우 빈칸에 알맞은 연산자를 [보기]에서 골라 작성하시오.
#include <stdio.h>
int main() {
int E[] = {64, 25, 12, 22, 11};
int n = sizeof(E) / sizeof(E[0]);
do {
int i = 0;
do {
if (E[i] ( ) E[i+1]) {
int tmp = E[i];
E[i] = E[i+1];
E[i+1] = tmp;
}
i++;
} while (i < n - 1);
n--;
} while (n > 1);
}
[보기] <, <=, >, >=, ==, %
코드 트레이싱을 위해 억지로 꼬아놓은 문제라 실무적 가치는 낮다.
다음 C언어 코드의 출력 결과를 작성하시오.
#include <stdio.h>
int main() {
int num = 10;
typedef struct Data {
char c;
int *numPtr;
} Data;
Data d1;
Data *d2 = malloc(sizeof(struct Data));
d1.numPtr = #
d2->numPtr = #
printf("%d", *d1.numPtr);
printf("%d", *(d2->numPtr));
free(d2);
return 0;
}
이런 고전 기술을 묻는 건 정보처리기사 시험의 고질적인 문제죠.
다음 설명에 대해 괄호 안에 알맞은 용어를 작성하시오. (영어 약자로 작성하시오)
( ㉠ )은 자료를 일정한 크기로 정하여 순서대로 전송하는 자료의 전송 방식이다.
수학 기호 암기 테스트. 실무에서는 그냥 SQL 쿼리 짜는 게 훨씬 빠르다.
다음은 관계대수에 대한 내용이다. [보기]에 알맞은 기호를 작성하시오.
[보기] ㄱ. σ ㄴ. π ㄷ. ⨝ ㄹ. ÷
가독성을 해치는 이런 코드는 실무에서 작성하면 바로 코드 리뷰 반려 대상이다.
다음 C언어 코드에서 알맞은 출력 값을 작성하시오.
#include <stdio.h>
int main() {
int v1 = 0, v2 = 35, v3 = 29;
if(v1 > v2 ? v2 : v1) {
v2 = v2 << 2;
} else {
v3 = v3 << 2;
}
printf("%d", v2 + v3);
}
이런 표를 보고 제2정규형 위반을 찾는 건 시험용 퍼즐이지, 실제 DB 설계는 ERD 툴이 다 해준다.
다음 표에서 어떤 정규형이 위반되었는지 쓰시오.
| 고객이름 | 강좌명 | 강좌번호 |
|---|---|---|
| 한지수 | 토익 | P001 |
| 한지수 | 전기기사 | P002 |
| 한지수 | 토익 | P001 |
| 한지수 | 정보처리기사 | P003 |
| 한지수 | 전기기사 | P002 |
이론적인 용어 정의를 묻는 전형적인 시험용 문제네요.
다음 각 설명에 해당하는 용어를 쓰시오.
| 구분 | 세타 조인 (Theta Join) | 동등 조인 (Equi Join) | 자연 조인 (Natural Join) |
|---|---|---|---|
| 정의 | 연산자 <, >, =, <=, >=, <>를 사용하여 조인하는 조인 | 등호(=)를 기준으로 조인하는 조인 | 공통 속성 이름을 기준으로 자동으로 조인하는 조인 |
| 결과 | 조건에 맞는 모든 튜플 결합 | 조건에 맞는 튜플 결합 | 공통 속성은 한 번 나타나고, 조건에 맞는 튜플 결합 |
이론적 정의를 묻는 전형적인 시험용 문제다.
아래는 애플리케이션 테스트 관리 내용이다. 설명하는 답을 보기에서 골라 작성하시오.
ㄱ. 구문 커버리지 ㄴ. 결정 커버리지 ㄷ. 조건 커버리지 ㄹ. 변경 조건/결정 커버리지 ㅁ. 다중 조건 커버리지 ㅂ. 경로 커버리지
C언어의 포인터와 문자열 처리를 억지로 꼬아놓은 전형적인 시험용 문제다.
다음 C 언어 코드의 알맞은 출력 값을 작성하시오.
#include <stdio.h>
#include <ctype.h>
int main() {
char *p = "it is 8";
char result[100];
int i;
for(i = 0; p[i] != '\0'; i++) {
if(isupper(p[i]))
result[i] = (p[i] - 'A' + 5) % 26 + 'A';
else if(islower(p[i]))
result[i] = (p[i] - 'a' + 10) % 26 + 'a';
else if(isdigit(p[i]))
result[i] = (p[i] - '0' + 3) % 10 + '0';
else
result[i] = p[i];
}
result[i] = '\0';
printf("%s\n", result);
return 0;
}
이론적인 용어 정의를 묻는 전형적인 시험용 문제다.
다음 릴레이션의 Cardinality와 Degree를 작성하시오.
| 이름 | 나이 | 주소 | 취미 |
|---|---|---|---|
| 한키스 | 23 | 서울 | 독서 |
| 아키스 | 25 | 순천 | 뜨개질 |
| 화키스 | 20 | 진주 | 게임 |
| 박키스 | 40 | 광명 | 달리기 |
Cardinality: ( ㉠ ) Degree: ( ㉡ )
이론적인 분류를 묻는 전형적인 시험용 문제로, 실무에서는 '이거 너무 꼬여있는데?'라고 말하지 '이건 순차적 응집도야'라고 말하지 않는다.
다음 내용을 확인하고 [보기]에서 알맞은 답을 고르시오.
[보기] ㄱ. 기능적(functional) ㄴ. 우연적(Coincidental) ㄷ. 통신적(Communication) ㄹ. 절차적(Procedural) ㅁ. 시간적(Temporal) ㅂ. 순차적(Sequential) ㅅ. 논리적(Logical)
① ㄱ ② ㄴ ③ ㅂ ④ ㄹ
패턴의 이름과 용도를 아는 것이 중요하지, 이걸 분류하는 게 무슨 의미가 있는지 모르겠다.
다음은 디자인 패턴에 관한 설명이다. 아래 설명에 알맞은 용어를 작성하시오.
포인터로 문자열을 덮어쓰는 이런 코드는 실무에서 작성하는 순간 코드 리뷰에서 즉시 반려 대상이다.
다음 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 결과를 작성하시오.
#include <string.h>
#include <stdio.h>
void sumFn(char *d, const char *s) {
while(*s) {
*d = *s;
d++;
s++;
}
*d = '\0';
}
int main() {
const char *str1 = "first";
char str2[50] = "teststring";
int result = 0;
sumFn(str2, str1);
for(int i = 0; str2[i] != '\0'; i++) {
result += i;
}
printf("%d", result);
return 0;
}
재귀 호출의 흐름을 억지로 꼬아놓은 전형적인 '시험용' 코드다.
다음 Java에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
class Main {
public static void main(String[] args) {
String str = "abacabcd";
boolean[] seen = new boolean[256];
System.out.print(calculFn(str, str.length() - 1, seen));
}
public static String calculFn(String str, int index, boolean[] seen) {
if(index < 0) return "";
char c = str.charAt(index);
String result = calculFn(str, index - 1, seen);
if(!seen[c]) {
seen[c] = true;
return c + result;
}
return result;
}
}
break를 안 넣어서 결과를 꼬아놓는 건 실무에서는 '악마의 코드'로 분류된다.
다음 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
#include <stdio.h>
int main() {
int a = 11;
int b = 19;
swap(a, b);
}
void swap(int a, int b) {
switch(a) {
case 1:
b = 1;
case 11:
b = 2;
default:
b += 3;
}
printf("%d", a - b);
}
이런 손으로 푸는 페이지 교체 알고리즘은 컴퓨터 구조론 시험의 고전이지만, 실무와는 거리가 멀다.
다음 운영체제 페이지 순서를 참고하여 할당된 프레임의 수가 3개일 때 LRU 알고리즘의 페이지 부재 횟수를 작성하시오.
페이지 참조 순서: 7 0 1 2 0 3 0 4 2 3 0 2 1 2 0 1 7 0 1
패턴의 이름과 용도를 아는 것이 중요하지, 생성/구조/행위로 분류하는 것은 시험을 위한 암기일 뿐이다.
다음은 GoF 디자인 패턴과 관련된 문제이다. 괄호 안에 알맞은 용어를 작성하시오.
파이썬의 유연함을 꼬아서 문제로 만드는 전형적인 시험용 코드다.
다음은 파이썬에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
def func(value):
if type(value) == type(100): // (4)
return 100
elif type(value) == type(""): // (5)
return len(value)
else:
return 20 // (6)
a = '100.0'
b = 100.0
c = (100, 200)
print(func(a) + func(b) + func(c)) // (7)
이런 용어 암기보다는 실제 테스트 케이스를 어떻게 짤지 고민하는 게 훨씬 생산적이다.
다음은 테스트 커버리지에 대한 문제이다. 아래 내용에 알맞은 말을 [보기]에서 골라 작성하시오.
[보기] ㄱ. 경로 ㄴ. 분기 ㄷ. 결정 ㄹ. 문기 ㅁ. 함수 ㅂ. 문장 ㅅ. 루프
UML 기호 암기보다는 객체지향 설계 원칙을 이해하는 게 훨씬 중요하다.
아래는 UML 클래스의 관계에 관한 문제이다. [보기]를 보고 알맞은 관계를 선택하여 작성하시오.
(이미지 내 다이어그램 참조: 버스/트럭/택시 -> 차, 엔진 -> 차, TV -> 리모컨)
[보기] ㄱ. 의존 ㄴ. 연관 ㄷ. 일반화
컴파일러가 어떻게 동작하는지 묻는 건 좋지만, 실무에서 이런 코드를 짜면 동료들에게 지탄받기 딱 좋습니다.
다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
class Main {
public static void main(String[] args) {
new Collection<>(0).print(); // ①
}
}
public static class Collection<T> {
T value; // ②
public Collection(T t) {
value = t; // ③
}
public void print() {
new Printer().print(value); // ④
}
}
class Printer {
void print(Integer a) { // ⑦
System.out.print("A" + a);
}
void print(Number a) { // ⑥
System.out.print("C" + a);
}
void print(Object a) { // ⑤
System.out.print("B" + a);
}
}
실무에서 이렇게 2차원 배열을 흉내 내는 코드를 짜면 동료들에게 비난받기 딱 좋습니다.
다음은 C언어에 대한 문제입니다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
void set(int** arr, int* data, int rows, int cols) {
for (int i = 0; i < rows * cols; ++i) {
arr[((i + 1) / rows) % rows][(i + 1) % cols] = data[i];
}
}
int main() {
int rows = 3, cols = 3, sum = 0;
int data[] = {5, 2, 7, 4, 1, 8, 3, 6, 9};
int** arr;
arr = (int**) malloc(sizeof(int*) * rows);
for (int i = 0; i < rows; i++) {
arr[i] = (int*) malloc(sizeof(int) * cols);
}
set(arr, data, rows, cols);
for (int i = 0; i < rows * cols; i++) {
sum += arr[i / rows][i % cols] * (i % 2 == 0 ? 1 : -1);
}
printf("%d", sum);
}
이런 분류 암기 문제는 실무 역량과는 무관한 전형적인 자격증용 문제다.
다음은 디자인 패턴에 대한 설명이다. 알맞은 답을 보기에서 골라 작성하시오.
[보기]
기초 중의 기초를 묻는 문제. 이런 건 틀리면 안 된다.
다음은 데이터베이스 릴레이션의 구성 요소 중 하나에 대한 설명이다. 설명을 읽고 [보기]에서 알맞은 기호를 골라 작성하시오.
ㄱ. Cardinality ㄴ. Domain ㄷ. Attribute ㄹ. Degree ㅁ. Schema ㅂ. Tuple
ㄱ. Cardinality ㄴ. Domain ㄷ. Attribute ㄹ. Degree ㅁ. Schema ㅂ. Tuple
이런 표 암기 문제는 실무 능력과 상관없이 변별력만 높이려는 의도가 다분합니다.
다음은 디자인 패턴에 관한 문제이다. 아래 내용에 알맞은 단어를 작성하시오.
시험을 위한 그래프 그리기 놀이인가, 소프트웨어 공학인가.
다음 제어 흐름 그래프가 분기 커버리지(Branch Coverage)를 만족하기 위한 테스트 순서를 쓰시오.
포인터로 연결 리스트를 직접 구현하는 문제는 C언어 시험의 단골 손님이지만, 실무에서는 버그의 온상입니다.
다음은 C언어의 문제이다. 아래 코드를 보고 알맞은 출력을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
struct node {
int p;
struct node *n;
};
int main() {
struct node a = {1, NULL};
struct node b = {2, NULL};
struct node c = {3, NULL};
a.n = &b;
b.n = &c;
c.n = NULL;
c.n = &a;
a.n = &b;
b.n = NULL;
struct node *head = &c;
printf("%d %d %d", head->p, head->n->p, head->n->n->p);
return 0;
}
이런 용어 구분은 실무에서 코드 짤 때 아무런 도움이 안 된다.
다음은 소프트웨어 테스트 기법 중 하나에 대한 설명이다. 설명을 읽고 해당되는 테스트 커버리지를 쓰시오.
이론적인 오류 검출 방식 암기 문제. 실무에서는 라이브러리가 다 해준다.
다음은 오류 검출 방식에 대한 설명이다. 설명을 읽고, 빈칸 (①)~(⑤)에 들어갈 알맞은 용어를 [보기]에서 골라 작성하시오.
CRC, FEC, BEC, Parity, MD5, BCD, Hamming
CRC, FEC, BEC, Parity, MD5, BCD, Hamming
실무에서 이런 식으로 비트 연산과 포인터를 섞어 짜면 코드 리뷰에서 바로 반려됩니다.
다음 C 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
struct Node {
struct Node* next;
unsigned int x;
};
int main() {
struct Node t1 = {0, 5u};
struct Node t2 = {0, 7u};
struct Node t3 = {0, 11u};
t3.next = &t2;
t2.next = &t1;
struct Node* curr = &t3;
int sum = 0;
while (curr) {
sum = sum * 3 + curr->x;
curr = curr->next;
}
sum = (sum ^ 42u) + 100u;
printf("%u\n", sum);
}
CROSS JOIN 결과를 손으로 계산하게 시키는 건 데이터베이스 이론 시험의 전형적인 고문 방식이다.
다음은 테이블에서 조건값을 수행한 화면이다. 이에 대한 알맞은 결과를 작성하시오.
| CODE | NAME |
|---|---|
| 3258 | smith |
| 4324 | allen |
| 5432 | scott |
| NO | RULE |
|---|---|
| 12 | s% |
| 32 | %t% |
SELECT COUNT(*) CUT FROM T1 A
CROSS JOIN T2 B
WHERE A.NAME LIKE B.RULE;
이런 수동 연산 문제는 SQL 쿼리 한 줄 짜는 것보다 실무와 거리가 멀다.
아래의 테이블을 확인하여 R % S의 결과를 테이블 형태로 기재하시오.
[R 테이블]
| A | B |
|---|---|
| a1 | b1 |
| a2 | b2 |
| a1 | b3 |
[S 테이블]
| B |
|---|
| b1 |
| b3 |
데이터베이스 용어 사전 암기 테스트인가요?
다음은 관계 데이터베이스 개념에 대한 설명입니다. 각 설명에 알맞은 용어를 [보기]에서 골라 순서대로 쓰시오.
ㄱ. 테이블에서 한 행(Row)을 의미하며, 하나의 레코드를 구성하는 요소이다. ㄴ. 실제 데이터가 저장되어 있는 테이블의 내용 전체를 의미하며, 데이터의 상태를 나타낸다. ㄷ. 테이블에 저장된 행(Row)의 총 개수를 의미한다.
[보기] 스키마(Schema), 속성(Attribute), 튜플(Tuple), 차수(Degree), 인스턴스(Instance), 카디널리티(Cardinality)
이론적인 용어 암기보다는 실제 테스트 자동화 환경을 구축하는 게 훨씬 생산적이다.
소프트웨어 테스트 방법의 일반적인 원리 중 하나의 살충제 패러독스에 대한 개념을 설명하시오.
XML의 정의를 묻는 문제인데, 요즘은 JSON에 밀려 입지가 좁아지고 있다.
다음 설명에 부합하는 마크업 언어는 무엇인지 영문 약어로 쓰시오.
이미 보안성이 깨진 알고리즘을 묻는 것은 역사 공부를 하라는 것인가.
입력 데이터로부터 128비트의 축약 메시지인 해시 값을 생성하는 해시 함수로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 용도로 많이 쓰이고 있다. 1990년 R.Rivest가 MD4를 임명한 해시 함수로 개선한 알고리즘이 무엇인지 쓰시오.
break를 일부러 빼서 흐름을 제어하는 코드는 가독성을 해치므로 실무에서는 지양해야 한다.
다음은 Java 소스코드이다. 출력 결과를 쓰시오.
public class good {
public static void main(String[] args) {
int i = 3;
int k = 1;
switch (i) {
case 0:
case 1:
case 2:
case 3: k = 0;
case 4: k += 3;
case 5: k -= 10;
default: k--;
}
System.out.print(k);
}
}
요즘 세상에 이걸 손으로 세고 있다니, 린터나 정적 분석 도구는 장식인가요?
다음 그림에서 Fan-in 개수가 2 이상인 모듈은?
graph TD
A --> B
A --> C
A --> D
B --> E
B --> F
C --> F
D --> F
E --> G
F --> H
G --> H
집합의 순서가 보장되지 않는다는 점을 굳이 이렇게 테스트해야 하나 싶다.
다음 파이썬 코드의 출력 결과를 쓰시오.
a = {'일본', '중국', '한국'}
a.add('베트남')
a.add('일본')
a.update({'홍콩', '한국', '태국'})
print(a)
이런 표 암기 문제는 실무에서 '이게 정적 분석인가요?'라고 묻는 사람이 없다는 점에서 전형적인 시험용 문제다.
애플리케이션을 실행하지 않고, 소스 코드에 대한 코딩 표준, 코딩 스타일, 코드 복잡도 및 남은 결함을 발견하기 위해 사용하는 도구는 무엇인지 쓰시오.
안드로이드 정의를 묻는 건 정보처리기사 시험의 모바일 분야 단골 문제다.
리눅스 운영체제 위에서 구동하며 휴대폰 전화를 비롯한 응용 장치를 위한 운영체제의 미들웨어, 사용자 인터페이스, 그리고 표준 응용프로그램(웹 브라우저 등) 등을 포함하고 있는 소프트웨어 스택이자 리눅스 모바일 운영체제로 개발되었고, 컴파일된 바이트 코드를 구동할 수 있는 런타임 라이브러리를 제공하는 운영체제는 무엇인지 쓰시오.
이런 순서 암기는 실무에서 아무런 의미가 없다.
다음은 데이터 모델링 절차이다. 순서에 맞도록 [보기]에서 고르시오.
요구사항 분석 > ( ① ) > ( ② ) > ( ③ )
[보기]
초기값을 0으로 설정해놓고 결과를 묻는 건 낚시 문제인가, 아니면 기초 확인인가?
다음은 C언어 소스 코드이다. 출력 결과를 쓰시오.
#include <stdio.h>
void main() {
int i=0, c=0; // ①
while (i < 10) { // ②
i++; // ③
c *= i; // ④
}
printf("%d", c); // ⑤
}
서술형 문제의 정석, 키워드만 맞으면 점수를 주는 채점 기준이 뻔히 보이는 문제.
형상 통제 개념을 설명하시오(약술형).
손으로 경로를 따라가며 번호를 적는 것이 무슨 의미가 있는지 의문이다.
아래 제어 흐름 그래프가 분기 커버리지를 만족하기 위한 테스팅 순서를 쓰시오.
코드 흐름을 억지로 꼬아놓은 전형적인 시험용 문제다.
다음 C언어 소스 코드의 출력 결과를 쓰시오.
#include <stdio.h>
int r10() {
return 4;
}
int r100() {
return (30 + r10());
}
int r1000() {
return (200 + r100());
}
int main() {
printf("%d", r1000());
return 0;
}
그림만 보고 이름을 맞추라는 건 전형적인 암기식 평가다.
다음 그림에 해당하는 다이어그램은 무엇인가?
Java로 굳이 이런 로직을 직접 짜는 경우는 드물지만, 기초 알고리즘 연습으로는 나쁘지 않다.
다음은 n이 10일 때, 10을 2진수로 변환하는 Java 소스 코드이다. (1), (2)에 알맞은 값을 적으시오.
class good {
public static void main(String[] args) {
int[] a = new int[8];
int i = 0;
int n = 10;
while ( (1) ) {
a[i++] = ( (2) ) ;
n /= 2;
}
for (i = 7; i >= 0; i--) {
System.out.print(a[i]);
}
}
}
가독성 떨어지는 코드를 해석하게 만드는 전형적인 시험용 문제.
다음은 Java 소스 코드이다. 출력 결과를 보고 (1), (2)에 알맞은 값을 적으시오.
[출력 결과] 1 4 7 10 13 2 5 8 11 14 3 6 9 12 15
public class good {
public static void main(String[] args) {
int[][] a = new int[ (1) ][ (2) ];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
a[i][j] = j * 3 + (i + 1);
System.out.print(a[i][j] + " ");;
}
System.out.println();
}
}
}
블록체인 유행할 때 급하게 넣은 문제 같은 느낌이 강하게 듭니다.
온라인 금융 거래 정보를 블록으로 연결하여 피어투피어(P2P) 네트워크, 분산 환경에서 개인 디지털 장비에 분산 저장시켜 공동으로 관리하는 방식을 무엇이라고 하는가?
프레임워크 이름 맞추기 문제는 실무 능력 평가와는 거리가 멀어 보입니다.
분산환경에서 비 정형 데이터를 저장하고, 처리할 수 있는 자바 기반의 오픈 소스 프레임워크이며, 구글 맵 리듀스를 대체하는 것은 무엇인지 쓰시오.
C언어의 포인터 개념을 테스트하려는 의도는 알겠으나, 실무에서 이렇게 코딩하면 바로 코드 리뷰 탈락입니다.
다음 C언어 소스 코드이다. 출력 결과를 쓰시오.
#include <stdio.h>
int main() {
char *p = "KOREA";
printf("%s\n", p); // ①
printf("%s\n", p+3); // ②
printf("%c\n", *p); // ③
printf("%c\n", *(p+3)); // ④
printf("%c\n", *p+3); // ⑤
printf("%s\n", p+2); // ⑥
}
요즘 누가 RARP를 쓰나요? DHCP가 다 알아서 하는데 박물관에서나 볼 법한 기술입니다.
물리 네트워크(MAC) 주소에 해당하는 IP 주소를 알려주는 프로토콜로, 역순 주소 결정 프로토콜을 무엇이라 하는지 쓰시오.
정규화의 목적을 이해하는 게 중요하지, 이런 표를 외우는 게 무슨 의미가 있나?
정규화된 엔티티, 속성, 관계에 대해 성능 향상과 개발 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 무엇이라 하는지 쓰시오.
이런 용어 정의를 묻는 건 전형적인 자격증 시험 스타일이다.
공유메모리, 소켓, 세마포어, 메시지 큐 등 프로세스 간 통신을 하는 기술을 무엇이라 하는지 쓰시오.
용어 하나 외우게 하려고 문제를 길게도 썼다.
시스템 통합에 사용되는 솔루션으로 구축 유형에는 Point to Point, Hub & Spoke, Message Bus가 있다. 기업에서 운영되는 서로 다른 플랫폼 및 애플리케이션 간의 정보를 전달, 연계, 통합이 가능하도록 해주는 솔루션을 무엇이라고 하는지 쓰시오.
포인터 연산으로 장난치는 전형적인 시험용 코드다.
다음 C언어 프로그램의 실행 결과를 쓰시오.
#include <stdio.h>
struct good {
char name[10];
int age;
};
void main() {
struct good s[] = {"Kim", 28, "Lee", 38, "Seo", 50, "Park", 35};
struct good *p;
p = s;
p++;
printf("%s\n", p->name);
printf("%d\n", p->age);
}
보안 이론은 실무에서 정책 수립 시에나 쓰이지, 개발자가 매일 고민하는 영역은 아니다.
시스템 자원의 접근을 개인 또는 그룹의 식별자에 기반을 둔 방법으로, 어떤 종류의 접근 권한을 가진 사용자가 다른 사용자에게 자신의 판단에 따라 권한을 허용하는 접근 제어 방식을 쓰시오.
이런 용어 구분은 실무에서 10년 차도 가끔 헷갈리는데, 시험 문제로 내는 건 좀 너무하지 않나?
다음 ①, ②에 알맞은 답안을 쓰시오.
① 사용자가 어떤 시스템, 제품, 서비스를 직·간접적으로 이용하면서 느끼고 생각하게 되는 지각과 반응, 행동 등의 총체적 경험을 뜻한다. ② 사용자와 컴퓨터 상호 간의 소통을 원활히 하게 도와주는 장치 또는 소프트웨어이다. 예로는 CLI가 있다.
이런 스펙 암기는 구글링 한 번이면 해결되는데 왜 시험에 내는지 의문이다.
2001년 미국 국립기술연구소(NIST)에서 발표한 개인 키 암호화 알고리즘이다. DES를 대체하며, 128, 192, 256 비트의 암호화/복호화 키를 이용하여 128비트의 블록을 암호화, 복호화하는 대칭키 암호화 방식은?
이론적인 구분은 명확하지만, 실제 패킷 스위칭 환경은 훨씬 복잡합니다.
패킷교환 방식 중에서 각 번호에 해당하는 방식을 쓰시오.
① 목적지 호스트와 미리 연결한 후, 통신하는 연결형 교환 방식 ② 헤더에 붙어서 개별적으로 전달하는 비연결형 교환 방식
C언어 시험 문제의 고질병인 '가독성 파괴 코드'의 전형이다.
다음은 C언어 문제이다. 출력값을 작성하시오.
#include <stdio.h>
int main() {
int ary[3];
int s = 0;
*(ary+0) = 1; // ①
ary[1] = *(ary+0) + 2; // ②
ary[2] = *ary+3; // ③
for (int i=0; i<3; i++) { // ④
s = s + ary[i]; // ⑤
}
printf("%d", s); // ⑥
return 0;
}
결합도 종류 6가지를 달달 외우게 하는 전형적인 암기형 문제.
다음은 Coupling에 대한 설명이다. 설명에 대한 Coupling 종류를 영문으로 작성하시오.
어떤 모듈이 다른 모듈의 내부 논리 조직을 제어하기 위해 목적으로서 제어 신호를 이용하여 통신하는 경우의 결합도. 하위 모듈에서 상위 모듈로 제어 신호가 이동하여 상위 모듈에게 처리 명령을 부여하는 권리 전도 현상이 발생한다.
이론 공부용으로는 좋지만, 실무에서 누가 '이거 6계층 기능이야'라고 말하며 일하나요?
OSI 7 Layer의 설명에 해당하는 답을 작성하시오.
테스트 케이스를 이렇게 표로만 배우면 실제 QA 할 때 당황하기 십상입니다.
다음 테스트케이스의 구성요소에 대한 설명이다. 괄호 안에 들어갈 알맞은 답을 [보기]에서 고르시오.
| 식별자 ID | 테스트 항목 | ( ① ) | ( ② ) | ( ③ ) |
|---|---|---|---|---|
| DS-45S-21 | 로그인 기능 | 사용자 화면 | 사용자 아이디(Test11) | 성공 |
| DS-45S-25 | 로그인 기능 | 사용자 화면 | 사용자 아이디(Test11), 비밀번호(***) | 실패 |
[보기] 테스트 조건, 테스트 데이터, 테스트 환경, 테스트 유형, 성공/실패 기준
C언어의 포인터 개념을 테스트하기 위해 억지로 꼬아놓은 전형적인 시험용 코드입니다.
다음 C언어에 대한 문제이다. 알맞은 출력값을 작성하시오.
#include <stdio.h>
int main() {
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
printf("%d\n", *arr[1] + **arr + 1);
}
용어의 정의를 묻는 전형적인 암기형 문제입니다.
괄호 안에 들어갈 알맞은 답을 작성하시오.
( ) 다이어그램은 문제 해결을 위한 도메인 구조를 나타내어 보이지 않는 도메인 안의 개념과 같은 추상적인 개념을 기술하기 위해 나타낸 것이다. ( ) 다이어그램은 공통의 속성과 책임을 갖는 객체들의 집합으로 각 객체들이 가지는 속성과 메서드를 포함하는 다이어그램이다. 또한 소프트웨어의 설계 혹은 완성된 소프트웨어의 구현 설명을 목적으로 사용할 수 있다.
패턴의 이름과 목적을 매칭하는 암기 위주의 문제입니다.
괄호 안에 들어갈 알맞은 용어를 [보기]에서 고르시오.
( ) 패턴은 객체 생성과 관련된 패턴이다. ( ) 패턴은 부모(상위) 클래스에서 객체 생성 인터페이스를 정의하고, 자식(하위) 클래스에서 인스턴스를 생성하도록 하는 패턴이다.
[보기] Abstract Factory, Factory Method, Composite, Proxy, Template Method, Observer
Abstract Factory, Factory Method, Composite, Proxy, Template Method, Observer
포인터 연산으로 퀴즈를 내는 건 C언어의 본질을 흐리는 전형적인 시험용 문제다.
다음 C언어 코드의 출력 결과를 쓰시오.
#include <stdio.h>
struct jsu {
char name[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);
}
이런 표 암기 문제는 실무자가 RAID 컨트롤러 설정할 때 매뉴얼 한 번 보면 끝나는 일인데 굳이 외우게 하네요.
다음 설명에 맞는 RAID 단계를 숫자로 작성하시오.
이런 메서드 이름 암기 문제는 실무 능력과는 거리가 멀다.
다음 설명과 관련된 답을 골라 작성하시오.
① extend ② pop ③ reverse
이런 용어 암기는 실무에서 '자연스러운 인터페이스'라고 말하면 다 통한다.
다음 설명에 대한 답을 영어 약자로 작성하시오.
키보드나 마우스와 같은 하드웨어 없이 말이나 행동 그리고 감정과 같은 인간의 자연스러운 표현을 인식하여 컴퓨터를 제어할 수 있는 환경
재귀 함수를 이렇게 짜면 동료들에게 욕먹기 딱 좋다. 시험을 위한 코드일 뿐.
다음 소스코드에서 입력값이 5가 들어왔을 때 출력되는 값을 작성하시오.
#include <stdio.h>
int func(int a) {
if (a <= 1) return 1;
return a * func(a - 1);
}
int main() {
int a;
scanf("%d", &a);
printf("%d", func(a));
}
이론적인 정의를 묻는 문제라 실무적인 감각과는 거리가 멀다.
괄호 안에 들어가는 알맞은 답을 보기에서 선택하여 작성하시오.
[보기] 참조성, 무결성, 유일성, 최소성
13195의 소수를 구하는 코드를 직접 짜게 하는 건 좀 가혹하다.
다음 소스코드가 실행될 때의 출력값을 작성하시오.
#include <stdio.h>
int isPrime(int number) {
for (i = 2; i < number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
int main() {
int number = 13195, max_div = 0, i;
for (i = 2; i < number; i++) {
if (isPrime(i) == 1 && number % i == 0)
max_div = i;
}
printf("%d", max_div);
return 0;
}
데이터베이스 이론의 고전적인 분류 문제인데, 실무자에게는 '그래서 이게 SQL 튜닝에 어떻게 도움 되는데?'라는 질문이 먼저 나온다.
다음은 관계 데이터 모델에 대한 설명이다. 괄호 안에 들어가는 용어를 작성하시오.
NULL 처리를 묻는 건 좋지만, 이런 표를 일일이 손으로 추적하게 만드는 건 전형적인 시험용 문제다.
다음 SQL 결과에 알맞은 답을 작성하시오.
| INDEX | COL1 | COL2 |
|---|---|---|
| 1 | 2 | null |
| 2 | 3 | 6 |
| 3 | 5 | 5 |
| 4 | 6 | 3 |
| 5 | 3 | 3 |
SELECT count(col2)
FROM TABLE
WHERE col1 IN (2, 3) OR col2 IN (3, 5);
실무에서는 절대 이렇게 짜지 말라고 가르치는 코드를 시험 문제로 내는 아이러니.
다음 Java 코드에 알맞은 출력값을 작성하시오.
public static void main(String args[]) {
int i = 3;
int k = 1;
switch(i) {
case 1: k++;
case 2: k++;
case 3: k = 0;
case 4: k += 3;
case 5: k -= 1;
default: k--;
}
System.out.print(k);
}
이론적인 라우팅 프로토콜 분류를 묻는 문제로, 실무에서는 설정값 확인이 중요하지 정의를 외우는 건 의미가 없다.
다음 설명에 대해 [보기]에서 주어진 답을 골라 각각 작성하시오.
[보기]
① 라우터 상호 접속이 되어 있는 여러 개의 네트워크 집합이다. 같은 도메인 내에 존재하는 라우터로 도메인 내부 경로 설정을 가리킨다. 하나의 AS(Autonomous System) 내에서의 라우팅에 사용되는 프로토콜이다. ② 자율 시스템(AS; Autonomous System) 간의 라우팅, 즉 게이트웨이 간의 라우팅에 사용되는 프로토콜이다. ③ IP 라우팅 프로토콜의 한 종류로서 링크상태 라우팅 프로토콜에 기초하여, 자시 시스템(AS) 내부의 라우터들끼리(IGP) 라우팅 정보를 교환하는 라우팅 프로토콜이다. RIP에 비해 자세한 제어가 가능하고, 관리 복잡도가 높을 수 있다. ④ 서로 다른 자율 시스템(AS)의 라우터 간에 라우팅 정보를 교환하는 데 사용되는 외부 게이트웨이 프로토콜(EGP)이다. 각 목적지에 대한 전체 경로가 포함되며, 다른 시스템과 교환하는 네트워크 도달 가능성 정보의 데이터베이스를 유지한다. 네트워크 도달 가능성 정보를 사용하여 AS 연결 그래프를 구성하며, 이를 통해 라우팅 루프를 제거하고 AS 수준에서 정책 결정을 실행할 수 있다.
이런 수치 계산은 정적 분석 도구가 다 해주는데 왜 사람이 직접 세고 있어야 하는지 의문이다.
다음 모듈에 대한 Fan-in과 Fan-out을 작성하시오.
기호 암기 문제는 실무 능력과 큰 상관이 없는데 왜 자꾸 내는지 모르겠다.
다음 예시를 보고 관계 대수에 대한 기호를 쓰시오.
| 항목 | 기호 |
|---|---|
| 합집합 | ∪ |
| 차집합 | - |
| 카티션 프로덕트 | × |
| 프로젝트 | π |
| 조인 | ⋈ |
이런 계산은 IP 계산기를 쓰는 게 정신 건강에 이롭다.
첫 번째 네트워크 주소가 192.168.1.0/26일 때 FLSM 방식으로 분할했을 때 두 번째 네트워크 브로드캐스트 IP를 10진수로 변환한 값을 쓰시오.
보안 용어 사전도 아니고, 이런 걸 일일이 외우게 하는 건 전형적인 시험용 공부다.
다음 설명에 알맞은 답을 작성하시오.
( ㉠ )은 기술적인 방법이 아닌 사람들의 심리와 행동 양식을 교묘하게 이용해 원하는 사람을 속여 정보를 얻는 기법이다.
C언어의 기초적인 제어 흐름을 묻는 문제인데, 코드가 다소 지저분하다.
다음 코드에 대한 출력값을 작성하시오.
#include <stdio.h>
int main() {
int n;
int k;
int s;
int el = 0;
for(n = 6; n < 30; n++) {
s = 0;
k = n / 2;
for(int j = 1; j <= k; j++) {
if(n % j == 0) {
s = s + j;
}
}
if(s == n) {
el++;
}
}
printf("%d", el);
return 0;
}
이론적인 스케줄링 분류를 묻는 전형적인 시험용 문제다.
다음은 스케줄링에 관한 내용이다. 괄호 안에 알맞은 답을 순서대로 작성하시오.
| 설명 | 스케줄링 |
|---|---|
| Ready Queue에 있는 프로세스 중 CPU 처리 시간이 짧은 순서대로 CPU를 할당하는 비선점 방식이며, 늦게 도착하더라도 CPU 처리 시간이 짧은 경우 프로세스보다 빨리 CPU를 할당받을 수 있다. | ( ㉠ ) 스케줄링 |
| 프로세스가 도착한 순서대로 프로세스를 디스패치하지만, 시간 할당량을 매번 프로세스에 주고 할당된 시간 안에 완료하지 못하면 프로세스는 준비큐의 맨 뒤에 배치되도록 하여 CPU를 독점하지 못하게 공유할 수 있게 한다. | ( ㉡ ) 스케줄링 |
| 선점 스케줄링 방식으로 변경한 기법이다. CPU를 점유 중인 프로세스보다 남은 CPU 처리 시간이 짧은 프로세스가 Ready Queue에 들어올 경우 새로 들어오는 프로세스가 vCPU를 점유할 수 있다. | ( ㉢ ) 스케줄링 |
C언어 시험의 단골 손님인 포인터 장난질. 실무에서 이렇게 짜면 사수한테 혼난다.
다음 C 언어의 출력값을 작성하시오.
#include <stdio.h>
int main() {
char a[] = "Art"; // 1
char *p = NULL; // 2
p = a;
printf("%s\n", a); // 3
printf("%s\n", p); // 4
printf("%s\n", a + 1); // 5
printf("%s\n", p + 1); // 6
printf("%c\n", a[1]); // 7
}
C언어의 포인터와 배열을 섞어놓은 전형적인 시험용 코드.
다음 C 언어의 출력값을 작성하시오.
#include <stdio.h>
int main() {
char *a = "qwer"; // 1
char *b = "qwtety"; // 2
for(int i = 0; a[i] != '\0'; i++) { // 3
for(int j = 0; b[j] != '\0'; j++) { // 4
if(a[i] == b[j]) printf("%c", a[i]); // 5
}
}
}
보안 프로토콜의 역사적 계보를 묻는 문제인데, 요즘은 IPsec이나 SSL VPN이 대세라 굳이 L2TP를 따로 외우는 게 의미가 있나 싶다.
아래 내용에 해당하는 프로토콜은 무엇인지 작성하시오.
디자인 패턴의 정의를 달달 외우게 하는 건 전형적인 자격증 시험 스타일이다.
다음은 디자인 패턴에 관한 설명이다. 설명에 알맞은 답은 무엇인가?
이론적 정의를 묻는 전형적인 암기형 문제로, 실무에서는 그냥 'DB 설계'라고 부른다.
다음은 스키마와 관련된 내용이다. 각 괄호 안에 알맞은 답을 작성하시오.
(1) ( ㉠ ) 스키마
(2) ( ㉡ ) 스키마
(3) ( ㉢ ) 스키마
break를 일부러 빼서 흐름을 제어하는 코드는 가독성을 해치므로 실무에서는 지양해야 합니다.
다음 C 코드의 실행 결과를 쓰시오.
#include <stdio.h>
void main() {
int n[] = {73, 95, 82};
int sum = 0;
for(int i=0; i<3; i++) {
sum += n[i];
}
switch(sum / 30) {
case 10:
case 9:
printf("A");
case 8:
printf("B");
case 7:
case 6:
printf("C");
default:
printf("D");
}
}
용어 자체를 묻는 문제라 실무자보다는 보안 자격증 준비생에게 더 익숙할 듯하다.
다음 내용에 알맞은 답을 작성하시오.
이런 코드를 직접 짜는 시대는 지났지만, 포인터 연산 이해도를 측정하기엔 적절한 문제.
다음은 C언어 문제이다. 알맞은 출력값을 작성하시오.
#include <stdio.h>
#define MAX_SIZE 10
int isWhat[MAX_SIZE];
int point = -1;
int isEmpty() {
if (point == -1) return 1;
return 0;
}
void into(int num) {
if (point >= 10) printf("Full");
else isWhat[++point] = num;
}
int take() {
if (isEmpty() == 1) printf("Empty");
else return isWhat[point--];
return 0;
}
int main(int argc, const char *argv[]) {
into(5);
into(2);
while(!isEmpty()) {
printf("%d", take());
into(4);
into(1);
printf("%d", take());
into(3);
printf("%d", take());
printf("%d", take());
into(6);
printf("%d", take());
printf("%d", take());
}
return 0;
}
요-개-논-물-구. 순서 외우기 문제지만 실제 설계를 해본 사람에게는 자연스러운 흐름이다.
데이터베이스 설계 순서에 관한 내용이다. [보기]를 이용하여 괄호 안에 알맞은 내용을 작성하시오.
A ( ) -> B ( ) -> C ( ) -> D ( ) - E ( )
[보기] 구현, 요구조건 분석, 개념적 설계, 물리적 설계, 논리적 설계
이런 단순 분류 문제는 정보처리기사 단골 손님인데, 실무에서는 라이브러리가 알아서 해주니 이름만 알면 된다.
[보기]의 암호화 알고리즘을 대칭키와 비대칭키로 나누시오.
[보기] DES, RSA, AES, ECC, ARIA, SEED
SQL 문법 암기 문제. 실무에서는 GUI 툴로 삭제하는 경우가 많지만, DBA라면 알아야 한다.
다음 [보기]의 SQL문에서 괄호 안에 알맞은 단어를 작성하시오.
DROP VIEW 학생 ( )
용어 정의를 묻는 전형적인 암기형 문제로, 실무에서는 그냥 'Mocking'이나 'Test Double'이라고 퉁쳐서 부르는 경우가 많다.
다음 설명에 대한 알맞은 답을 작성하시오.
① ( )
② ( )
문법을 아는지 확인하는 용도 외에는 큰 의미가 없는 문제.
C언어에서 구조체의 멤버에 접근하기 위해 괄호 안에 들어갈 기호를 작성하시오.
// 구조체 변수 접근 시
struct_var.member;
// 구조체 포인터 접근 시
struct_ptr( 1 )member;
보안 기사 시험도 아닌데 용어 정의를 이렇게 빡빡하게 외우게 하는 건 좀 구시대적입니다.
다음 설명은 서버 접근 통제의 유형이다. 괄호 안에 들어갈 용어를 작성하시오. (영어 약자로 작성하시오)
포인터 주소 연산으로 문자열을 쪼개는 건 실무에서 절대 하지 말아야 할 코드 스타일입니다.
다음 C언어의 포인터 문제이다. 알맞은 출력값을 작성하시오.
#include <stdio.h>
int main() {
char *p = "KOREA";
printf("%s\n", p);
printf("%s\n", p + 1);
printf("%s\n", p + 3);
printf("%c\n", *(p + 3));
printf("%c\n", *(p + 4));
return 0;
}
재귀와 상속을 한 번에 꼬아놓은 전형적인 '시험용' 코드다.
다음 Java 코드에 대한 알맞은 출력값을 작성하시오.
class Parent {
int compute(int num) {
if(num <= 1)
return num;
return compute(num - 1) + compute(num - 2);
}
}
class Child extends Parent {
int compute(int num) {
if(num <= 1)
return num;
return compute(num - 1) + compute(num - 3);
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
System.out.print(obj.compute(7));
}
}
이론적인 정의를 묻는 전형적인 자격증용 문제다.
다음 설명에 알맞은 답을 보기에서 골라 작성하시오.
[보기] ㄱ. Equivalence Partitioning ㄴ. Statement Coverage ㄷ. Boundary Value Analysis ㄹ. Branch Coverage ㅁ. Error Guessing ㅂ. Condition Coverage ㅅ. Cause Effect Graph
왜 아직도 RIP을 가르치는지 의문이다. OSPF나 BGP를 물어보는 게 낫지 않나?
다음은 프로토콜 종류에 관한 설명이다. 알맞은 답을 작성하시오.
IP 계산 문제를 손으로 풀게 하는 건 네트워크 기초를 다지라는 뜻이겠지만, 실무에선 계산기 두드리는 게 정신건강에 이롭다.
다음 [보기]의 네트워크에서 라우터를 통해 할당 가능한 4번, 5번의 IP를 작성하시오.
[보기]
용어 설명 문제는 정보처리기사의 단골 손님인데, 매번 똑같은 정의를 묻는 게 지겹지도 않은가.
다음에서 설명하는 네트워크 용어를 영문 약자로 쓰시오.
코드의 가독성을 해치는 전형적인 시험용 꼬아내기 문제입니다.
아래 JAVA 언어 코드의 실행 순서를 중복 없이 작성하시오.
실행순서: 5 > () > () > () > () > ()
class Parent {
int x, y;
Parent(int x, int y) { // ①
this.x = x;
this.y = y;
}
int getT() { // ②
return x * y;
}
}
class Child extends Parent {
int x;
Child(int x) { // ③
super(x + 1, x);
this.x = x;
}
int getT(int n) { // ④
return super.getT() + n;
}
}
class Main {
public static void main(String[] args) { // ⑤
Parent parent = new Child(3); // ⑥
System.out.println(parent.getT()); // ⑦
}
}
파이썬의 슬라이싱 문법을 테스트하려는 의도는 알겠으나, 코드가 너무 작위적이다.
다음 Python에 대한 문제이다. 아래 코드를 읽고 알맞은 출력 값을 작성하시오.
def fnCalculation(x,y):
result = 0
for i in range(len(x)):
temp = x[i:i + len(y)]
if temp == y:
result += 1
return result
a = "abdcabcabca"
p1 = "ab"
p2 = "ca"
out = f"ab{fnCalculation(a,p1)}ca{fnCalculation(a,p2)}"
print(out)
이런 암기형 문제는 정보처리기사 시험의 고질적인 특징이다.
다음은 설명하는 내용을 확인하여 알맞은 알고리즘을 작성하시오.
이런 식의 포인터 연산 문제는 실무에서 가독성을 해치는 주범이다. 시험을 위한 문제일 뿐.
다음 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
int main() {
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *parr = arr[1];
printf("%d", *(parr + 1) + *(parr + 2));
return 0;
}
이론적인 용어 정의를 묻는 전형적인 시험 문제로, 실무에서는 '의존성 관리'라는 말로 퉁친다.
다음은 소프트웨어 설계에 대한 내용이다. 내용을 읽고 괄호 안에 알맞은 답을 작성하시오.
( ) Coupling
포인터 화살표 연산자(`->`)를 제대로 이해하고 있는지 묻는 전형적인 문제.
다음 C언어 구조체에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
#include <stdio.h>
struct node {
int ni;
struct node *n2;
};
int main() {
struct node a = {10, NULL};
struct node b = {20, NULL};
struct node c = {30, NULL};
struct node *head = &a;
a.n2 = &b;
b.n2 = &c;
printf("%d", head->n2->ni);
return 0;
}
코드 가독성을 해치는 이런 문제는 실무에서 코드 리뷰 시 즉시 수정 대상이다.
다음 C언어에 대한 문제이다. 아래 코드를 확인하여 출력값을 작성하시오.
#include <stdio.h>
int func() {
static int x = 0;
x += 2;
return x;
}
int main() {
int x = 1;
int sum = 0;
sum += func(); // ①
sum += func(); // ②
printf("%d", sum);
return 0;
}
이런 걸 굳이 번호로 쪼개서 외우게 하는 게 무슨 의미가 있나 싶다.
다음은 URL 구조에 관한 문제이다. 아래 [보기]의 순서대로 URL에 해당하는 번호를 작성하시오.
hks://localhost:8080/learning/english?courses-toeic#grammar
(1) hks: (2) localhost:8080 (3) learning/english (4) ?courses-toeic (5) #grammar
[보기]
이런 코드를 짜는 사람이 있다면 즉시 코드 리뷰에서 반려하고 면담을 요청해야 한다.
다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
Base a = new Derivate();
Derivate b = new Derivate();
System.out.print(
a.getX()
+ a.x
+ b.getX()
+ b.x
);
}
}
class Base {
int x = 3;
int getX() {
return x * 2;
}
}
class Derivate extends Base {
int x = 7;
int getX() {
return x * 3;
}
}
포인터로 노드 값을 바꾸는 로직을 직접 짜는 건 교육용 예제일 뿐, 실제로는 가독성 좋은 코드를 짜는 게 우선이다.
다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
struct Node {
int value;
struct Node* next;
};
void func(struct Node* node) {
while(node != NULL && node->next != NULL) {
int t = node->value;
node->value = node->next->value;
node->next->value = t;
node = node->next->next;
}
}
int main() {
struct Node n1 = {1, NULL};
struct Node n2 = {2, NULL};
struct Node n3 = {3, NULL};
n1.next = &n3;
n3.next = &n2;
func(&n1);
struct Node* current = &n1;
while(current != NULL) {
printf("%d", current->value);
current = current->next;
}
return 0;
}
C언어의 포인터 장난질은 이제 그만 보고 싶네요. 실무에서 이렇게 짜면 바로 코드 리뷰 반려입니다.
다음 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
void func(int** arr, int size) {
for(int i = 0; i < size; i++){
*(*arr + i) = (*(*arr + i) + i) % size;
}
}
int main() {
int arr[] = {3, 1, 4, 1, 5};
int *p = arr;
int **pp = &p;
func(pp, 5);
num = arr[2];
printf("%d", num);
return 0;
}
손으로 CRC 계산을 시키는 건 수학 시험인지 정보처리기사 시험인지 헷갈리게 한다.
아래 괄호 안의 용어를 영문 약어로 작성하시오.
용어의 정의를 묻는 전형적인 암기형 문제입니다.
다음은 데이터베이스와 관련된 설명이다. 알맞은 용어를 [보기]에서 골라 괄호를 작성하시오.
[보기] ㄱ. domain ㄴ. primary ㄷ. degree ㄹ. candidate ㅁ. cardinality ㅂ. attribute
C언어의 포인터 개념을 테스트하는 건 좋지만, 이런 식의 코드 트레이싱은 실무 코드 리뷰에서 당장 수정 대상입니다.
다음은 C언어에 대한 문제입니다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
char Data[5] = {'B', 'A', 'D', 'E'};
char c;
int main() {
int i, temp, temp2;
c = 'C';
printf("%d\n", Data[3] - Data[1]);
for(i = 0; i < 5; ++i) {
if(Data[i] > c) {
break;
}
}
temp = Data[i];
Data[i] = c;
i++;
for(; i < 5; ++i) {
temp2 = Data[i];
Data[i] = temp;
temp = temp2;
}
for(i = 0; i < 5; i++) {
printf("%c", Data[i]);
}
}
상속과 정적 변수를 이렇게 섞어 쓰는 코드는 실무에서 당장 리팩토링 대상이다.
다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
new Child();
System.out.println(Parent.total);
}
}
class Parent {
static int total = 0;
int v = 1;
public Parent() {
total += (++v);
show();
}
public void show() {
total += total;
}
}
class Child extends Parent {
int v = 10;
public Child() {
v += 2;
total += v++;
show();
}
@Override
public void show() {
total += total * 2;
}
}
테스트 커버리지 개념을 묻는 건 좋으나, 손으로 순서를 적게 하는 건 좀 구식이다.
문장(Statement) 커버리지 테스트를 수행하려고 한다. 코드 아래의 제어 흐름도 빈칸에 연결되도록 작성하고, 문장 커버리지 순서대로 작성하시오.
int func(int arr[], int len, int init) {
int i = 0;
while (i < len && arr[i] < init) {
if (arr[i] < 0) {
arr[i] = -arr[i];
}
i++;
}
return i;
}
[제어 흐름도] 1: int i=0 2: while (i < len && arr[i] < init) 3: if (arr[i] < 0) 4: arr[i] = -arr[i] 5: i++ 6: return i
파이썬의 리스트와 클래스를 이용해 굳이 어렵게 꼬아놓은 트리 탐색 문제다.
다음은 파이썬에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
class Node:
def __init__(self, value):
self.value = value
self.children = []
def tree(li):
nodes = [Node(i) for i in li]
for i in range(1, len(li)):
nodes[(i - 1) // 2].children.append(nodes[i])
return nodes[0]
def calc(node, level=0):
if node is None:
return 0
return node.value if level % 2 == 1 else 0 + sum([calc(n, level + 1) for n in node.children])
li = [3, 5, 8, 12, 15, 18, 21]
root = tree(li)
print(calc(root))
포인터로 장난치는 전형적인 시험용 코드, 실무에서는 STL이나 라이브러리 쓰세요.
다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
typedef struct Data {
int value;
struct Data *next;
} Data;
Data* insert(Data* head, int value) {
Data* new_node = (Data*)malloc(sizeof(Data));
new_node->value = value;
new_node->next = head;
return new_node;
}
Data* reconnect(Data* head, int value) {
Data *prev = NULL, *curr = head;
while (curr != NULL && curr->value != value) {
prev = curr;
curr = curr->next;
}
if (curr == NULL || prev == NULL) return head;
prev->next = curr->next;
curr->next = head;
head = curr;
return head;
}
int main() {
Data *head = NULL, *curr;
for (int i = 1; i <= 5; i++)
head = insert(head, i);
head = reconnect(head, 3);
for (curr = head; curr != NULL; curr = curr->next)
printf("%d", curr->value);
return 0;
}
파일 구조론은 고전적인 이론이라 시험 문제로 내기 딱 좋지만, 실무에서는 DB 엔진이 알아서 다 해준다.
다음은 파일 구조와 관련된 설명이다. 설명을 읽고, 괄호 안에 들어갈 가장 적절한 용어를 쓰시오.
코드 트레이싱 문제의 전형적인 함정 파기입니다.
다음은 Java의 문제이다. 아래 코드를 보고 알맞은 출력값을 작성하시오.
public class Main {
public static void change(String[] data, String s) {
data[0] = s; // ④
s = "Z"; // ⑤
}
public static void main(String[] args) {
String data[] = {"A"}; // ①
String s = "B"; // ②
change(data, s); // ③
System.out.print(data[0] + s); // ⑥
}
}
코드 가독성을 해치는 이런 예외 처리 방식은 실무 코드 리뷰에서 바로 반려 대상이다.
다음 Java 언어의 문제이다. 아래 코드를 보고 알맞은 출력값을 작성하시오.
public class Main {
static interface F {
int apply(int x) throws Exception;
}
public static int run(F f) {
try {
return f.apply(3);
} catch (Exception e) {
return 7;
}
}
public static void main(String[] args) {
F f = (x) -> {
if (x > 2) {
throw new Exception();
}
return x * 2;
};
System.out.print(run(f) + run((int n) -> n + 9));
}
}
이런 문제는 언어의 동작 원리를 이해하는 데는 도움이 되지만, 실제 현업에서 이렇게 코드를 짜면 동료들에게 욕먹기 딱 좋다.
다음 Java 언어의 문제이다. 아래 코드를 보고 알맞은 출력값을 작성하시오.
public class Main {
public static class Parent {
public int x(int i) { return i + 2; }
public static String id() { return "P"; }
}
public static class Child extends Parent {
public int x(int i) { return i + 3; }
public String x(String s) { return s + "R"; }
public static String id() { return "C"; }
}
public static void main(String[] args) {
Parent ref = new Child();
System.out.println(ref.x(2) + ref.id());
}
}
C언어 포인터와 나머지 연산자를 이용한 인덱스 계산은 언제 봐도 피로하다.
다음 C언어의 문제이다. 아래 코드를 보고 알맞은 출력 값을 작성하시오.
#include <stdio.h>
#define SIZE 3
typedef struct {
int a[SIZE];
int front;
int rear;
} Queue;
void enq(Queue* q, int val) {
q->a[q->rear] = val;
q->rear = (q->rear + 1) % SIZE;
}
int deq(Queue* q) {
int val = q->a[q->front];
q->front = (q->front + 1) % SIZE;
return val;
}
int main() {
Queue q = {{0, 0, 0}, 0, 0};
enq(&q, 1); enq(&q, 2); deq(&q); enq(&q, 3);
int first = deq(&q);
int second = deq(&q);
printf("%d 그리고 %d", first, second);
return 0;
}
C언어의 포인터 문법을 꼬아놓은 전형적인 시험용 문제입니다. 실무에서 이렇게 짜면 사수에게 혼납니다.
다음은 C언어의 문제이다. 아래 코드를 보고 알맞은 출력을 작성하시오.
#include <stdio.h>
struct dat {
int x;
int y;
};
int main() {
struct dat a[] = {{1, 2}, {3, 4}, {5, 6}};
struct dat *pptr = a;
printf("%d 그리고 %d", a[1].x, a[1].y);
return 0;
}
C언어 포인터 문제의 전형적인 '꼬아내기' 스타일입니다. 실무에서는 이런 코드보다 안전한 메모리 관리가 훨씬 중요합니다.
다음은 C언어의 문제이다. 아래 코드를 보고 알맞은 출력값을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
struct node {
char c;
struct node* p;
};
struct node* func(char* s) {
struct node* h = NULL, *n;
while(*s) {
n = malloc(sizeof(struct node));
n->c = *s++;
n->p = h;
h = n;
}
return h;
}
int main() {
struct node* n = func("BEST");
while (n) {
putchar(n->c);
struct node* t = n;
n = n->p;
free(t);
}
}
UML 다이어그램 종류별로 정의를 외우게 하는 전형적인 자격증용 암기 문제.
다음은 ( ) 다이어그램에 관한 설명이다. 아래 내용을 읽고 괄호 안에 들어갈 알맞은 명칭을 작성하시오.
포인터 연산으로 퀴즈 내는 건 C언어의 악습을 장려하는 꼴입니다.
다음 C 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
struct Test {
int i;
const char *g;
};
int main() {
struct Test test[] = {{1, "ab"}, {2, "DC"}, {3, "EB"}};
struct Test *p = &test[1];
printf("%s", p->g + (p->i - 1));
return 0;
}
파이썬의 enumerate 기능을 이해하고 있는지 묻는 문제지만, 코드 자체가 다소 작위적이다.
다음 파이썬 코드의 실행 결과로 알맞은 것을 고르시오.
data = [
[3, 5, 2, 4, 1],
[4, 5, 1],
[4, 4, 1, 5, 4],
[4, 5]
]
result = {}
for index, lis in enumerate(data):
list_sum = sum(lis)
list_len = len(lis)
result[index] = (list_sum, list_len)
print(result)
① {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ② {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ③ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ④ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑤ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑥ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑦ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑧ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)}
① {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ② {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ③ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ④ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑤ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑥ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑦ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} ⑧ {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)}
보안 모델의 정의를 묻는 전형적인 암기 문제네요.
다음은 정보보안에서 사용되는 접근통제(Access Control) 방식에 대한 설명입니다. 설명을 읽고 [보기]에서 알맞은 접근통제 모델을 고르시오.
ㄱ. 중앙에서 보안 정책을 일괄적으로 설정하며, 사용자가 임의로 수정하거나 변경할 수 없다. 주로 군사 기밀, 국가 보안과 같은 높은 등급의 보안 환경에서 사용되며, 보안 등급(Top Secret/Secret/Confidential 등)에 따라 접근 여부가 결정된다. ㄴ. 조직에서 부여된 직무나 역할(Role)에 따라 접근 권한을 부여하는 방식이다. 개별 사용자에게 직접 권한을 주지 않고 역할에만 권한만 부여하기 때문에 관리가 용이하며 직무 변경 시 역할만 바꾸면 된다. ㄷ. 자원의 소유자(Owner)가 해당 자원에 대한 접근 권한을 자유롭게 설정·부여·회수할 수 있는 방식인데(예: 얼마나 소유자가 읽기/쓰기/실행 권한을 지정하는 방식).
[보기] DAC, MAC, RBAC
테스트케이스 구성요소 이름 맞추기라니, 실무에서는 그냥 '입력값', '기대결과'라고 부르지 누가 이렇게 딱딱하게 부르나.
다음은 테스트케이스의 구성요소에 대한 설명이다. 괄호 안에 들어갈 알맞은 용어를 [보기]에서 골라 쓰시오.
| 식별자 ID | 테스트 항목 | (①) | (②) | (③) |
|---|---|---|---|---|
| DS-45S-21 | 로그인 기능 | 사용자 초기 화면 | 사용자 아이디(Test11) 비밀번호(test@#@!#) | 로그인 성공 |
| DS-45S-25 | 로그인 기능 | 사용자 초기 화면 | 사용자 아이디(Test11) 비밀번호("") | 로그인 실패 |
[보기] ㄱ. 테스트 조건 ㄴ. 테스트 환경 ㄷ. 테스트 유형 ㄹ. 테스트 데이터 ㅁ. 예상 결과 ㅂ. 수행 단계 ㅅ. 성공/실패 기준
용어 정의를 묻는 전형적인 암기형 문제다.
데이터 마이닝(Data Mining)에 대한 개념을 쓰시오.
이런 기본 개념은 실무에서 당연하게 받아들여지므로 굳이 외우지 않아도 된다.
통신 프로토콜(Communication Protocol)은 컴퓨터나 통신 장비 사이에서 메시지를 주고받는 양식과 규칙의 체계이다. 통신 프로토콜을 구성하는 기본 요소 3가지를 쓰시오.
JSON을 모르는 개발자는 없겠지만, 괄호 채우기 문제로 내는 건 좀 식상하다.
괄호 안에 알맞은 용어를 쓰시오.
( )은 데이터를 저장하거나 전송할 때 많이 사용하는 경량의 DATA 교환 형식이다.
( )은 사람과 기계 모두 이해하기 쉬우며 소용량으로, 최근에는 XML을 대체해서 데이터 전송 등에 많이 사용한다. Ajax에서 서버와 통신하며 데이터 교환을 쉽게 하기 위해 ( )을 데이터 전송 형식으로 많이 사용한다.
( )의 문법은 key와 value가 쌍으로 존재하며 태그로 표현하기 보다는 중괄호({}) 하고, 쉼표 ,로 나열하며 그 표현이 간단하다.
면접 단골 질문이다. 암기해두면 나쁠 건 없다.
트랜잭션의 특징 중 일관성, 지속성의 2개의 특성을 쓰시오.
네트워크 보안의 고전적인 공격 기법을 묻는 문제로, 실무자라면 당연히 알아야 할 기본기다.
다음에서 공통으로 설명하는 네트워크 공격 유형에 해당하는 용어를 쓰시오.
전형적인 정렬 알고리즘 추적 문제로, 코딩 테스트에서 흔히 볼 수 있는 유형이다.
다음은 C언어 소스 코드이다. 출력 결과를 쓰시오.
#include <stdio.h>
void main() {
int i, j;
int a[5] = {75, 95, 85, 100, 50};
for (i = 0; i < 4; i++) {
for (j = 0; j < 4 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (i = 0; i < 5; i++)
printf("%d", a[i]);
}
너무 기초적인 문제라 변별력이 있는지 의문이다.
다음은 Java 소스코드이다. 출력 결과를 쓰시오.
public class good {
public static void main(String[] args) {
int i;
int[] a = {10, 1, 2, 3};
for (i = 0; i < 4; i++) {
System.out.print(a[i] + " ");
}
}
}
처리량, 응답 시간, 경과 시간. 이 세 가지를 모르면 당신의 서비스는 이미 망한 겁니다.
다음 설명 중 빈칸에 가장 부합하는 애플리케이션 성능 측정 지표 3가지를 쓰시오.
• 애플리케이션 성능이란 사용자의 요구 기능을 해당 애플리케이션이 최소의 자원을 사용하면서 얼마나 빨리, 많은 기능을 수행하는가를 육안 또는 도구를 통하여 점검하는 것을 말한다. • 이를 측정하기 위한 지표는 애플리케이션이 주어진 시간 내에 처리할 수 있는 트랜잭션의 수( ( ㉠ ) ), 사용자 입력이 끝난 후 응답 출력이 개시될 때까지의 시간( ( ㉡ ) ), 사용자가 요구를 입력한 시점으로부터 트랜잭션 처리 후 그 결과의 출력이 완료될 때까지의 시간( ( ㉢ ) )을 사용한다.
용어 정의를 묻는 전형적인 암기형 문제지만, 실무적 가치는 인정한다.
데이터 백업(보호) 솔루션의 사례에 대비하여 서비스의 연속성을 보장하는 목적을 가지고 어떤 상황에서도 계획된 ( ㉠ )과 ( ㉡ )은 시스템 장애와 같은 상황에서의 '비상사태 또는 업무중단 상황부터 업무가 복구되어 다시 정상가동 될 때까지의 시간'을 의미하는 용어이다. RPO는 조직이 사태가 발생한 어떤 시점까지 재난으로부터 복구되어야 하는지를 의미하는 기준을 의미한다.
방법론의 정의를 괄호 채우기로 묻는 것은 전형적인 시험용 문제다.
다음 괄호 안에 공통으로 들어갈 소프트웨어 개발 프로젝트 방법론을 의미하는 용어를 쓰시오.
코드 트레이싱은 실무 능력을 확인하는 좋은 방법이지만, 너무 뻔한 상속 구조다.
다음 Java 코드이다. 다음 밑줄에 들어갈 키워드를 쓰시오.
class Parent {
public void show() {
System.out.println("Parent");
}
}
class Child extends Parent {
public void show() {
System.out.println("Child");
}
}
public class good {
public static void main(String[] args) {
Parent pa = ________ Child();
pa.show();
}
}
이론적인 정의를 묻는 문제라 실무자라면 당연히 알아야 하지만, 서술형으로 외우게 하는 건 좀 고리타분하다.
트랜잭션 Rollback에 대해 설명하시오.
이런 명령어는 외우는 게 아니라 필요할 때 찾아보는 건데, 굳이 시험으로 내야 하나 싶다.
사용자에게 읽기 / 쓰기 / 실행 권한을 부여하고, 그룹에게는 읽기 / 실행을 부여하고, 그 이외에는 실행 권한을 a.txt에 부여하는 명령을 한 줄로 작성하시오. (8진법을 사용하시오)
코드 트레이싱 문제는 언제나처럼 꼬아놓았지만, Java의 기본 원리를 묻는 좋은 문제다.
다음 Java 코드의 출력 결과를 쓰시오.
class A {
private int a;
public A(int a) {
this.a = a;
}
public void display() {
System.out.println("a=" +a);
}
}
class B extends A {
public B(int a) {
super(a);
super.display();
}
}
public class good {
public static void main(String[] args) {
B obj = new B(10);
}
}
이런 교과서적인 정의를 묻는 건 실무 역량보다는 암기력을 테스트하겠다는 의도로 보인다.
리팩토링(Refactoring)을 하는 목적을 쓰시오.
이론적인 정의를 묻는 전형적인 암기형 문제다.
대표적인 내부 라우팅 프로토콜로 다익스트라 알고리즘을 이용한 대규모 네트워크에 적합한 링크 상태 라우팅 프로토콜을 쓰시오.
용어 하나를 맞히기 위해 문장을 통째로 읽어야 하는 피로감이 있다.
실시간 통신 모델은 컴퓨터가 메시지를 전달하고, 메시지가 제대로 도착했는지 확인하며, 도착하지 않았을 경우 메시지를 재전송하는 일련의 방법을 기술한 용어를 ( )이라는 용어로 정의하였다. 괄호 안에 들어갈 용어를 쓰시오.
네트워크 기초 지식을 묻는 무난한 문제.
TCP/IP에서 오류가 발생하면 ( ) 메시지를 보내 오류가 발생했음을 알린다. 괄호 안에 들어갈 용어를 쓰시오.
실무에서 가장 많이 쓰이는 쿼리 패턴 중 하나라 깔 수가 없다.
다음 조건을 만족하면서 과목별 점수의 평균이 90 이상인 과목 이름, 최소점수, 최대점수를 구하는 SQL문을 작성하시오.
| 과목이름 | 최소점수 | 최대점수 |
|---|---|---|
| 컴퓨터과학 | 85 | 95 |
WHERE 절을 빼먹으면 대참사가 일어난다는 것을 경고하는 좋은 문제.
학생 테이블에서 이름이 '민수'인 튜플을 삭제하는 SQL문을 작성하시오.
이런 용어 암기는 실무에서 테스트 계획서 쓸 때나 가끔 생각나지, 코딩할 땐 아무 상관 없다.
내부 구조를 보지 않고 주로 구현된 기능을 테스트하는 테스트 기법으로, 동치 분할 테스트, 경계값 분석 테스트 등이 이용하는 테스트 기법은?
정의를 묻는 문제는 실무 지식 확인용으로는 적절하다.
DB 스키마에 대해서 서술하시오.
상속 구조를 파악하는 것은 실무에서도 자주 접하는 패턴이라 나쁘지 않다.
다음 Java 코드의 출력 결과를 쓰시오.
abstract class Vehicle {
private String name;
abstract public String getName(String val);
public String getName(byte val) {
return "Car name: " + val;
}
}
class Car extends Vehicle {
public Car(String val) {
setName(val);
}
public void setName(String val) {
name = val;
}
public String getName(String val) {
return "Car name: " + val;
}
}
public class good {
public static void main(String[] args) {
Vehicle obj = new Car("Spark");
System.out.print(obj.getName("Spark"));
}
}
이런 정의를 외우는 것보다 실제 사용성 테스트를 한 번 더 하는 게 낫다.
UI 설계 원칙 중 '직관성' 개념을 설명하시오.
기초적인 코드 트레이싱 문제로, 실무에서 이런 코드를 짤 일은 드물지만 로직 이해도는 확인 가능하다.
다음 Java 코드의 출력 결과를 쓰시오.
public class Good {
public static void main(String[] args) {
int i = 0;
int sum = 0;
while (i < 10) {
i++;
if (i % 2 == 1) {
continue;
}
sum += i;
}
System.out.println(sum);
}
}
기본 중의 기본을 묻는 문제라 비판할 거리가 없다.
C++에서 생성자란 무엇인지 쓰시오.
실무적인 SQL 문법을 묻는 좋은 문제다.
다음의 학생 테이블에 주소 속성을 추가하는 SQL문을 작성하시오.
( ① ) TABLE 학생 ( ② ) 주소 VARCHAR(20);
기본적인 상식 수준의 문제라 딱히 할 말이 없다.
현재 IPv4의 확장형으로 IPv4가 가지고 있는 주소 고갈, 보안성, 이동성 지원 등의 문제점을 해결하기 위해서 개발된 128비트 주소체계를 갖는 차세대 인터넷 프로토콜은 무엇인가?
이론적으로는 중요하지만, 실제 DB 엔진 내부 동작을 이해하는 것과는 또 다른 문제다.
트랜잭션 수행 도중에 데이터에 변경이 생기면 즉시 데이터베이스에 해당 사항을 반영하는 기법으로 회복 시 로그 파일을 참조하는 기법은 무엇인가?
보안 기사도 아니고 정보처리기사에서 이런 용어 정의를 묻는 건 너무 기초적인 암기 위주 아닌가요?
스니핑(Sniffing)에 대하여 서술하시오.
파이썬 기초 문법을 묻는 문제인데, 굳이 이런 식으로 2차원 배열처럼 꼬아서 낼 필요가 있었나 싶네요.
다음 파이썬 소스 코드이다. 출력 결과를 쓰시오.
lol = [[1,2,3],[4,5],[6,7,8,9]]
for sub in lol:
for item in sub:
print(item, end="")
이론적인 내용이지만 DB 설계의 근간이 되는 내용이라 비판하기 어렵네요.
이상 현상의 종류 3가지를 쓰시오.
전형적인 운영체제 교과서 문제네요. 실무에서 이 다이어그램을 직접 그릴 일은 없지만 개념은 알아야 합니다.
다음은 프로세스 상태 전이도이다. ①, ②, ③에 알맞은 상태를 쓰시오.
(이미지 내 상태 전이도 참조)
이론은 쉽지만, 실무에서 이 표를 다 작성하고 앉아있으면 프로젝트 일정이 밀립니다.
영석 기반 테스트 중 하나로 아래의 표처럼 입력 자료에 초점을 맞춰 테스트 케이스를 만들고 검사하는 방법을 무엇이라고 하는가?
| 구간 | 등급 | 데이터 |
|---|---|---|
| 90<점수<=100 | A | 95 |
| 80<점수<=90 | B | 80 |
| 70<점수<=80 | C | 72 |
| 60<점수<=70 | D | 69 |
| 0<점수<60 | F | 30 |
재귀 호출의 스택 흐름을 손으로 따라가게 하는 건 고전적인 방식이지만, 실무에선 디버거를 쓰는 게 정신 건강에 이롭다.
다음 Java 소스 코드의 출력 결과를 쓰시오.
class parent {
public int compute(int num) {
if (num <= 1) return num;
return compute(num - 1) + compute(num - 2);
}
}
class Child extends parent {
public int compute(int num) {
if (num <= 1) return num;
return compute(num - 1) + compute(num - 3);
}
}
class good {
public static void main(String[] args) {
parent obj = new Child();
System.out.print(obj.compute(4));
}
}
이론적인 단계 구분은 중요하지만, 실무에서는 그냥 'ERD 그린다'라고 하지 이렇게 딱딱하게 구분하지 않습니다.
다음은 데이터 모델링에 대한 설명이다. 빈칸에 들어갈 알맞은 용어를 쓰시오.
파이썬의 리스트 컴프리헨션이나 슬라이싱을 쓰면 훨씬 깔끔할 텐데, 굳이 이렇게 루프를 돌리는 코드를 내다니요.
다음 파이썬 코드이다. 출력 결과를 쓰시오.
class good:
li = ["seoul", "kyeonggi", "inchon", "daejeon", "daegu", "pusan"]
g = good()
str01 = ""
for i in li:
str01 = str01 + i[0]
print(str01)
AND와 OR 우선순위 문제는 SQL 시험의 단골 손님이죠. 괄호 안 치는 습관은 버려야 합니다.
다음 SQL 실행 결과의 숫자만 쓰시오.
SELECT COUNT(*) FROM 급여
WHERE EMPNO > 100 AND SAL > 3000 OR EMPNO = 200;
(데이터 테이블 생략)
배열 인덱스 가지고 장난치는 문제는 이제 그만 좀 봤으면 좋겠다.
다음 Java 프로그램 결과를 쓰시오.
public class Good {
public static void main(String[] args) {
int[][] arr = new int[][]{{45, 50, 75}, {89}};
System.out.println(arr[0].length);
System.out.println(arr[1].length);
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[1][0]);
}
}
이런 기초적인 테스트 기법은 실무에서 당연히 알아야 하는 상식이다.
다음은 블랙박스 기법에 대한 예제이다. 빈칸에 알맞은 블랙박스 기법 두 가지를 쓰시오.
IPv4와 IPv6의 차이는 네트워크의 기본 중의 기본이다.
다음 빈칸에 들어갈 알맞은 용어를 쓰시오.
이걸 틀리면 데이터베이스의 기본 용어조차 모르는 것이다.
주어진 테이블의 Cardinality와 Degree를 구하시오.
| 학번 | 이름 | 학년 | 학과 |
|---|---|---|---|
| 20202020 | 김재원 | 3 | 무역과 |
| 20202021 | 하달력 | 4 | 영어과 |
| 20202022 | 이소라 | 1 | 영어과 |
| 20202023 | 정가와 | 3 | 중국어과 |
이 정도 코드는 개발자라면 눈 감고도 읽어야 한다.
다음 Java 프로그램의 실행 결과를 쓰시오.
public class good {
public static void main(String[] args) {
int i, j;
for (j = 0, i = 0; i <= 5; i++) {
j += i;
System.out.print(i);
if (i == 5) {
System.out.print("=");
System.out.print(j);
} else {
System.out.print("+");
}
}
}
}
보안 문제는 실무와 직결되는 경우가 많아 그나마 덜 억울하네요.
괄호 안에 공통으로 들어갈 공격 기법을 적으시오.
이론적으로는 완벽하지만, 실제 현장에서 이 속도와 안정성을 보장하기란 매우 어렵다.
네트워크 장치를 필요로 하지 않고 네트워크 토폴로지가 동적으로 변화되는 특징이 있으며 응용 분야로는 긴급 구조, 긴급 회의, 전쟁터에서의 군사 네트워크에 활용되는 네트워크는 무엇인지 쓰시오.
정규화 문제는 항상 나오는데, 실무에서는 성능 때문에 일부러 반정규화를 하는 게 아이러니하다.
다음은 그림처럼 부분 함수적 종속을 제거하여, 완전 함수적 종속을 만족하는 정규형은 무엇인지 작성하시오.
Locking은 DB 성능의 핵심입니다. 이건 실무에서도 중요합니다.
병행제어 기법 중 데이터에 대한 연산을 모두 마칠 때까지 상호배제하는 기법을 무엇이라 하는지 작성하시오.
재귀 함수를 이렇게 짜면 스택 오버플로우 나기 딱 좋습니다.
다음 C언어에 관한 소스코드다. 실행 결과를 작성하시오.
int main() {
int res;
res = mp(2, 10);
printf("%d", res);
return 0;
}
int mp(int base, int exp) {
int res = 1;
for (int i = 0; i < exp; i++) {
res = res * base;
}
return res;
}
클래스 생성 없이 호출하려면 static을 써야 한다는 건 Java 입문 1일 차 내용인데, 이걸 굳이 괄호 채우기로 내야 했나 싶다.
클래스 내에서 객체 생성 없이 사용할 수 있는 메서드로, 출력 결과가 다음과 같을 때 괄호 안에 알맞은 키워드를 작성하시오.
public class Test {
public static void main(String[] args) {
System.out.print(Test.check(1)); // ①
}
( ) String check(int num) { // ②
return (num > 0 ? "positive" : "negative"); // ③
}
}
[출력결과] positive
코드 흐름을 쫓아가게 만드는 전형적인 Java 상속 문제로, 실무에서는 이렇게 복잡한 상속 구조를 지양한다.
다음은 JAVA에 관한 문제이다. 알맞은 출력값을 작성하시오.
class ovr1 {
public static void main(String[] args) {
ovr1 a1 = new ovr1();
ovr2 a2 = new ovr2();
System.out.print(
a1.sun(3, 2) +
a2.sun(3, 2)
);
}
int sun(int x, int y) {
return x + y;
}
}
class ovr2 extends ovr1 {
@Override
int sun(int x, int y) { // ⑤
return x - y +
super.sun(x, y); // ⑥
}
}
싱글톤 구현 방식 중 가장 기본적인 형태를 묻는 문제로, 멀티스레드 환경에서의 안전성(Thread-safety)까지 고려해야 실무 수준이다.
다음 Java 코드에 대한 알맞은 출력값을 쓰시오.
class Connection {
private static Connection _inst = null;
private int count = 0;
static public Connection get() {
if (_inst == null)
_inst = new Connection();
return _inst;
}
public void count() { count++; }
public int getCount() { return count; }
}
public class testcon {
public static void main(String[] args) {
Connection conn1 = Connection.get();
conn1.count();
Connection conn2 = Connection.get();
conn2.count();
Connection conn3 = Connection.get();
conn3.count();
System.out.print(conn1.getCount());
}
}
이론적인 정의를 묻는 문제라 실무자라면 1초 만에 풀고 넘어가야 한다.
다음은 정보보호 기술인 AAA(3A)에 대한 설명이다. 적합한 용어를 [보기]에서 고르시오.
① 시스템을 접근하기 전에 접근을 시도하는 사용자의 신원을 검증하는 것 ② 검증된 사용자에게 어떤 수준의 권한과 서비스를 허용할지 결정하는 것 ③ 사용자의 자원(시간, 정보, 위치 등)에 대한 사용 정보를 수집하는 것
Architecture, Authentication, Access, Avoidance, Authorization, Application, Accounting
보안 기사 시험 단골 문제. 공격 원리를 이해하는 것은 중요하지만, 용어 암기 위주인 점은 아쉽다.
다음 괄호 안에 알맞은 용어를 쓰시오.
( )은 근거리 통신망 하에서 상대방의 데이터를 중간에서 가로채는 중간자 공격 기법이다. 이것은 자신의 MAC 주소를 다른 컴퓨터의 MAC 주소인 것처럼 속여 패킷을 가로채는 기법이다.
코드 트레이싱 문제는 실무에서 버그 찾을 때 필요한 능력이니 봐줍니다.
다음 Java 코드에 대한 알맞은 출력값을 쓰시오.
public class test {
public static void main(String[] args) {
int a=3, b=4, c=3, d=5;
if((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)) {
a = b + c;
if(7 == b ^ c != a) {
System.out.println(a);
} else {
System.out.println(b);
}
} else {
a = c + d;
if(7 == b ^ c != a) {
System.out.println(a);
} else {
System.out.println(d);
}
}
}
}
CROSS JOIN의 결과를 계산하라는 문제는 실무적인 SQL 활용 능력보다는 단순 연산 능력을 묻는 느낌이 강합니다.
다음은, 테이블에서 조건값을 실행한 화면이다. 이에 대한 알맞은 결과값을 작성하시오.
SELECT COUNT(*) CUT FROM T1 A
CROSS JOIN T2 B
WHERE A.NAME LIKE B.RULE;
| CODE | NAME |
|---|---|
| 3258 | smith |
| 4324 | allen |
| 5432 | scott |
| NO | RULE |
|---|---|
| 12 | s% |
| 32 | %t% |
이런 용어 암기는 실무에서 인덱스 설계할 때 기본 소양이라 욕하기 어렵다.
다음은 파일 구조(File Structures)에 대한 설명이다. 괄호 안에 알맞은 답을 작성하시오.
개념은 중요하지만, 표를 채우는 방식의 암기 문제는 다소 지루하다.
다음은 소프트웨어 통합 테스트에 대한 설명이다. 괄호 안에 알맞은 답을 작성하시오.
용어 정의를 묻는 전형적인 문제지만, 실무에서는 툴이 다 해주니 개념만 확실히 잡고 넘어가자.
다음 DB 회복 기법에 대한 설명에 알맞은 답을 [보기]에서 찾아 작성하시오.
ㄱ. commit ㄴ. active ㄷ. Partially Committed ㄹ. Rollback ㅁ. Abort ㅂ. Committed ㅅ. Failed ㅇ. redo ㅈ. undo
이론적인 정의를 묻는 전형적인 시험 문제로, 실무에서는 '데이터가 꼬였다'는 말로 통용된다.
데이터베이스의 이상현상 중, 삭제 이상에 대해 서술하시오.
기본적인 문법 이해도를 묻는 문제로, 파이썬을 조금이라도 써봤다면 틀릴 수가 없다.
다음 파이썬 코드에서 출력되는 a와 b의 값을 작성하시오.
def exam(num1, num2=2):
print('a=', num1, 'b=', num2)
exam(20)
실무적인 개념을 묻는 좋은 문제지만, 표를 채우는 방식은 다소 고전적이다.
다음은 소스 코드 분석 도구에 대한 설명이다. 각각에 알맞은 답을 [보기]에서 고르시오.
| 구분 | 정적 분석(Static) | 동적 분석(Dynamic) |
|---|---|---|
| 실행 여부 | 실행하지 않음 | 실행(런타임 환경) |
| 분석 시점 | 개발 초기, 컴파일 전 | 테스트 및 실행 시점 |
| 검출 대상 | 코딩 표준, 문법 오류 등 | 메모리 누수, 성능 문제, 실제 발생한 런타임 오류 |
static, dynamic
스레드 생성 방식을 묻는 전형적인 암기형 문제로, 실무에서는 보통 ExecutorService를 쓰지 이렇게 직접 Thread를 생성하는 경우는 드물다.
다음 Java 코드 중에서 밑줄에 들어갈 알맞은 코드를 작성하시오.
class Car implements Runnable {
public void run() {
System.out.println("message");
}
}
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new ____);
t1.start();
}
}
이런 기초적인 자릿수 분리 로직을 굳이 빈칸 문제로 내는 건 너무 고전적이다.
다음 중 괄호 안에 들어갈 연산자를 써서 정수를 역순으로 출력하는 알맞은 답을 작성하시오.
#include <stdio.h>
int main() {
int number = 1234;
int div = 10;
int result = 0;
while (number ( ① ) 0) {
result = result * div;
result = result + number ( ② ) div;
number = number ( ③ ) div;
}
printf("%d", result);
return 0;
}
// 결과: 4321
공격 기법의 이름을 묻는 문제는 보안 분야에서 단골이다.
다음 설명과 관련된 공격 유형을 쓰시오.
이 공격은 APT 공격에서 주로 쓰이는 공격으로, 공격 대상이 방문할 가능성이 있는 합법적인 웹 사이트를 미리 감염시킨 뒤, 잠복하고 있다가 공격 대상이 방문하면 감염된 코드를 다운로드 받게 하고, 다운로드된 악성 코드를 통해 공격을 하는 방식이다.
이론적인 V모델은 예쁘지만, 실제 애자일 환경에서는 이렇게 딱딱 떨어지게 테스트를 수행하기가 매우 어렵다.
다음은 V모델에서의 테스트 단계이다. ①~④ 안에 들어갈 답을 작성하시오.
<!-- FIGURE TODO: V모델 테스트 단계 다이어그램 -->SQL의 논리 연산자를 묻는 전형적인 문제로, 실무에서는 가독성을 위해 서브쿼리보다 JOIN을 선호한다.
'막강' 회사의 전체 제품 단가보다 큰 제품 출력을 하고자 한다. 괄호 안에 들어갈 알맞은 용어를 작성하시오.
| 제조사 | 제품명 | 단가 |
|---|---|---|
| 최고 | 메리제인슈즈 | 1,000 |
| 제일 | 스텔레토힐 | 6,000 |
| 막강 | 플랫슈즈 | 2,000 |
| 젤존 | 스니커즈 | 5,000 |
| 막강 | 앵글부츠 | 3,000 |
SELECT 제조사, 제품명, 단가
FROM 제품
WHERE 단가 > ( )(SELECT 단가 FROM 제품 WHERE 제조사='막강');
네트워크 보안의 기초적인 개념을 묻는 문제로, 실무자라면 당연히 알아야 할 수준이다.
다음은 네트워크에 관한 내용이다. 괄호 안에 들어갈 알맞은 답을 작성하시오.
( )은/는 인터넷을 통해 디바이스 간에 사설 네트워크 연결을 생성하며, 퍼블릭 네트워크를 통해 데이터를 안전하게 암호화하여 전송하는 데 사용된다. 또한 사용자 IP 주소를 마스킹하고 데이터를 암호화하여 수신 권한이 없는 사람이 읽을 수 없도록 한다.
코드 자체는 깔끔하지만, 시험 문제로 내기 위해 억지로 꼬아놓은 느낌이 강하다.
다음 소스코드에 대한 출력값을 작성하시오.
#include <stdio.h>
struct A {
int n;
int g;
};
int main() {
struct A a[2];
for (int i = 0; i < 2; i++) {
a[i].n = i;
a[i].g = i + 1;
}
printf("%d", a[0].n + a[1].g);
return 0;
}
이런 계산은 실무에선 계산기나 툴을 쓰지, 손으로 직접 하진 않는다.
IP 주소가 139.127.19.132이고 서브넷마스크가 255.255.255.192일 때 아래의 답을 작성하시오. (10진수로 표기)
용어 자체는 중요하지만, 보기를 주고 고르는 문제는 너무 쉽다.
다음 설명에 알맞은 테스트 용어를 보기에서 골라 작성하시오.
[보기] Unit (단위), Integration (통합), Regression (회귀), System (시스템)
이전의 실행 테스트를 재실행하며 이전에 고쳤던 오류가 재발되는지 검사하고 오류가 수정된 외에 새롭게 유입된 오류가 없는지 확인하는 방법으로 많이 사용된다. 이것은 수정·변경된 시스템 컴포넌트 또는 프로그램이 명시된 요구 사항을 충족시키는지를 확인하는 시험의 한 형태이다.
테이블을 보고 결과를 추론하는 문제는 실무적 감각을 기르기에 나쁘지 않다.
다음 테이블에서 π job(employee)에 대한 연산 결과을 작성하시오.
| empro | age | job |
|---|---|---|
| 1 | 33 | 차장 |
| 2 | 22 | 사원 |
| 3 | 45 | 부장 |
| 4 | 28 | 대리 |
C언어의 문자열 포인터 연산을 테스트하는 전형적인 문제로, 실무에서는 strncpy나 strndup을 쓰지 이렇게 짜면 욕먹는다.
다음은 파이썬 코드이다. 알맞은 출력값을 작성하시오.
a = 'REMEMBER NOVEMBER'
b = a[:3] + a[12:16]
c = 'R AND %s' % 'STR'
print(b+c)
코드 자체는 깔끔하지만, 이런 식의 트레이싱 문제는 실무보다는 면접용 퀴즈에 가깝다.
다음 Java 코드에서 알맞은 출력값을 작성하시오.
public class Conv {
int a;
public Conv(int a) {
this.a = a;
}
int func() {
int b = 1;
for (int i = 1; i < a; i++) {
b = a * i + b;
}
return a + b;
}
public static void main(String[] args) {
Conv obj = new Conv(3);
obj.a = 5;
int b = obj.func();
System.out.print(obj.a + b);
}
}
너무 기초적인 내용이라 문제로 내기 민망할 정도.
다음 설명에 알맞은 각각의 답을 작성하시오.
C언어의 포인터와 배열 인덱스 계산을 꼬아놓은 전형적인 시험용 코드다.
아래는 C언어의 2차원 배열 형태이다. field의 경우 2차원 배열 형태는 예시처럼 출력되므로, 이를 참고하여 mines의 2차원 배열 형태를 작성하시오.
#include <stdio.h>
int calculate(int w, int h, int i, int j) {
if (i >= 0 && i < h && j >= 0 && j < w) // ①
return 1;
return 0; // ②
}
int main() {
int mines[4][4] = {0};
int w = 4, h = 4;
int i, j;
int field[4][4] = {
{0, 1, 0, 1},
{1, 1, 1, 0},
{0, 0, 0, 1},
{0, 1, 1, 1}
}; // ④
for (y = 0; y < h; y++) {
for (x = 0; x < w; x++) {
if (field[x][y] == 0) continue; // ⑥
for (i = y - 1; i <= y + 1; i++) {
for (j = x - 1; j <= x + 1; j++) {
if (calculate(w, h, i, j)) // ⑦
mines[j][i] += 1; // ⑧
}
}
}
}
for (y = 0; y < h; y++) {
for (x = 0; x < w; x++) {
printf("%d", mines[y][x]); // ⑨
}
printf("\n");
}
return 0;
}
순위 계산 알고리즘을 직접 구현하는 건 코딩 테스트용이지, 실무에서 이렇게 짜면 유지보수 담당자가 화낸다.
다음 Java 코드의 출력 결과를 쓰시오.
public class RankExample {
public static void main(String[] args) {
int[] arr = {77, 32, 10, 99, 50};
int[] result = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
result[i] = 1;
for (int j = 0; j < arr.length; j++) {
if (arr[i] < arr[j]) {
result[i]++;
}
}
}
for (int k = 0; k < result.length; k++) {
System.out.print(result[k]);
}
}
}
이론적인 용어 암기보다는 실제 테스트 케이스를 짜는 능력이 더 중요하다.
다음 표에 해당하는 테스트 기법을 쓰시오.
| 평가 점수 | 상여금 |
|---|---|
| 90-100점 | 600만원 |
| 80-89점 | 400만원 |
| 70-79점 | 200만원 |
| 0-69점 | 0만원 |
CASCADE 옵션이 걸려있을 때의 데이터 삭제 흐름을 묻는 좋은 문제다.
아래 데이터 명령을 적용할 경우 명령은 출력값을 작성하시오.
CREATE TABLE 부서 (
부서코드 int,
PRIMARY KEY(부서코드)
);
CREATE TABLE 직원 (
직원코드 int, 부서코드 int,
PRIMARY KEY(직원코드),
FOREIGN KEY(부서코드)
REFERENCES 부서(부서코드)
ON DELETE CASCADE
);
-- 데이터 삽입 생략 --
DELETE FROM 부서 WHERE 부서코드 = 20;
SELECT COUNT(직원코드) FROM 직원;
이 정도 코드는 파이썬 기초 중의 기초라 틀리면 곤란하다.
다음 파이썬 코드에 대한 출력값을 작성하시오.
TestList = [1, 2, 3, 4, 5]
TestList = list(map(lambda num: num + 100, TestList))
print(TestList)
솔루션 이름 풀네임을 묻는 건 전형적인 자격증 시험 스타일이다.
다음 설명에 해당하는 용어는 무엇인가?
기초적인 SQL 문법을 묻는 문제로, 실무자라면 당연히 알아야 한다.
STUDENT 테이블에서 컴퓨터학과 학생 50명, 전기과 학생 50명, 데이터학과 학생 50명의 정보가 저장되어 있을 때, 다음 SQL문의 실행 결과에 따른 튜플의 수는? (단, DEPT 컬럼은 학과명이다.)
SELECT DISTINCT DEPT FROM STUDENT;
보안 용어 암기 문제인데, 실무에서는 이런 용어 정의보다 실제 방어 설정이 훨씬 중요하다.
다음 설명에 알맞은 용어를 각각 작성하시오.
(1) 프로세서(processor) 안에 독립적인 보안 구역을 따로 두어 중요한 정보를 보호하는 하드웨어 기반의 보안 기술 (2) 암(ARM: Advanced RISC Machine)사에서 개발하였다. (3) 사이트에 접속할 때 주소를 잘못 입력하거나 철자를 빼먹는 실수를 이용하기 위해 유사한 유명 도메인을 미리 등록하는 일 (4) 하이재킹(hijacking)이라고도 한다.
ERD 기호 해석은 실무 DB 설계자라면 당연히 알아야 할 기본기다.
다음은 E-R 다이어그램에 관한 설명이다. 괄호 안에 알맞은 답을 작성하시오.
erDiagram
STUDENT ||--o{ ENROLL : " "
COURSE ||--o{ ENROLL : " "
STUDENT {
string 학번
string 이름
}
COURSE {
string 과목코드
string 과목명
string 담당교수
}
ENROLL {
string 학번
string 과목코드
date date
}
코드 자체는 단순하지만, 메모리 구조를 시각화해서 보여주는 친절함이 오히려 시험 문제답지 않게 느껴진다.
다음 Java 코드에 대한 출력 값을 작성하시오.
public class Main {
static int[] MakeArray() {
int[] tempArr = new int[4];
for (int i = 0; i < tempArr.length; i++) {
tempArr[i] = i;
}
return tempArr;
}
public static void main(String[] args) {
int[] intArr;
intArr = MakeArray();
for (int i = 0; i < intArr.length; i++) {
System.out.print(intArr[i]);
}
}
}
단순한 반복문 문제인데, 굳이 999까지 돌려서 993을 답으로 내게 하는 건 좀 귀찮은 수준의 문제다.
다음 Java 코드에 대한 출력 값을 작성하시오.
public class Exam {
public static void main(String[] args) {
int a = 0;
for(int i = 1; i < 999; i++) {
if(i % 3 == 0 && i % 2 != 0) {
a = i;
}
}
System.out.print(a);
}
}
메모리 구조를 묻는 건 좋지만, 이런 식의 억지스러운 static 호출은 실무에서 절대 하지 말아야 할 코드다.
아래 Java 코드에서 출력되는 값을 작성하시오.
class Static {
public int a = 20;
static int b = 0;
}
public class Main {
public static void main(String[] args) {
int a = 10; // 1
Static.b = a; // 2
Static st = new Static(); // 3
System.out.println(Static.b++); // 4
System.out.println(st.b); // 5
System.out.println(a); // 6
System.out.println(st.a); // 7
}
}
이론적인 내용이라 실무에서 직접 용어를 읊지는 않지만, 네트워크 아키텍처를 이해하려면 필수적인 기초 지식이다.
괄호 안에 들어갈 적절한 네트워크 용어를 [보기]에서 고르시오.
① ( ) :
[보기] 데이터그램, 패킷, 프레임, 가상회선, 메시지, Sliding Window, ICMP
C언어 기초를 묻는 무난한 문제지만, 실무에서 직접 10진수 변환 로직을 짤 일은 거의 없다.
아래 코드에서 이진수를 십진수로 변환하는 코드에 대해 괄호 (a), (b)에 적합한 답을 작성하시오.
#include <stdio.h>
int main() {
int input = 101110; // ①
int sum = 0; // ②
int di = 1; // ③
while (1) {
if (input == 0) break; // ④
else {
sum = sum + (input % 10) * di; // ⑤
di = di * 2; // ⑥
input = input / 10; // ⑦
}
}
printf("%d", sum); // ⑧
return 0;
}
보안 공격 기법을 빈칸 채우기로 내는 건 좀 고전적이지만, 기본기 확인용으로는 나쁘지 않다.
다음은 보안 관련 설명으로, 괄호 안에 알맞은 용어를 작성하시오.
버블 정렬을 직접 구현하는 건 학습용이지, 실무에서는 라이브러리 정렬 함수를 쓴다.
다음 코드에서 괄호 안에 알맞은 변수명으로 작성하시오.
public class Sort {
public static void swap(int[] arr, int idx1, int idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
public static void Usort(int[] array, int length) {
for (int i = 0; i < length; i++) {
for (int j = 0; j < length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
swap(array, j, j + 1);
}
}
}
}
public static void main(String[] args) {
int[] item = {5, 3, 8, 1, 2, 7};
int nx = 6;
Usort(item, nx);
for (int data : item) {
System.out.print(data + " ");
}
}
}
집합의 순서가 보장되지 않는다는 기초적인 특성을 묻는 문제로, 파이썬을 조금이라도 써봤다면 틀릴 수가 없다.
다음 파이썬 코드의 알맞은 출력값을 작성하시오.
a = {'일본', '중국', '한국'}
a.add('베트남')
a.add('중국')
a.remove('일본')
a.update({'홍콩', '한국', '태국'})
print(a)
코드의 흐름을 쫓아가는 전형적인 시험 문제지만, 실무에서는 이렇게 복잡한 상속 구조를 굳이 만들지 않는 게 좋다.
다음 JAVA 코드에서 알맞은 출력 값을 작성하시오.
abstract class Vehicle {
String name;
abstract public String getName(String val);
public String getName() {
return "Vehicle name:" + name;
}
}
class Car extends Vehicle {
public Car(String val) {
name = super.name = val;
}
public String getName(String val) {
return "Car name:" + val;
}
public String getName(byte val[]) {
return "Car name:" + val;
}
}
public class Main {
public static void main(String[] args) {
Vehicle obj = new Car("Spark");
System.out.println(obj.getName());
}
}
그래프를 보고 경로를 찾는 문제는 실무에서 자동화 도구가 다 해주는데, 굳이 손으로 풀게 하는 이유를 모르겠다.
다음 제어 흐름 그래프가 분기 커버리지를 만족하기 위한 테스트 순서를 쓰시오.
필드 오버라이딩을 유도하는 코드는 실무에서 절대 짜지 말아야 할 나쁜 코드의 예시다.
다음 자바 코드에 대한 출력 값을 작성하시오.
class Parent {
int x = 100;
Parent() {
this(500);
}
Parent(int x) {
this.x = x;
}
int getX() {
return x;
}
}
class Child extends Parent {
int x = 400;
Child() {
this(5000);
}
Child(int x) {
this.x = x;
}
}
public class Main {
public static void main(String[] args) {
Child obj = new Child();
System.out.println(obj.getX());
}
}
배열 인덱스 계산 문제인데, 실무에서는 이런 거 직접 짜다가 인덱스 에러 내지 말고 표준 라이브러리 쓰세요.
다음은 C언어 코드의 문제이다. 보기의 조건에 맞도록 괄호 안에 알맞은 코드를 작성하시오.
입력값이 54321인 경우 출력값이 43215로 출력되어야 한다.
#include <stdio.h>
int main(void) {
int n[5];
int i;
for (i = 0; i < 5; i++) {
scanf("%d", &n[i]); // ① 입력
}
for (i = 0; i < 5; i++) {
printf("%d", n[(i + 1) % 5]); // ② 출력
}
return 0;
}
기초적인 루프 문제지만, 2023년까지의 4의 배수를 묻는 방식이 꽤나 고전적이다.
다음은 소스코드의 알맞은 출력을 작성하시오.
#include <stdio.h>
int main() {
int c = 0;
for(int i = 1; i <= 2023; i++) {
if(i % 4 == 0) c++;
}
printf("%d", c);
}
이론적인 오류 제어 방식은 네트워크 엔지니어라면 당연히 알아야 할 기본기다.
데이터 전송 시 오류를 검출하고 수정하는 방법 중 ( ① )은 데이터 전송 과정에서 발생한 오류를 검출해 재전송 요구 없이 송신 측에서 스스로 수정하는 방식이고, ( ② ) 방식은 오류 발생 시 송신 측에 재전송을 요구하는 방식이다. ( ③ )의 종류에는 ( ④ ) 검사, ( ⑤ ) 검사가 있다.
① hamming, ② FEC, ③ BEC, ④ parity, ⑤ CRC
String Pool 개념을 묻는 건 좋지만, 실무에서 new String()을 직접 쓸 일은 거의 없다는 게 함정.
다음은 Java에 대한 문제이다. 알맞은 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
String str1 = "Programming";
String str2 = "Programming";
String str3 = new String("Programming");
System.out.println(str1 == str2); // ①
System.out.println(str1 == str3); // ②
System.out.println(str1.equals(str3)); // ③
System.out.println(str2.equals(str3)); // ④
}
}
괄호 채우기 문제치고는 개념이 아주 실무적이라 깔 수가 없다.
다음 괄호 안에 알맞은 답을 작성하시오.
파이썬 기초 문법을 묻는 문제라 실무자 입장에서는 너무 쉬워서 하품이 나온다.
다음 파이썬 코드에서 알맞은 출력값을 작성하시오.
a = "engineer information processing"
b = a[:3]
c = a[4:6]
d = a[28:]
e = b + c + d
print(e)
코드의 가독성을 해치는 전형적인 '시험용' 꼬아놓기 문제로, 실무에서는 이런 코드를 작성하면 즉시 코드 리뷰에서 반려당합니다.
다음은 Java 코드이다. 올바른 출력 결과를 작성하시오.
public class Main{
public static void main(String[] args) {
A b = new B(); // ①
b.paint(); // ②
b.draw(); // ⑦
}
}
class A {
public void paint() {
System.out.print("A");
draw();
}
public void draw() {
System.out.print("B"); // ③
draw(); // ④
}
}
class B extends A {
public void paint() {
super.draw(); // ③
System.out.print("C"); // ⑤
this.draw(); // ⑥
}
public void draw() {
System.out.print("D"); // 실행 시마다 D
}
}
용어의 정의를 묻는 전형적인 암기형 문제지만, 실무 필수 지식이라 뭐라 하기도 애매하다.
다음에서 설명하는 용어를 [보기]에서 골라 기호를 작성하시오.
| 보기 | |---|---| | ㄱ. NFT | ㄴ. JWT | ㄷ. SAML | | ㄹ. accessToken | ㅁ. SSO | ㅂ. OIDC | | ㅅ. Authentication | ㅇ. OAuth | ㅈ. Cookie | | ㅊ. Refresh Token | | |
UNION 연산의 결과 집합에 대한 이해를 묻는 전형적인 기초 문제네요.
다음 빈칸에 들어갈 UNION 연산의 결과값을 작성하시오.
| NUM | NUM |
|---|---|
| 1 | 3 |
| 1 | 3 |
| 2 | 4 |
SELECT NUM FROM T1
UNION
SELECT NUM FROM T2
ORDER BY A DESC;
재귀 호출의 스택 구조를 이해하는지 묻는 아주 정석적인 문제네요.
다음 C 언어 코드에 알맞은 출력값을 작성하시오.
#include <stdio.h>
int f(int n) {
if(n == 1) return 1;
else return n * f(n - 1);
}
int main() {
printf("%d", f(7));
return 0;
}
컴파일 에러가 나는 코드를 보여주고 이유를 묻는 건 실무 감각을 확인하기엔 좋다.
다음 자바 코드를 실행할 경우 에러가 발생한다. 에러가 발생하는 라인을 작성하시오.
class Person {
private String name;
public Person(String val) {
name = val;
}
public static String get() {
return name; // 오류 발생 지점
}
public void print() {
System.out.println(name);
}
}
파이썬의 기초적인 문자열 처리 능력을 묻는 무난한 문제.
다음 파이썬 코드에 대한 출력값을 작성하시오.
print("파이썬 입출력에 대한 문제입니다.")
# 입력값은 2와 3이다.
num1, num2 = input().split() # 입력: 2 3
num1 = int(num1)
num2 = int(num2)
num3 = num1 + num2
print(str(num1) + "+" + str(num2) + "=" + str(num3))
다이어그램 이름 맞추기 문제는 실무 능력보다는 암기력 테스트에 가깝다.
다음은 패키지와 관련된 다이어그램이다. 해당 다이어그램의 명칭을 쓰시오.
graph TD
ordering -->|import| products
pricing -->|import| products
이런 표를 채우는 문제는 실무에서 클라우드 아키텍처를 설계할 때의 기본 소양이다.
다음은 클라우드에 대한 유형 문제이다. 괄호 안에 알맞은 답을 [보기]에서 골라 작성하시오.
| 구분 | 애플리케이션 | 데이터 | 런타임 | 미들웨어 | 운영체제 | 가상화 | 서버 | 스토리지 | 네트워크 |
|---|---|---|---|---|---|---|---|---|---|
| ① | O | O | O | O | O | O | O | O | O |
| ② | O | O | O | O | O | X | X | X | X |
| ③ | O | O | X | X | X | X | X | X | X |
[보기]
이론적인 내용이지만 실무에서도 데이터 설계 시 항상 고민해야 하는 부분이라 유익하다.
다음은 데이터베이스에 관련된 문제이다. 괄호 안에 알맞은 답을 쓰시오.
( ) 무결성은 관계 데이터베이스 관계 모델에서 2개의 관련 관계 변수(테이블) 간의 일관성(데이터)을 적용한다.
싱글톤 구현 방식이 멀티스레드 환경에서 안전하지 않다는 점을 지적하지 않는 것은 아쉽다.
다음 Java 코드에서 알맞은 출력 값을 작성하시오.
class Connection {
private static Connection _inst = null;
private int count = 0;
static public Connection get() {
if (_inst == null) {
_inst = new Connection();
}
return _inst;
}
public void count() { count++; }
public int getCount() { return count; }
}
public class Main {
public static void main(String[] args) {
Connection conn1 = Connection.get();
conn1.count();
Connection conn2 = Connection.get();
conn2.count();
Connection conn3 = Connection.get();
conn3.count();
conn1.count();
System.out.print(conn1.getCount());
}
}
포인터 연산으로 문자열 뒤집기라니, 80년대 C언어 시험 문제에서 타임머신 타고 온 줄 알았다.
다음 C언어 코드의 출력 결과를 쓰시오.
#include <stdio.h>
#include <string.h>
void reverse(char *str) {
int len = strlen(str);
char *p1 = str;
char *p2 = str + len - 1;
char temp;
while(p1 < p2) {
temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
}
int main(int argc, char* argv[]) {
char str[100] = "ABCDEFGH";
reverse(str);
printf("%s", str);
return 0;
}
손으로 직접 페이지 교체 과정을 추적하게 하는 것은 고전적이지만 확실한 검증 방식입니다.
다음 운영체제 페이지 순서를 참고하여 할당된 프레임의 수가 3개일 때 LRU와 LFU 알고리즘의 페이지 부재 횟수를 작성하시오.
페이지 참조 순서: 1, 2, 3, 1, 2, 4, 1, 2, 5, 7
실무에서 이런 코드를 짜면 가독성 때문에 욕먹기 딱 좋습니다.
다음 C 언어의 알맞은 출력값을 작성하시오.
#include <stdio.h>
typedef struct {
int accNum;
double bal;
} BankAcc;
double sim_pow(double base, int year) {
int i;
double r = 1.0;
for(int i = 0; i < year; i++) {
r *= base;
}
return r;
}
void initAcc(BankAcc *acc, int x, double y) {
acc->accNum = x;
acc->bal = y;
}
void xxx(BankAcc *acc, double *en) {
if(*en > 0 && *en < acc->bal) {
acc->bal = acc->bal - *en;
} else {
acc->bal = acc->bal + *en;
}
}
void yyy(BankAcc *acc) {
acc->bal = acc->bal * sim_pow((1+0.1),3);
}
int main() {
BankAcc myAcc;
initAcc(&myAcc, 9981, 2200.0);
double amount = 100.0;
xxx(&myAcc, &amount);
yyy(&myAcc);
printf("%d and %.2f", myAcc.accNum, myAcc.bal);
return 0;
}
파이썬의 간결함을 보여주는 좋은 예제지만, 이런 기초적인 루프를 직접 짜는 일은 실무에서 거의 없다.
다음 파이썬 코드에 대한 알맞은 출력 값을 작성하시오.
a = ["Seoul", "Kyeonggi", "Incheon", "Daejun", "Dae-gu", "Pusan"]
str = "S"
for i in a:
str = str + i[1]
print(str)
보안 기사 수준의 기초적인 용어 정의 문제다.
다음 내용을 보고 보기에서 알맞은 용어를 골라 작성하시오.
ㄱ. Worm ㄴ. Trojan horse ㄷ. Backdoor ㄹ. Virus ㅁ. Ransomware ㅂ. Spyware ㅅ. Rootkit
상속 관계에서 생성자 호출 순서와 오버라이딩을 묻는 전형적인 '시험용' 코드다.
다음 Java 코드를 보고 출력 값을 작성하시오.
class classOne {
int a, b;
public classOne(int a, int b) { // ③
this.a = b;
this.b = a;
}
public void print() { // ⑥
System.out.println(a + b);
}
}
class classTwo extends classOne {
int po = 3;
public classTwo(int i) { // ④
super(i, i + 1);
}
public void print() { // ⑦
System.out.println(po * po);
}
}
public class main {
public static void main(String[] args) { // ①
classOne one = new classTwo(10); // ②
one.print(); // ⑤
}
}
보안 용어 정의를 묻는 문제로, 실무보다는 자격증 시험에서 자주 보이는 유형이다.
다음 내용을 보고 알맞은 용어를 쓰시오.
이론적인 정의를 달달 외우는 것보다, 실제 코드에서 인터페이스를 어떻게 분리하는지 이해하는 것이 훨씬 중요하다.
다음 내용을 보고 알맞은 용어를 쓰시오.
메모리 주소와 참조 개념을 묻는 전형적인 문제로, 실무에서는 equals()를 써야 한다는 점만 기억하면 된다.
다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
class Main {
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3, 4}; // ①
int[] b = new int[]{1, 2, 3, 4}; // ②
int[] c = new int[]{1, 2, 3}; // ③
check(a, b); // ④
check(a, c); // ⑤
check(b, c); // ⑥
}
public static void check(int[] a, int[] b) { // ⑦
if (a == b) { // ⑧
System.out.print("O");
} else { // ⑨
System.out.print("N");
}
}
}
이론적인 용어 정의 문제지만, 실무에서 비정규화를 남발하면 나중에 유지보수 지옥을 맛보게 된다.
다음 문제에서 설명하는 용어를 작성하시오.
데이터를 중복시켜 성능을 향상시키기 위한 기법으로 데이터를 중복 저장하거나 테이블을 합치는 등으로 성능을 향상시키지만 데이터 무결성이 저하될 수 있는 기법
SQL 기본 문법을 묻는 문제라 딱히 깔 건 없지만, 실무에서는 이런 단순 쿼리보다 복잡한 조인과 튜닝이 더 중요하다.
다음은 SQL에 관한 문제이다. 아래 SQL 구문의 빈칸을 채우시오.
테이블: 사원(사원번호(PK), 이름, 나이, 부서)
보안 프로토콜의 핵심을 묻는 좋은 문제지만, 암기 위주로 공부하면 금방 까먹는다.
다음은 프로토콜에 대한 내용이다. 아래 내용을 읽고 알맞은 답을 작성하시오.
이론적인 분류 문제지만, 네트워크 기초를 다지기에는 나쁘지 않다.
패킷 교환 방식 중에 연결형과 비연결형에 해당하는 방식을 작성하시오.
RIP 알고리즘을 손으로 계산하게 시키는 건 고전적인 방식이지만, 네트워크 기초를 다지기엔 나쁘지 않다.
아래 그림을 바탕으로 RIP을 구성하여 A -> F까지의 최단 경로 비용을 계산한 후, 흐름에 맞게 경로를 작성하시오.
B -> 2 -> A B -> 2 -> D A -> 1 -> D D -> 2 -> C C -> 1 -> E C -> 5 -> F E -> 2 -> F
손으로 표를 그려가며 스케줄링을 계산하는 건 고통스럽지만, 알고리즘의 동작 원리를 이해하는 데는 확실하다.
아래의 표를 확인하여 SRT 스케줄링의 평균 대기시간을 계산하여 작성하시오.
| 프로세스 | 도착시간 | 서비스시간 |
|---|---|---|
| A | 0 | 8 |
| B | 1 | 4 |
| C | 2 | 9 |
| D | 3 | 5 |
코드 자체는 깔끔하지만, 굳이 인터페이스까지 써가며 복잡하게 꼬아놓은 예제라 실무에선 이렇게 짜면 욕먹는다.
다음 Java 언어에 대한 문제이다. 아래 코드를 확인하여 출력 결과를 작성하시오.
class Main {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
ODDNumber OE = new ODDNumber();
System.out.print(OE.sum(a, true) + "," + OE.sum(a, false));
}
}
interface Number {
int sum(int[] a, boolean odd);
}
class ODDNumber implements Number {
public int sum(int[] a, boolean odd) {
int result = 0;
for(int i = 0; i < a.length; i++) {
if(odd && a[i] % 2 != 0 || !odd && a[i] % 2 == 0) {
result += a[i];
}
}
return result;
}
}
기초적인 API 사용법을 묻는 문제라 변별력은 없지만, 실무에서 실수하기 딱 좋은 포인트이긴 하다.
다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
class Main {
public static void main(String[] args) {
String str = "ITITESTSTRING";
String[] result = str.split("T");
System.out.print(result[3]);
}
}
이론적으로는 중요하지만, 실무에서 new String("A")를 직접 쓰는 사람은 거의 없으니 안심해도 된다.
다음 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class Main{
static String[] s = new String[3];
static void func(String[] s, int size){
for(int i=1; i<size; i++){
if(s[i-1].equals(s[i])){
System.out.print("O");
}else{
System.out.print("N");
}
}
for (String m: s){
System.out.print(m);
}
}
public static void main(String[] args){
s[0] = "A";
s[1] = "A";
s[2] = new String("A");
func(s, 3);
}
}
파이썬의 기초적인 리스트 연산을 묻는 문제로, 실무자라면 고민할 가치도 없는 수준이다.
다음은 파이썬에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
def func(lst):
for i in range(len(lst) // 2):
lst[i], lst[-1 - i] = lst[-1 - i], lst[i]
lst = [1, 2, 3, 4, 5, 6]
func(lst)
print(sum(lst[::2]) - sum(lst[1::2]))
실무에서 JOIN과 HAVING을 섞어 쓰는 것은 흔하지만, 시험 문제처럼 억지로 꼬아놓은 쿼리는 가독성 최악이다.
아래의 [employee] 테이블과 [project] 테이블을 참고하여 [보기]의 SQL문에 알맞은 출력 값을 작성하시오.
[employee]
| NO | first_name | last_name | project_id |
|---|---|---|---|
| 1 | John | Doe | 10 |
| 2 | Jim | Carry | 20 |
| 3 | Rachel | Redmond | 10 |
[project]
| project_id | name |
|---|---|
| 10 | Alpha |
| 20 | Beta |
[보기]
SELECT project_id FROM employee GROUP BY project_id HAVING count(*) < 2
보안의 기본기 문제로, 실무에서도 공격 패턴을 이해하는 것은 매우 중요하다.
다음 네트워크 취약점에 대한 문제이다. 아래 내용을 보고 알맞은 용어를 작성하시오.
기본적인 개념 확인 문제라 딱히 깔 건 없지만, 실무에서는 이런 표를 직접 볼 일보다 제약 조건 설정 실수를 더 많이 한다.
다음은 무결성 제약조건에 대한 문제이다. 아래 표에서 이 ( ㉠ ) 무결성을 위반했는지 작성하시오.
| S_ID | 이름 | 나이 | 전공 |
|---|---|---|---|
| 10 | 홍길동 | 25 | 컴퓨터공학 |
| 20 | 금강산 | 22 | 영문학 |
| 10 | 해커스 | 20 | 종교학 |
| NULL | 김둘리 | 29 | 기계공학 |
데이터베이스 기초 이론을 묻는 전형적인 문제로, 실무에서는 툴이 다 해주니 개념만 알면 됩니다.
다음은 데이터베이스에 관한 문제이다. 아래 내용을 읽고 알맞은 답을 보기에서 찾아 골라 작성하시오.
[보기] ㄱ. 슈퍼키 ㄴ. 외래키 ㄷ. 대체키 ㄹ. 후보키
① 외래키 ② 후보키 ③ 대체키 ④ 슈퍼키
예외 처리를 이렇게 복잡하게 꼬아놓는 것은 유지보수를 포기하겠다는 뜻입니다.
다음 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class ExceptionHandling {
public static void main(String[] args) {
int sum = 0;
try {
func();
} catch (NullPointerException e) {
sum = sum + 1;
} finally {
sum = sum + 100;
}
System.out.print(sum);
}
static void func() throws Exception {
throw new NullPointerException();
}
}
네트워크 기초 지식을 묻는 무난한 문제지만, 보기의 용어들이 다소 섞이기 쉽습니다.
다음은 네트워크에 대한 문제이다. 아래 내용을 보고 알맞은 용어를 [보기]에서 골라 작성하시오.
[보기] ㄱ. Infrastructure Network ㄴ. Firmware Network ㄷ. Peer-to-Peer Network ㄹ. Ad-hoc Network ㅁ. Mesh Network ㅂ. Sensor Network ㅅ. Virtual Private Network
ㄱ. Infrastructure Network ㄴ. Firmware Network ㄷ. Peer-to-Peer Network ㄹ. Ad-hoc Network ㅁ. Mesh Network ㅂ. Sensor Network ㅅ. Virtual Private Network
세션 하이재킹은 고전적인 공격 기법이지만, 여전히 보안의 기초를 묻는 단골 문제다.
다음 네트워크 보안과 관련된 문제이다. 괄호 안에 알맞은 용어를 작성하시오.
( )는 다른 사용자의 세션 정보를 몰래 탈취하여 시스템에 접근하는 공격 방식이다.
무결성 제약조건의 정의를 묻는 문제는 데이터베이스 과목의 정석 같은 문제다.
다음은 제약조건과 관련된 문제이다. 괄호 안에 알맞은 용어를 [보기]에서 골라 작성하시오.
[보기] 도메인 무결성, 개체 무결성, 참조 무결성
용어 정의를 묻는 전형적인 암기 문제다.
다음은 악성코드 관련된 문제이다. 설명에 해당하는 것을 [보기]에서 골라 작성하시오.
사용자가 원하지 않는 소프트웨어를 구매하도록 유도하기 위해 사회공학 기법을 활용하여 충격, 불안, 위협 등의 감정을 자극하는 악성코드 유형이다. 주로 가짜 바이러스 경고나 시스템 오류 메시지를 통해 사용자를 속여 금전적 이득이나 특정 행동을 유도한다. '겁을 주다'라는 영어 단어에서 유래되었다.
ㄱ. 스케어웨어 ㄴ. 스팸웨어 ㄷ. 애드웨어 ㄹ. 안티 스파이웨어 ㅁ. 유즈웨어 ㅂ. 그룹웨어
예외 처리의 기본을 묻는 건 좋지만, 코드 자체가 너무 작위적이라 실무 감각과는 거리가 멉니다.
다음 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
int a = 5, b = 0;
try {
System.out.print(a / b); // ①
} catch (ArithmeticException e) { // ③
System.out.print("출력1"); // ④
} catch (NumberFormatException e) {
System.out.print("출력3");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.print("출력2");
} finally {
System.out.print("출력5"); // ⑤
}
}
}
네트워크의 아주 기본적인 개념을 묻는 문제로, 정보처리기사 단골 암기 문제입니다.
다음 내용은 ARP/RARP에 대한 설명이다. 각 설명에 해당하는 것을 작성하시오.
( ① )은 네트워크상에서 IP 주소를 MAC 주소로 변환하는 프로토콜이고, ( ② )은 MAC 주소를 IP 주소로 변환하는 프로토콜이다.
| 프로토콜 | 설명 |
|---|---|
| ARP | IP 주소를 MAC 주소로 변환하는 프로토콜이다. |
| RARP | MAC 주소를 IP 주소로 변환하는 프로토콜이다. |
계산 실수를 유도하기 딱 좋은 문제로, 네트워크 기초를 탄탄히 다져야 풀 수 있습니다.
IP 주소가 192.168.35.10, 서브넷마스크가 255.255.252.0인 PC에서 브로드캐스트로 다른 IP로 정보를 전달한다 할 때 수신할 수 있는 알맞은 IP를 [보기]에서 모두 골라 작성하시오.
[보기] ㄱ. 192.168.34.1 ㄴ. 192.168.32.19 ㄷ. 192.168.35.20 ㄹ. 192.168.33.138
재귀 호출의 흐름을 손으로 따라가게 만드는 전형적인 시험용 문제다.
다음 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
int[] data = {3, 5, 8, 12, 17};
System.out.println(fun(data, 0, data.length - 1));
}
static int fun(int[] a, int st, int end) {
if (st >= end) return 0;
int mid = (st + end) / 2;
return a[mid] + Math.max(fun(a, st, mid), fun(a, mid + 1, end));
}
}
비트 연산과 구조체를 섞어 문제를 내는 건 전형적인 '알고리즘 퀴즈' 스타일이다.
다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
typedef struct {
char* name;
int score[3];
} Student;
int dec(int enc) {
return enc & 0xA5;
}
int sum(Student* p) {
return dec(p->score[0]) + dec(p->score[1]) + dec(p->score[2]);
}
int main() {
Student s[2] = {
{"Kim", {0xA0, 0xA5, 0xDB}},
{"Lee", {0xA0, 0xED, 0x81}}
};
Student* p = s;
int result = 0;
for (int i = 0; i < 2; i++) {
result += sum(&s[i]);
}
printf("%d", result);
return 0;
}
재귀 호출을 굳이 오버로딩까지 섞어서 꼬아놓은 전형적인 시험용 코드입니다.
다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
System.out.println(calc("5"));
}
static int calc(int value) {
if (value <= 1) return value;
return calc(value - 1) + calc(value - 2);
}
static int calc(String str) {
int value = Integer.valueOf(str);
if (value <= 1) return value;
return calc(value - 1) + calc(value - 3);
}
}
이론적인 스케줄링 알고리즘 비교는 시험용으로 딱 좋습니다.
스케줄링 알고리즘에 관한 다음 설명을 읽고 ①과 ②에 알맞은 스케줄링 알고리즘의 명칭을 각각 쓰시오.
① CPU burst 시간이 짧은 프로세스를 우선적으로 처리하는 스케줄링 방식이다. ② 위의 스케줄링 방식을 선점형으로 구현한 형태로 실행 중인 프로세스보다 더 짧은 burst 시간을 가진 프로세스가 도착하면 CPU를 선점한다.
계산 문제인데 실수 유도형이라 꼼꼼함이 생명입니다.
다음은 IP 주소와 서브넷마스크에 관한 문제이다. 호스트의 IP 주소가 223.13.234.132이고 서브넷 마스크가 255.255.255.192일 때 주어진 정보를 참고하여 괄호 안에 들어갈 알맞은 값을 쓰시오.
AJAX가 나온 지가 언젠데 아직도 이런 정의를 묻는 건지 모르겠지만, 기본기 확인용으로는 적절하다.
다음은 웹 데이터 방식에 관한 문제이다. 아래 설명을 읽고 괄호 안에 들어갈 용어를 쓰시오.
( ㉠ )은 웹 페이지 전체를 다시 불러오지 않고 JavaScript와 XML(또는 JSON)을 이용하여 일부 콘텐츠만 비동기적으로 갱신할 수 있는 기술이다. ( ㉠ )은 HTML만으로는 구현하기 어려운 동적인 기능들을 가능하게 하여 사용자가 웹 페이지와 보다 자유롭게 상호작용할 수 있도록 해주는 웹 개발 기법이다.
손으로 간트 차트 그리는 게 무슨 의미가 있나 싶지만, OS 원리를 이해하는 데는 도움이 된다.
라운드로빈(RR) 방식을 이용하고 아래 내용을 참고하여 평균 대기 시간을 구하시오.
| 프로세스 | 도착시간 | 실행시간 |
|---|---|---|
| P1 | 0 | 8 |
| P2 | 1 | 4 |
| P3 | 2 | 9 |
| P4 | 3 | 5 |
Java의 참조 개념을 묻는 무난한 문제입니다. 실무에서도 객체 참조 관리는 매우 중요합니다.
다음은 Java 언어의 문제이다. 아래 코드를 보고 알맞은 출력을 작성하시오.
public class Main {
public static class BO {
public int v;
public BO(int v) {
this.v = v;
}
}
public static void main(String[] args) {
BO a = new BO(1);
BO b = new BO(2);
BO c = new BO(3);
BO[] arr = {a, b, c};
BO t = arr[0];
arr[0] = arr[2];
arr[2] = t;
arr[1].v = arr[0].v;
System.out.println(a.v + "A" + b.v + "B" + c.v);
}
}
파이썬의 유연함을 테스트하려는 의도는 알겠으나, 실무에서 이렇게 짜면 동료들이 코드 리뷰 때 화낼 겁니다.
다음은 Python 언어의 문제이다. 아래 코드를 보고 알맞은 출력값을 작성하시오.
lst = [1, 2, 3]
dst = {i: i * 2 for i in lst}
s = set(dst.values())
lst[0] = 99
dst[2] = 7
s.add(99)
print(len(s & set(dst.values())))
C언어의 문자열 처리를 이렇게 꼬아놓으면 유지보수 담당자가 퇴사합니다.
다음 C 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
int main() {
char str[] = "REPUBLICOFKOREA";
int a = 0;
while (str[a] != '\0') {
a++;
}
putchar(str[a - 2]);
return 0;
}
인터페이스 문법을 모르면 Java를 할 수 없으니 이건 기본 소양 테스트다.
다음은 Machine이라는 인터페이스를 정의하고 WashingMachine 클래스에서 해당 인터페이스를 사용하고자 한다. 빈칸에 들어갈 올바른 키워드를 작성하시오.
interface Machine {
void run();
}
class WashingMachine ( ) Machine {
private String name;
public WashingMachine() {
this.name = "LG Washer";
}
public void run() {
System.out.println("Washing machine running");
}
}
public class Main {
public static void main(String[] args) {
WashingMachine wm = new WashingMachine();
wm.run();
}
}
보안의 기초 중의 기초라 틀리면 곤란하다.
다음 설명에 해당하는 인증 기술을 쓰시오.
이걸 틀리면 Java로 객체 지향 코드를 짤 자격이 없다.
다음은 Java의 상속과 생성자 호출에 관한 코드이다. 밑줄에 알맞은 단어를 작성하시오.
class Rectangle {
int width, height;
Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}
class Square extends Rectangle {
Square(int a) {
________(a, a);
}
int getSquareArea() {
return width * height;
}
}
public class Main {
public static void main(String[] args) {
Square sq = new Square(10);
System.out.println(sq.getSquareArea());
}
}
이걸 모르면 요즘 웹 개발은 불가능하다.
다음은 인증 및 자원 접근 방식에 대한 설명이다. 알맞은 용어를 쓰시오.
코드 가독성을 해치는 전형적인 시험용 꼬아내기 문제네요.
다음 C 코드에 대한 문제입니다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
#include <stdio.h>
int main() {
int x=7, y=4, z;
z = y % 3 < 3 ? 2 : 1;
z = z & z >> 1;
z = x > 5 && z <= 3 ? z * x : z / x;
printf("%d", z);
return 0;
}
Enum의 기본 동작을 이해하고 있는지 묻는 무난한 문제입니다.
다음은 Java에 대한 코드다. 알맞은 출력값을 작성하시오.
enum Tri {
A("A"), B("ab"), C("ABC");
private String code;
Tri(String code) {
this.code = code;
}
public String code() {
return code;
}
}
public class Main {
public static void main(String[] args) {
Tri t = Tri.values()[1];
System.out.print(t.code());
}
}
SQL 쿼리 결과 맞추기는 실무에서도 디버깅할 때 자주 겪는 일이라 꽤 실용적이다.
다음은 SQL에 관한 문제이다. 아래 A테이블을 참고하여 쿼리의 결과를 작성하시오.
[A테이블]
| col1 | col2 |
|---|---|
| 2 | null |
| 3 | 6 |
| 2 | 3 |
| null | 3 |
| 4 | 5 |
SELECT count(col2) FROM A WHERE col1 IN (2, 3) OR col2 IN (3, 5)