이전 포스팅에 이어서 2021년 3회 정보처리기사 실기 기출을 11번부터 풀어보도록 하겠습니다.
11. 다음 자바 코드에 대한 알맞은 출력값 쓰기
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 == c ^ d != a) {
System.out.println(a);
} else {
System.out.println(d);
}
}
}
}
11번 문제도 1번 문제와 마찬가지로 자바 코드에 대한 결과값을 적는 문제가 출제되었습니다. 사실 코드의 의미를 파악하기 보다 연산자 문제에 가까워서 정말 이렇게 코드가 복잡하게 나왔을까 의문이 들긴 하지만, 그나마 if~else문이기 때문에 앞에서 차례대로 조건을 확인해가며 거짓이면 건너뛰는 형태로 푼다면 그리 어렵지 않을 것 생각됩니다. 다만, 비트 연산자인 '&', '|', '^'를 모른다면 이 문제는 풀 수 없겠지요. 특히 XOR 연산을 의미하는 '^'를 모르실 수 있기 때문에 많이 틀리셨을거라 예상됩니다.
일단 비트 연산자에 대해 집고 넘어가보죠. 보통 비트 연산을 공부할 때 AND와 OR을 기본적으로 배우셨을 겁니다. AND 연산자의 경우 두 비트가 모두 True(1)일 때 True(1)이 나오고, OR 연산은 둘 중 하나의 비트만 True(1)라면 True(1)가 출력됩니다. XOR의 경우 두 비트가 다를 경우에만 True(1)이 출력되는데 False(0)와 True(1)를 XOR 하는 경우에 True(1)가 나오죠. 그리고 보통 제어문의 조건절에서는 논리 연산자(||, &&)를 사용하지만, 자바에서는 비트 연산자를 논리 연산자로도 사용이 가능합니다. 또 한 가지 더 아셔야할 것은 자바에서는 '==' 나 '!=' 같은 비교 연산자가 비트 연산자보다 우선 순위가 높다는 건데요. 수식 계산을 할 때 더하기 보다 곱하기가 먼저 계산되는 것과 같은 원리 입니다.
그래서 처음 if문의 조건절을 처음부터 보시면 '(a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)'로 세 부분으로 나눌 수 있죠. 첫 번째 '(a == 2 | a == c)' 부분을 보시면, a==2 부분은 a가 3이기 때문에 때문에 False(0), a==c(3==3)가 맞기 때문에 True(1)인데 정리해서 'False | True'이니 첫 부분은 True입니다. 두 번째 부분인 '!(c > d)'를 보면 c가 작기 때문에 False면서 !False는 True가 됩니다. 마지막 '(1 == b ^ c != d)'에서는 연산자 우선 순위를 적용하여 1==b(1==4)는 False, c!=d(3!=5)는 True가 되면서, False ^ True는 True가 되죠. 그래서 종합해보면 'True & True & True'는 True가 되기 때문에 처음 if문의 조건은 참이 됩니다.
처음 if문 안쪽으로 들어오면 'a=b+c'를 수행하여 a가 7로 바뀌고, 다음 if문의 조건절에서는 '7 == b ^ c != a'이고 마찬가지로 연산자 우선순위를 적용하여 7==b(7==4)는 False, c!=a(3!=7)은 True가 됩니다. 즉 'False ^ True'는 Ture가 되어 안쪽의 if문도 True가 되고 첫 번째 println 함수가 호출되면서 a 값인 7이 출력되죠.
11번 풀이가 굉장히 길었는데, 사실 연산자 우선순위까지 외우고 있지 않다면 풀기 어려운 문제입니다. 저도 따로 외우고 있지는 않아서 만약 이런 문제가 시험에서 출제되었다면 적당히 때려 맞춰 풀었을 것으로 생각됩니다. 길게 풀이를 진행했지만 굳이 시간을 들여서 연산자 우선순위까지 공부하시는 건 너무 시간이 많이 걸리니 웬만하시면 패스하길 권장드립니다.
12. 다음 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);
}
이번에는 C 언어 코드에 대한 문제인데, 실기 기출을 보다보면 생각보다 코딩 문제가 많이 출제됩니다. 하지만 대부분 C 언어 문제는 배열과 포인터를 잘 알고 있다면 무난하게 풀 수 있을 정도로 출제되고 있으며, 이번에는 이중 포인터가 나왔기 때문에 좀 어려운 편에 속한다고 말씀드릴 수 있을 것 같네요. 우선 포인터에 대한 개념과 포인터 배열, 이중 포인터까지 설명드리면서 문제를 풀어보도록 하겠습니다.
C 언어를 처음 배우게 되면 가장 헷갈리는 부분이 포인터 입니다. 포인터는 쉽게 말해서 변수의 주소와 관계가 있습니다. 일반적으로 int형 변수 a를 선언하면 메모리에 4바이트짜리 공간이 할당되는데, 이 변수가 저장되어 있는 메모리에 접근하기 위한 주소가 필요하겠죠. 이 메모리 주소를 얻을 때 보통 엠퍼센트라고 해서 '&'를 붙이면 메모리 주소를 얻을 수 있습니다. 위의 코드 중 "&a"가 변수 a의 메모리 주소를 나타냅니다. 물론 메모리가 어떻게 생겼고 주소 형식은 어떤지도 알아야하지만 이런 어려운 내용은 여기서 넘어가도록 하고 최소한 코드를 이해할 수 있도록 축약해서 설명을 이어가죠.
그럼 이 메모리 주소에 접근하는 방법에 대해 보겠습니다. C언어에서는 참조 연산자라는 일명 에스크리터 '*'를 통해서 메모리 주소에 접근할 수 있는데요. 그래서 먼저 int형 변수 a에 0으로 초기화 시켜놓는 "int a=0;"를 먼저 선언했다고 칩시다. 그리고 int형 메모리 주소를 저장할 수 있는 int형 포인터 a를 "int* pa;"과 같이 정의하고, a의 주소를 pa 변수에 "pa=&a;"처럼 넣게되겠죠. 그럼 pa는 앞에서 정의한 int형 변수 a의 메모리 주소값을 가지고 있을테고, "*pa=1;"과 같이 a의 메모리를 가지고 있는 pa 변수에 참조 연산자를 통해 접근하여 0으로 저장된 값을 1로 바꾸게 됩니다.
위의 설명이 어려우실 수 있겠지만, 단순하게 포인터는 변수의 메모리 주소를 저장할 수 있고 값을 변경할 수 도 있구나라고 생각하시면 될 것 같습니다. 그럼 포인터 배열은 무엇일까요? 일단 배열은 그나마 쉽게 배우셨을꺼라고 생각합니다. 여러 개의 변수를 저장할 수 있는 연속된 형태로 저장된 데이터라고 알고 계실텐데요. 그래서 "int arr[3]"과 같이 정의하면 int형 변수를 3개 담을 수 있는 arr이라는 이름의 배열이 만들어지죠. 그럼 포인터 배열은 쉽게 생각해서 여러 개의 포인터를 저장할 수 있는 배열이다..라고 생각하면 됩니다. 메모리 주소를 여러 개 담을 수 있다는 의미죠. 그럼 위에서 "int * arr[3]"과 같이 정의한 것은 int형 포인터를 3개 담을 수 있을겁니다.
int형 변수 a, b, c에는 각각 12, 24, 36이 저장되어 있고, 포인터 배열 arr에 차례대로 a의 메모리 주소, b의 메모리 주소, c의 메모리 주소를 저장하고 있죠. 여기까지 이해하셨으면 마지막 printf문에서 무엇을 출력하는지 확인해보겠습니다. 먼저 "arr[1]"을 의미하는 것은 첫 번째가 아닌 두 번째 요소인 b의 주소입니다. 배열에서 배웠던 인덱스(index)는 1이 아닌 0부터 시작한다는 것을 모두 알고 계시리라 생각합니다. 그렇기 때문에 "*arr[1]"은 arr[1]이었던 b의 메모리 주소에 참조 연산자를 붙이니 b에 저장되어있던 24가 나올테고요. "**arr"은 이중포인터 개념이지만 "배열의 이름은 배열의 시작 주소이다"라는 것을 아신다면, "*arr"이 "arr[0]"을 의미하기 때문에 "**arr"은 a에 저장된 값인 12를 의미한다고 볼 수 있겠죠. 그래서 "**arr+1"은 12+1이기 때문에 13이고 24와 13을 더한 37이 위의 문제의 답이 되겠습니다.
굉장히 길게 풀이를 했지만, 포인터의 개념만 정확하게 잡으신다면 어떻게 꼬아서 출제된다고 하더라도 충분히 푸실 수 있으실 거라 생각합니다. 하지만 대부분 C를 처음 배우실 때, 포인터에서 막혀 대충 넘어가거나 포기하는 분들이 많다는 것을 감안하면, 이 문제를 정확하게 풀이할 수 있는 수험자들은 많지 않겠죠. 하지만 C 언어 문제가 합격을 가르기 위한 문제로 출제된다면 대다수 포인터로 출제될 것으로 보이니, 시간이 되신다면 꼭 익히고 가시는 것을 권장드립니다.
13. DB 테이블이 다음과 같이 정의되어 있을 때 SQL 명령을 실행한 결과 쓰기
13번은 SQL 쿼리문에 관한 문제가 출제되었습니다. 기본적으로 SELECT부터 시작해서 COUNT 함수, 테이블을 합치는 CROSS JOIN, WHERE 조건절에서 부분적으로 일치하는 칼럼을 찾는 LIKE 구문까지 알고 계셔야 합니다. 저 같이 태생적으로 데이터베이스에 약하신 분이라면 이 문제는 패스하시겠지만, SQL 개발자 자격증을 준비하셨던 분들이라면 충분히 쉽게 풀 수 있을 것이라 생각합니다.
일단 COUNT 함수는 테이블의 칼럼 개수를 가져올 때 쓴다는 것을 아실테고, CROSS JOIN은 한 쪽 테이블의 모든 행들과 다른 테이블의 모든 행을 조인할 때 사용합니다. 예를 들어 T1 테이블에 A, B가 저장되어 있고, T2 테이블에 C, D가 저장되어 있다면, 이 둘을 CROSS JOIN 했을 때 결과는 AC, AD, BC, BD가 됩니다. 어떤 느낌이신지 아셨다면 13번 문제에서 T1 테이블과 T2 테이블을 CROSS JOIN 하였을 때 나오는 결과를 예측하실 수 있으시겠죠.
T1과 T2의 테이블을 크로스 조인하면 위와 같은 결과가 나오게 됩니다. 참고로 크로스 조인의 컬럼 개수는 T1의 컬럼 개수와 T2의 컬럼 개수를 곱한 값이라는 것을 알아두시기 바랍니다. 그럼 다음으로 조건절인 WHERE에서는 A의 NAME이 B의 RULE 패턴과 일치하는지 물어보고 있습니다. 보통 일치하는 문자열을 찾을 때 "WHERE 컬럼 LIKE 패턴"으로 사용이 되는데, 여기서는 LIKE의 패턴이 앞에서 T1 테이블의 별칭으로 정의된 B의 RULE에 저장되어 있다고 생각하시면 됩니다.
우선 LIKE의 패턴에서 '%'는 모든 문자를 의미하고, '_'는 한 글자를 의미합니다. 만약 패턴이 "a%"라면 "ab", "abc", "a123" 등이 검색될 것이고, "a_"는 "ab", "a1", "aA" 등이 검색되겠죠. 그래서 다시 문제로 돌아와서 패턴이 "s%"인 경우 크로스 조인한 테이블에서는 "smith"와 "scott"이 만족하고, "%t%" 패턴 또한 t 앞, 뒤로 아무 문자나 올 수 있기 때문에 "smith", scott"이 만족하여, 결과적으로 총 4개의 행이 출력될 것입니다.
위에서 설명한 내용들을 이해하시고, OUTER JOIN, INNER JOIN에 대한 개념들도 숙지하시고 계신다면, 웬만한 SQL 쿼리 문제는 충분히 맞출 수 있을 것으로 생각됩니다. 하지만 공부할 시간이 부족하시다면 복잡한 SQL 쿼리 문제는 과감하게 스킵하고, 이전 포스팅의 3번 문제와 같이 DML, DDL, DCL이나 정규화 같은 SQL 개념 문제를 준비하는 것도 하나의 전략이 될 수 있을 것 같습니다.
14. 다음 파이썬 코드에 대한 알맞은 출력값 쓰기
a, b = 100, 200
print(a==b)
14번은 파이썬 코드에 관한 문제로 굳이 설명하지 않아도 답은 "False"라고 생각하실 수 있을 것 같습니다. 다만 파이썬은 C 언어나 자바와 다르게 자료형을 지정하지 않으면서, "a, b=100, 200"과 같이 치환 형태처럼 값을 다중으로 저장할 수 있다는 점과 print문을 사용하여 '==', '!="과 같은 비교연산자의 결과를 바로 보여준다는 것을 아시고 넘어가셨으면 좋을 것 같습니다. 여기서는 a와 b가 다르기 때문에 거짓을 의미하는 "False"가 출력되며, 만약 첫 문자를 소문자로 적은 "false", "0"을 적으신 분들은 틀리게 하지 않았을까 생각됩니다. 이렇게 파이썬 문제도 종종 출제되며 문법이 어렵지 않기 때문에 숙지하셔서 전략적으로 점수를 노리시는 것을 추천드립니다.
15. 다음의 설명 중 괄호 안에 알맞은 답을 작성하기
( ) 다이어그램은 문제 해결을 위한 도메인 구조를 표현하며, 보이지 않는 도메인 내부의 개념과 같은 추상적인 부분을 기술하고, 소프트웨어의 설계 및 구현 설명을 목적으로 사용되어 형식은 속성(attribute)와 메서드(method)가 있음
15번 문제는 UML에 관한 문제입니다. 이전 포스팅의 7번에서도 언급했었지만 UML 문제는 테스트 방법론과 같이 빈번하게 출제되는 문제이기 때문에 UML 관계와 다어어그램 종류 몇 가지는 반드시 알고 계셔야 합니다. 위의 설명에서는 속성과 메서드가 있다는 특징을 가지고 답이 클래스 다이어그램인 것을 유추할 수 있습니다. 클래스 다이어그램에서는 시스템 내 클래스의 정적인 구조를 나타내고, 변수에 해당하는 속성과 행위(동작)을 나타내는 메서드가 존재합니다. 작년 기출 문제에서는 표현된 다이어그램이 어떤 것인지 묻는 문제가 출제되었는데, 실기 수험서를 보시면서 각각의 다이어그램을 직접 그릴 수는 없더라도 특징을 꼭 아셔서 위와 같은 문제를 맞추시기 바랍니다.
이번 포스팅에서는 11번 부터 15번까지 문제 풀이를 했으며, 글이 길어지는 관계로 다음 포스팅에서 16번 부터 20번까지 풀이를 하도록 하겠습니다. 감사합니다.
'Certificate' 카테고리의 다른 글
오탐과 미탐(False Positive, False Negative) (0) | 2022.07.31 |
---|---|
쉽게 풀어보는 정보처리기사 실기 기출 2021년 3회 (3) (2) | 2022.05.08 |
쉽게 풀어보는 정보처리기사 실기 기출 2021년 3회 (1) (0) | 2022.01.11 |
댓글