“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”
- Frederick Philips Brooks
Mythical Man-Month 저자
자바스크립트 재시험 문제풀이
01. 다음의 결과 값을 작성하시오.
{
const str = "javascript refercence";
str.indexOf("javascript");
str.indexOf("javascripts");
str.indexOf("j");
str.indexOf("J");
str.indexOf("a");
str.indexOf("ja");
str.indexOf("jv");
str.indexOf("refercence");
str.indexOf("r");
str.indexOf("re");
str.indexOf("javascript", 0);
str.indexOf("javascript", 1);
str.indexOf("refercence", 0);
str.indexOf("refercence", 11);
str.indexOf("refercence", 12);
str.indexOf("r", 7);
str.indexOf("r", 12);
}
문제풀이
indexOf()는 문자열을 검색하여, 주어진 값과 일치하는 첫번째 위치값(index)을 반환합니다. 따라서 문자열을 검색하여, 주어진 값과 일치하는 것이 없으면 -1을 반환하며 대소문자를 구분합니다.따라서 문자열이 존재하면 0, 존재하지 않으면 -1로 구분합니다.
여기서 ("javascript", 0)에서 0은 index 즉 위치 값으로 그 위치 값 중심으로 어디에 위치하고 있느냐를 묻는 것입니다.
그래서 문제들을 보면
"javascript refercence" 에서 하나하나 풀어보자면
str.indexOf("javascript", 0); |
javascript가 인덱스 위치 0번째 중심으로 몇번째에 존재하는가? |
str.indexOf("javascript", 1); | javascript가 인덱스 위치 1번째 중심으로 몇번째에 존재하는가? |
str.indexOf("refercence", 0); | refercence가 인덱스 위치 0번째 중심으로 몇번째에 존재하는가? |
str.indexOf("refercence", 11); | refercence가 인덱스 위치 11번째 중심으로 몇번째에 존재하는가? |
str.indexOf("refercence", 12); | refercence가 인덱스 위치 12번째 중심으로 몇번째에 존재하는가? |
str.indexOf("r", 7); | r이 인덱스 위치 7번째 중심으로 몇번째에 존재하는가? |
str.indexOf("r", 12); |
r이 인덱스 위치 12번째 중심으로 몇번째에 존재하는가? |
정답은 차례대로 0, -1, 11, 11, -1, 11, 15 입니다.
02. 다음의 결과 값을 작성하시오.
{
function func(){
console.log("함수1가 실행되었습니다.");
}
function callback(str){
console.log("함수2가 실행되었습니다.");
str();
}
callback(func);
}
문제풀이
다음은 콜백함수에 관한 문제입니다. 콜백함수는 다른 함수에 인자로 전달되어, 이후에 호출되는 함수를 말합니다. 일반적으로 비동기적으로 실행되는 함수에서 자주 사용됩니다. 쉽게 설명하자면 어떤 작업을 수행한 후 그 결과에 대해 다른 작업을 해야하는 경우, 그 결과를 전달받아 실행할 함수를 미리 정해두는 것입니다.
따라서 callback함수에 str을 함수 2가 실행되었습니다. 라는 결과를 먼저 지정해두고 다음에 함수 1이 실행되었습니다 라는 전달 받을 수 있습니다. 그래서 출력이 되는 순서가
"함수 2가 실행되었습니다." 후에 "함수 1가 실행되었습니다."라는 결과가 나올 수 있습니다.
03. 다음의 결과 값을 작성하시오.
{
function func(){
let a = [];
for(i=1; i<=5; i++){
a += [i];
}
console.log(a);
}
func();
}
문제풀이
함수를 실행시키는데 변수 a 안에 빈배열이 [ ] 생성 되었습니다. 그리고 for문을 사용해서 1,2,3,4,5까지 출력이 되는데 이때
a +=[ i ] 즉 [ ] += [ i ] 입니다. 차례대로 1, 2, 3, 4, 5가 [ i ]의 값으로 들어오기 때문에
a의 값은 1,2,3,4,5가 출력됩니다.
04. 다음의 결과 값을 작성하시오.
{
function func(num, name, word){
this.num = num;
this.name = name;
this.word = word;
}
func.prototype = {
result1 : function(){
console.log(this.num + ". " + this.name + "가 "+ this.word + "되었습니다.");
},
result2 : function(){
console.log(this.num + ". " + this.name + "가 "+ this.word + "되었습니다.");
},
result3 : function(){
console.log(this.num + ". " + this.name + "가 "+ this.word + "되었습니다.");
}
}
const info1 = new func("1", "함수", "실행");
const info2 = new func("2", "자바스크립트", "실행");
const info3 = new func("3", "제이쿼리", "실행");
info1.result1();
info2.result2();
info3.result3();
}
문제풀이
객체 리터럴 함수로 프로토타입 함수에서 밖으로 나온 함수들을 다시 중괄호를 활용해서 객체로 넣어준 함수 유형입니다.
따라서 인스턴스 함수 즉 객체 지향 프로그래밍에서 클래스(class)를 이용하여 생성된 실체(object)를 말합니다. 클래스는 객체를 생성하기 위한 일종의 템플릿(template)이며, 인스턴스트는 그 템플릿을 이용하여 생성된 실체입입니다.
따라서 실행이 될때도 객체가 실행되는 것처럼 . 을 사용해서 실행을 시킵니다. 실행된 값으로는
"1. 함수가 실행되었습니다." "2.자바스크립트가 실행되었습니다." "3. 제이쿼리가 살행되었습니다." 로 차례대로 출력됩니다.
05. 다음의 결과 값을 작성하시오.
{
function func(num, name, word){
this.num = num;
this.name = name;
this.word = word;
}
func.prototype.result = function(){
console.log(this.num + ". " + this.name + "가 "+ this.word + "되었습니다.");
}
const info1 = new func("1", "함수", "실행");
const info2 = new func("2", "자바스크립트", "실행");
const info3 = new func("3", "제이쿼리", "실행");
info1.result();
info2.result();
info3.result();
}
문제풀이
프로토타입 함수는 자바스크립트에세 객체가 가지는 프로토 타입 객체에 함수를 추가하여 해당 객체를 생성하는 모든 인스턴스에서 공유하여 사용할 수 있는 함수를 말합니다.
자바스크립트에서 객체는 내부적으로 '[[Prototype]]'이라는 숨겨진 속성을 가지고 있습니다. 이 속성은 해당 객체의 프로토 타입 객체를 가리키며, 이 프로토 타입 객체에 속성과 메서드를 추가 할 수 있는데 이러한 메서드를 프로토 타입 함수라고 부릅니다.
프로토 타입 함수를 정의하기 위해서는, 해당 객체의 프로토타입 객체에 메서드를 추가하면 됩니다.
위 코드에서 , 'func'라는 생성자 함수를 정의하고 'func.prototype'객체에 'result' 메서드를 추가하고 info1, info2, info3 세개의 인스턴스를 생성하여 각각 result 메서드를 호출하는 코드입니다.
각각 인스턴스는 func 생성자 함수를 사용하여 생성이 됩니다. func생성자 함수는 num,name,word라는 세 개의 이자를 받아서 this라는 객체에 해당 속성들을 할당합니다.
그리고 func.prototype객체에 result 메서드를 추가하여, 모든 func 인스턴스에서 result 메서드를 공유할 수 있도록 합니다. 메서드는 this.num, this.name, this.word 속성을 사용하여 해당 객체의 정보를 출력하는 기능을 가지고 있습니다.
마지막으로 info1.result( ), info2.result( ), info3.result( ) 코드는 각각 인스턴스에서 result라는 메서드를 호출하여 해당 객체의 정보를 출력합니다. 출력되는 정보는 num,name,word속성에 해당하는 값이므로 차례대로
"1. 함수가 실행되었습니다." "2.자바스크립트가 실행되었습니다." "3. 제이쿼리가 살행되었습니다." 가 출력됩니다.
06. 다음의 결과 값을 작성하시오.
{
function func(index){
console.log("함수가 실행되었습니다." + index);
}
function callback(num){
for(let i=0; i<=5; i++){
num(i);
}
}
callback(func);
}
문제풀이
func 함수와 callback함수를 정의하고, callback함수에서 func함수를 호출하는 코드입니다.
func함수는 하나의 인자 index를 받아서, 해당 인자와 함께 "함수가 실행되었습니다."메시지를 출력합니다.
callback함수는 인자 num을 받아서 0부터 5까지의 수를 차례대로 num 함수를 출력합니다. 여기서 num함수는 func 함수 입니다.
마지막으로 callback(func) 코드는 'callback'함수를 호출하면서 'func'함수를 인자로 전달합니다. 따라서 callback함수는 func함수를 0부터 5까지 호출하게 됩니다. 따라서 실행하면 함수가 실행되었습니다.0부터 함수가 실행되었습니다.5까지 출력됩니다.
07. 다음의 결과 값을 작성하시오.
{
let num = 0;
do {
console.log("실행되었습니다.");
num++;
} while (num <= 3);
}
문제풀이
do-while문을 사용하여 실행시킨 반복문입니다. 여기서 변수 num을 1씩 증가 시켜고 3이하일 동안 반복하게 되는데 0부터 실행되어서
0,1,2,3으로 실행되어서 총 4번의 "실행되었습니다."가 출력됩니다.
08. 다음의 결과 값을 작성하시오.
{
const arr = [100, 200, 300, 400, 500];
const text1 = arr.join("*");
arr.push("600");
const text3 = arr.join("");
arr.pop();
const text4 = arr.join(" ");
console.log(text1);
console.log(text3);
console.log(text4);
}
문제풀이
차례대로 출력되는 자바스크립트 이므로 배열 arr 안의 값들이 먼저 join()이라는 배열메서드로 인하여 배열 요소를 문자열로 결합하여 문자열로 반환시켜서
text1 은 100*200*300*400*500 이 출력된 후
다음에 arr.push("600")이 존재하므로 push() 배열 메서드는 배열 마지막 요소에 요소를 추가하므로 600이 추가된 후
text3 에서 join("")값은 배열값이 붙어서 나오는 값이므로 100200300400500600으로 출력이 됩니다.
다음으로 arr.pop(); 배열 메서드는 마지막 요소를 삭제해주므로 600이 삭제가 된 후
text4 에서 (" ")값은 배열값이 떨어져 나오는 값이므로 100 200 300 400 500 으로 출력이 됩니다.
09. 다음의 결과 값을 작성하시오.
{
let a, b = 10;
for(let i=0; i<5; i++){
a = i;
b -= a;
}
console.log(a, b)
}
문제풀이
변수 let a,b = 10입니다. for문 반복문을 통해서 차례대로 0,1,2,3,4로 출력이 되는데 a는 10 이었는데 i의 값과 같아 지므로
0,1,2,3,4로 변합니다. 따라서 b또한 -=a의 값으로 차례대로 출력됩니다.
10 -= 0 = 10
10 -= 1 = 9
9 -= 2 = 7
7-= 3 = 4
4-= 4 = 0
따라서 a의 값은 4 b의 값은 0 이 됩니다.
10. 다음의 결과 값을 작성하시오.
{
function func(){
let i = 20, j = 20, k = 30;
i /= j;
j -= i;
k %= j;
console.log(i);
console.log(j);
console.log(k);
}
func();
}
문제풀이
func함수 안에 변수 i , j , k의 값을 넣어둔 후 /는 나누기 -는 빼기 %나머지 값을 구하는 연산자를 사용한 후 i,j,k의 값을 출력하는 코드입니다.
먼저 숫자를 넣어서 해석하면
20 /(나누기) 20 = 1
먼저 i의 값은 1로 출력이 됩니다. 따라서 i는 1로 반환됩니다. 그래서 j -= i는
20 -(빼기) 1 = 19 로 값이 출력됩니다.
따라서 j의 값은 19가 되는데 이때 j는 19값으로 반환됩니다. 그래서 k%=j는
30 %(나머지값) 19 의 나머지 값은 11이 남게 됩니다.
따라서 i = 1, j=19, k=11로 출력됩니다.
11. 다음의 결과 값을 작성하시오.
{
let k = 1;
let temp;
for(let i=0; i<=3; i++){
temp = k;
k++;
console.log(temp + "번");
}
}
문제풀이
for문을 사용한 반복문 입니다. 변수 k는 1의 값을 가지고 있고 또 다른 변수 temp가 선언 된 후
for 을 사용해서 총 0부터 3까지 4번 출력이 되는데 이 때 차례대로 계산을 하게 되면 temp의 값은 k가 된다고 합니다.
k의 값은 1이므로 1이 출력되면 temp의 값은 1 이 되고 k는 ++가 되어 2이 되고 다시 for문으로 2가 출력되면 temp의 값은 2가 되고 다시 k는 3이 되어서 출력되면 temp는 3이 되고 다시 ++가 되어서 4가 되는데 3번까치 출력이 되어 k는 4까지 출력되어서 temp가 출력하는 값은 1번,2번,3번,4번입니다.
12. 다음의 결과 값을 작성하시오.
{
let num1 = 3;
let num2 = 7;
if(++num1 > 5 || num2++ < 1){
console.log(num1);
}
console.log(num2)
}
문제풀이
먼저 변수 num1 과 num2의 값을 할당한 후 if문을 이용해서 실행되는 코드입니다. 여기서 | | 는 OR 이므로 둘중에 하나가 트루이면 실행이 되는 논리연산자 입니다. 조건문을 풀어보면
4 > 5 둘중에 하나가 트루 8<1 인데 둘다 false이므로 num1의 값은 실행되지 않고 num2의 값이 실행되는데
이 때 num2의 값은 7에서 1이 더해져서 8이 출력됩니다.
13. 다음의 결과 값을 작성하시오.
{
let num = [1, 5, 1, 2, 7, 5];
for(let i=0; i<6; i++){
if((i+2) % 2 == 0){
console.log(num[i]);
}
}
}
문제풀이
num이라는 변수 값 1,5,1,2,7의 값이 할당이 된 후 for문 반복문이 실행됩니다. 이 때 조건문 if가 붙어서 for문에서 출력된 i의 값이 +2가 된 후 거기서 짝수만 출력이 되는 조건이 붙었습니다. 여기서 보며 0부터 6까지 +2이 붙으면 2,3,4,5,6,7이 나오게 되는데 여기서 짝수는 2,4,6 입니다 여기서 num[i] num의 배열 안의 값을 불러와야 하므로 인덱스 값으로 2,4,6은 0,2,4번째 위치하고 있는 요소의 인덱스 값이므로 num안의 배열에서 1,1,7이 출력됩니다.
14. 다음의 결과 값을 작성하시오.
{
let num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for(let i=0; i<=9; i++){
switch(num[i] % 2){
case 1:
console.log(num[i]);
break;
default:
console.log("**");
}
}
}
문제풀이
num의 배열 값이 할당 된 후 반복문 for문과 switch문이 있는 코드 입니다. switch문은 if문과 동일한 형태로 여기서 조건문을 풀어서 해석하자면 num[i] % 2 == 1로 해석할 수 있습니다. 그래서 홀수의 값이 출력 되는데 default는 else와 동일하므로 아닐 경우 **가 문자열로 출력되는 조건을 말하고 있습니다. 그래서 출력하면
**1**3**5**7**9로 출력됩니다.
15. 다음의 결과 값을 작성하시오.
{
let cnt = 0;
let sum = 0;
for(let i=0; i<=7; i++){
if(i%2 == 1){
cnt++;
sum += i;
}
}
console.log(cnt + ", "+sum/2);
}
문제풀이
변수 cnt = 0 , sum = 0으로 값이 주어진 후 for문 반복문을 통해서 값이 출력되는 코드입니다. 따라서 for문을 살펴보면 0번에서 7번까지 출려되는데 여기서 if문 조건문이 홀수일 경우에 cnt++ 가 되고 sum은 += i;의 값으로 출력이 됩니다.
따라서 홀수로 나오는 값이 4개이므로 cnt는 4가 되고 sum의 값은 풀이해보면
0 += 1 = 1
1 += 3 = 4
4 += 5 = 9
9 += 7 = 16
으로 sum은 16이 할당 되는데 실행문에서 /2가 붙어 있어서 2로 나누면 8이 출력이 되어서
4,8로 출력이 됩니다.
16. 다음의 결과 값을 작성하시오.
{
let data = [70, 80, 75, 60, 90];
let best = 1;
let score = 0;
for(let i=0; i<data.length; i++){
if(data[i]>=80) {
best++;
}
if(score < data[i]) {
score = data[i];
}
}
console.log(best, score)
}
문제풀이
먼져 배열 data는 70,80,75,60,90으로 할당 되었고 변수 best는 1, score은 0으로 선언되었습니다. 그리고 for문 반복문을 이용해서 출력하는데 이 때 data.length즉 갯수만큼 반복이 되는데 갯수는 5개 이므로
for (let i=0; i<5; i++)로 다시 써 줄 수 있습니다. 이 때 조건문 if문을 사용해서 data[i] data 배열 요소의 값들이 80보다 크거나 같으면 best는 ++ 가 된다고 합니다. 여기서 data 배열 요소의 값에서 80보다 크거나 같은 요소들은 90하나밖에 없으므로 변수 best 1은 ++가 되어서 2로 한번밖에 실행이 되지 않습니다.
또 다른 조건문으로 score은 <data 배열 요소의 값들과 같다고 합니다. 여기서 하나씩 대입하여 출력하게 된다면
먼저 data배열 요소 70을 불러오면 score은 70이 되고 반복문이므로 다시 80을 가져오면 score은 80이 됩니다. 그리고 차례대로 75, 60을 가져와도 조건문에 적합하지 않아서 계속 80으로 지키고 있다가 90이 들어오면서 score의 값은 90이 됩니다.
따라서 답은 2, 90이 됩니다.
17. 다음의 결과 값을 작성하시오.
{
let a, b, result;
a = 7, b = 4
result = a | b;
console.log(result)
}
문제풀이
변수 a,b, result의 값이 선언 되고 여기서 a 는 7 b는 4인데 비트 연산자를 사용해서 ( | )OR값을 구하는 문제 입니다. OR은 하나라도 1이면 1 아니면 0 이됩니다. 따라서 7과 4의 를 10진법을 통해 값을 구하면
0000 0111
0000 0100
-----------
0000 0111 이 됩니다 여기서 2진법을 활용해서 값을 구하면 7이 됩니다.
18. 다음의 결과 값을 작성하시오.
{
function solution(a, b, c){
let answer = "YES", max;
let total = a + b + c;
if(a > b) max = a;
else max = b;
if(c > max) max = c;
if(total-max <= max) answer = "NO";
return answer;
}
console.log(solution(53, 93, 107));
}
문제풀이
먼저 solution의 값에 53, 93, 107이라는 값이 각각 a,b,c에 할당 되고 조건문에 맞게끔 차례대로 풀이를 해본다면
if (53>93) 이면 max = 53이고 아니면 max=93이다 라는 조건문에서 max는 b의 값 93이 됩니다.
다음 조건문에서
if(107>93) 이라는 조건문이 성립되어 max = 107로 변합니다.
그리고 마지막 조건문에서
total 53+93+107의 값 253 - 107 = 146의 값이 107보다 작거나 같으면 answer의 값은 NO로 실행되는데 조건문에 적합하지 않으므로 다시 return answer로 돌아가게 되면 answer의 값은 YES, max;이므로 YES로 출력됩니다.
19. 다음의 결과 값을 작성하시오.
{
function solution(a, b, c){
let answer;
if(a < b) answer = a;
else answer = b;
if(c <= answer) answer = c;
return answer;
}
console.log(solution(15, 12, 11));
}
문제풀이
18번 문제와 비슷하게 a,b,c값에 숫자 15,12,11을 대입해서 문제를 풀어봅니다.
let = answer이라는 변수가 선언되는데 조건문에 숫자를 대입해서 차근차근 풀어보면
만약에 15<12 가 맞다면 answer의 값은 a 이고 아니면 b의 값이 되는데 아니므로 answer= 12가 됩니다.
그리도 또 다른 조건문에서 11<=12라면 answer = 11이 되므로 answer의 값은 11이 됩니다.
20. 다음의 결과 값을 작성하시오.
{
function solution(day, arr){
let answer = 0;
for(let x of arr){
if(x % 10 == day) answer++;
}
return answer;
}
arr = [25, 23, 11, 47, 53, 17, 33, 40];
console.log(solution(0, arr));
}
문제풀이
먼저 for of문을 사용한 문제 입니다. for of문은 배열의 데이터를 불러올 때 사용하는데 for(let (배열의 값 ) of (배열의 이름값))으로 선언 할 수 있습니다. 따라서 x의 값은 arr안의 배열의 요소 값입니다. 여기서 if조건문으로 10으로 나눠서 나머지 값이 day인 값을 구하는 건데 여기서 day의 값을 보면 실행문 옆에 0 으로 표시 되어 있으므로 0으로 나누어 떨어져야 실행이 되는 문제 입니다. 배열의 요소 값들을 살펴보면 0으로 떨어지는게 40밖에 없으므로 answer++는 1이 됩니다.