목록전체 글 (352)
미누에요

JavaScript에서 함수는 객체이다. 그 이유는 함수가 객체와 비슷하게 저장되고 사용가능하기 때문이라고 익히 들었을 것이다.이에 대해서 더 자세히 들여다보자. 우선 함수는, JavaScript가 말하는 일급 객체의 성질을 모두 만족한다.그렇기 때문에 함수는 객체이다 라는 말이 성립하는 것이다. 일급 객체는 아래의 조건을 가진다.무명의 리터럴로 생성할 수 있다. (런타임에 의해 생성이 가능하다)변수나 자료구조(객체, 배열 등)에 저장할 수 있다.함수의 매개변수에 전달할 수 있다.함수의 반환값으로 사용할 수 있다. 하나씩 차근차근 살펴보자. 우선, 함수는 무명의 리터럴로 생성이 가능하다. 우리는 익명 함수를 통해 변수에 할당하는 경험을 해보았다.const add = function (a,b){ retu..

이제는 문제를 보고 사용될 알고리즘도 같이 보기 시작했다. 이 문제에서는 사용된 알고리즘으로 아래와 같이 표시되어 있다.자료 구조정렬이분 탐색해시를 사용한 집합과 맵 이분 탐색과 정렬은 정렬하여 이진 탐색을 통해 요소를 찾는구나 싶었지만 해시를 사용한 집합과 맵은 도대체 왜 사용해야하는지 이해가 되지 않았다. 그래서 해시와 맵을 찾아본 결과 해시는 간단히 설명하자면 키-값으로 이루어진 자료구조고, 배열과 다르게 키 값으로 문자열이 올 수 있다는 것이었다.또한 집합은 요소들의 중복을 금지하기에 어떻게 이 두 가지 자료구조를 활용할지 생각이 나지 않았다. 그러던 도중 집합으로 만들되, 숫자를 키로, 각 요소의 개수를 값으로 하는 해시맵을 만들어 사용하면 어떨까 ? 라는 생각이 들었다. 그러니까 10 - 3..

객체를 생성할 때 우리는 보통 아래와 같은 방법을 사용한다.const obj = { 'name': 'minwoo', 'age': 24,} 위 방법은 객체 리터럴을 사용한 방법이다. 이번 포스팅에서는 new Object()를 사용하여 객체를 생성하는 방법과, 이 방법의 특징에 대해서 알아보겠다. new Object()와 같은 형식으로 객체를 생성하는 방법을 생성자 함수를 사용한 객체 생성이라고 한다. const obj = new Object();obj.name = 'minwoo';obj.age = 24;obj.intro = function() { console.log(`hi. my name is ${this.name}, I'm ${this.age} years old.`);}console.log..

JavaScript를 조금이라도 공부해본 사람이라면 var 키워드를 되도록 사용하지 말아야 한다고 들어보았을 것이다.하지만 자세한 이유는 아마 나중에 깊게 배운다는 식으로 넘어갔을 가능성이 높다.오늘은 var 키워드와 나머지 let, const 키워드에 대해 설명해보고자 한다. var 키워드변수 중복 선언 가능함수 레벨 스코프(Function-level scope)var 키워드로 선언한 변수는 함수 레벨 스코프(Function-level scope)를 가진다.함수 레벨 스코프란 함수의 코드 블록만을 지역 스코프로 인정한다는 말이다. var x = 1;if(true){ var x = 100;}console.log(x); // 100 위 코드에서 if문 내부에서 var 키워드로 변수를 한번 더 선언하고 있다..

이 문제는 막 복잡한 문제는 아닌 거 같다.문제에서 값이 0인 경우에 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 숫자를 기록한다고 되어있다. 이 개념은 정확히 스택의 개념에 맞아떨어진다.값이 0인 경우에 가장 최근에 쓴 수를 지우는 것은 stack의 pop()이고, 해당 숫자를 기록하는 것은 stack의 push()이다. 아래는 소스 코드이다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const num = input.shift();const stack = [];input.forEach((ele) => { ele = +ele; if (ele === 0) { stack.pop..

이 문제도 스택을 사용하여 이전 문제처럼 풀면 되겠다. 이전 문제와 너무 동일하므로 자세한 설명은 생략한다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const num = input.shift();const results = [];input.forEach((line) => { const stack = []; let isBalanced = true; for (const char of line) { if (char === '(' || char === '[') { stack.push(char); } else if (char === ')') { if (stack.pop() ..

스코프는 자바스크립트에서 굉장히 중요한 개념 중 하나이다.간혹 변수의 값이 이상하다거나 예상한 값과 다를 때, 이 스코프(scope)와 관련되어 있는 경우가 꽤 있다. 모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 있다. 이것을 우리는 스코프(scope)라 한다. 예를 들어 보자.var x = 'global';function foo(){ var x = 'local'; console.log(x); // 'local'}foo();console.log(x); // 'global' 위 코드에서 함수 내부의 x와 바깥의 x는 다르게 출력된다. 함수 내부 x의 스코프는 함수 안으로 한정되고, 함수 외부 x는 전역적인 스코프를 가진다.현재 코드가 어디에서 실행되..

JavaScript에서 함수를 생성하는 방법에는 크게 4가지가 존재한다.함수 정의 방식에표현식 여부함수 선언문function mul(a,b){ return a*b;}표현식 아닌 문함수 표현식var mul = function(a,b){ return a*b;}표현식Function 생성자 함수var mul = new Function('a', 'b', 'return a*b');표현식화살표 함수var mul = (a,b)=> a*b표현식 표현식이 아닌 문의 경우에 변수에 넣을 수 없다. 하지만 표현식으로 평가되는 경우에는 변수에 넣어 사용할 수 있게된다. 함수 선언문가장 익숙한 함수 선언 형식일 것이다. JavaScript에서는 인자 타입을 적지 않는다.function mul(a,b){ return a..

자바스크립트의 모든 값은 원시 타입(primitive type)과 객체 타입(object type)으로 나눠진다. 위 사진에서 primitive가 원시 타입에 해당하고, Non-primitive가 객체 타입과 매칭된다. 원시 타입(Primitive Type)원시 타입의 값은 변경 불가능한 값이다. 한번 생성되면 변경할 수 없다.하지만 우리는 Number, String 타입으로 변수를 선언하고 나서 변경을 분명히 수행했을 것이다. let name = 'minwoo';console.log(name); // "minwoo"name = 'binu';console.log(name); // 'binu' 위 코드처럼 우리는 한번 선언한 값을 다른 값으로 바꿀 수 있다. 원시 타입의 값이 변경 불가능하다는 말은, ..

이 문제는 학부 자료구조 시간에 배웠던 내용인듯하다.스택(Stack)을 사용하여 괄호를 검사하는 문제인데, 간단히 설명하자면 문장을 순서대로 토큰으로 탐색하면서 여는 괄호('(', '[')가 오면 스택에 저장하고(push), 닫는 괄호(')', ']')가 오면 스택에 있던 값을 꺼내(pop) 여는 괄호인지 확인하면 된다. 아 그리고, 마지막의 .은 종료를 시키도록 작성해야한다.(문제에서 종료 조건으로 설정되어있음) 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const results = [];input.forEach((line) => { if (line === '.') return;..