분류 전체보기 107

[모딥다] JS (6) - 프로퍼티 어트리뷰트

1. 내부 슬롯과 내부 메서드1) 내부 슬롯 : 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티(Psuedo Property) 2) 내부 메서드 : 의사 메서드 ex) ([[...]]) 2. 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체: 자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의함: 프로퍼티 상태란 프로퍼티의 값, 값의 갱신 가능 여부 , 열거 가능 여부, 정의 가능 여부를 말한다.: 프로퍼티 어트리뷰트는 자바스크립트 엔진이 관리하는 내부 상태 값인 내부 슬롯이다.ex) [ [ Value ] ] , [ [ Enumerable ] ] , [ [Configurable ] ]= 프로퍼티 ..

[모딥다] JS (5) - var , let ,const 키워드와 블록 레벨 스코프

1. var 변수 문제점1) 변수 중복 선언 허용2) 함수 레벨 스코프 : var 키워드로 선언한 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정함.: 따라서 함수 외부에서 var로 선언한 변수는 코드 블록 내 선언해도 모두 전역 변수가 됨.3) 변수 호이스팅: 변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작함 2. let 키워드: 변수 중복 선언 금지: 블록 레벨 스코프 - 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따름: 변수 호이스팅 발생 X: var 키워드와 달리  "선언 단계" 와 "초기화 단계"가 분리되어 진행 된다.: 따라서 초기화 단계 실행되기 이전에 변수에 접근하려고 하면 참조 에러가 발생함: 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 ..

[모딥다] JS (4) - 전역 변수의 문제점

1. 변수의 생명 주기1) 지역 변수의 생명 주기: 변수는 선언에 의해 생성되고 할당을 통해 값을 갖음. 그리고 소멸하는데 이러한 것을 생명 주기라고 함.: 만약 생명주기가 없다면 종료하지 않는 한 영원히 메모리 공간을 점유하게 된다.: 변수 선언은 선언문이 어디에 있든 상관 없이 가장 먼저 실행됨, 즉 한 줄 씩 순차적으로 실행되는 런타임 시점이 아닌 시작 전 자바스크립트 엔진에 의해 먼저 실행된다. => 전역 변수에 한정된 설명: 지역 변수는 함수 몸체의 다른 문들이 순차적으로 실행 되기 이전에 자바스크립트 엔진에 의해 변수가 선언되고 undefined로 초기화 된다. 그 후 함수 몸체의 다른 문들이 순차적으로 실행 될 때 값의 할당이 이루어진다. :  즉, 지역 변수의 생명 주기는 함수의 생명 주기..

[모딥다] JS (3) - 스코프

1. 스코프: 유효범위라고도 하며, 모든 식별자(변수 이름, 함수 이름, 클래스 이름)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정되는 것을 스코프라고 한다. : 식별자가 유효한 범위를 말함 2. 식별자 결정: 이름이 같은 두 개의 변수 중에서 어떤 변수를 참조해야 할 것인지를 결정해야 하는 것. 스코프 : 유효범위라고도 하며, 모든 식별자(변수 이름, 함수 이름, 클래스 이름)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정되는 것을 스코프라고 한다. : 식별자가 유효한 범위를 말함   2. 식별자 결정: 이름이 같은 두 개의 변수 중에서 어떤 변수를 참조해야 할 것인지를 결정해야 하는 것var x = 'global'..

BOJ - 6603 로또

1. 문제 링크 : https://www.acmicpc.net/problem/66032. 문제 티어: 실버23. 문제 유형 : 백트래킹 , 재귀4. 문제 풀이 :  백트래킹 종류로, 단계적으로 문제를 푼다.1) S, K를 입력 받는다. 문제에서 따로 이야기 없이 한 줄에서 입력 받게 했으므로 input에서 첫 번째 요소는 K 나머지는 배열로 입력 받는다.2) 배열과 선택된 숫자(=K)개의 조합을 짜주는 재귀함수를 선언한다. 재귀함수인 이유는 조합은 중복이 허락되지 않기 때문에 기존에 만든 부분은 고정시켜야 하고 나머지 부분만으로 조합을 만들어야 중복이 허용되지 않는다.예를 들어, [1, 2, 3, 4]에서 2개의 원소를 선택하는 경우:가능한 조합: [1, 2], [1, 3], [1, 4], [2, 3],..

BOJ - 10971 외판원 순회 2

1. 문제 링크 : https://www.acmicpc.net/problem/109712. 문제 유형 : 백트래킹3. 문제 티어 : 실버24. 문제 풀이  : 전형적인 모든 경우의 수를 완전 탐색하는 백트래킹 문제 : 모든 도시를 방문 후 다시 돌아와서 그 최소 경로를 구해야  함 : 이 과정에서 방문 처리 유무를 남겨놓아서 다시 방문하지 않도록 하여 연산 속도 빠르게 처리 : 도시 i부터 j까지 가서 그 비용을 현재 측정된 비용에 더한 후 기존에 있던 최솟값과 지속적으로 비교해서 최솟값을 갱신하는 재귀함수 호출하면서 최적의 값 찾음 5. 문제 코드 // 1. 값 입력 받기const fs = require("fs");let input = fs.readFileSync("/dev/stdin").toStrin..

[모딥다] JS (2) - 함수

1. 함수란? : 일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것: 매개변수 - 함수 내부로 입력을 전달 받는 변수: 인수 - 입력: 반환값 - 출력: 함수 정의를 통해 생성: 함수는 일급객체임 (값의 성질을 갖는 객체를 일급객체라고 함)function addNumber(x,y) { return x + y;} 2. 함수 리터럴: 함수는 객체 타입의 값이다 따라서 함수도 함수 리터럴로 생성할 수 있다. : 함수 리터럴은 function 키워드, 함수 이름, 매개변수 목록, 함수 몸체로 구성된다.var f = function add(x,y) { return x + y; }; * 함수 이름은 생략 가능, 이름이 없는 함수를 무명/ 익명 함수라 함* 매개변수 목록은 ..

[모딥다] JS (1) - 객체 리터럴

1. 객체란?: JS는 객체 기반의 프로그래밍 언어며 거의 모든 겂이 객체다. : 변경 불가능한 원시 값과 달리 객체는 변경 가능한 값이다.: 객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키와 값으로 구성된다.: 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다.let person = { name: "John" // 프로퍼티 키 : name , 프로퍼티 값 : "John" age: 22,} :  참고로 프로퍼티 값은 JS에서 사용할 수 있는 모든 값이 될 수 있다.: 프로퍼티 값이 함수인 경우 우리는 메서드라 부른다.var counter = { num = 0, // 프로퍼티 increase : function() { ..

백엔드 입문 (5) - Express 아키텍처 구조

1. 마이크로 프레임워크 vs 풀스택 프레임워크: 익스프레스는 마이크로프레임워크 즉, 미니멀리스트 웹 프레임워크다. 최소 기능을 가지면서 필요한 기능을 플러그인으로 확장하는 프레임워크이다. 장고, 스프링 같은 풀스택 프레임워크들은 디렉터리 구조를 강제하지만 마이크로 프레임워크는 폴더 구조를 강제하지 않는다. 2. 3계층 구조 아키텍처: 서버 개발에서 가장 보편적으로 사용하는 3계층 구조 아키텍처를 적용하고자 한다. MVC 패턴을 적용하기도 좋기 때문이다.: 컨트롤러, 서비스 , 데이터 액세스 계층을 가짐.: 컨트롤러 계층에서는 뷰에서 넘어온 요청을 받아 권한 체크, 유효성 검증 등을 한 후 서비스 계층으로 넘김.: 서비스 계층에서는 비즈니스 로직을 처리한다. 이렇게 비즈니스 로직을 분리하면 각각 다른 컨..

BackEnd Skils 2024.12.08

BOJ - 15652 N과 M(4)

1. 문제 링크 : https://www.acmicpc.net/problem/156522. 문제 티어 : 실버33. 문제 유형 : 백트래킹4. 문제 풀이1) 내림차순을 유지해야 하기 때문에 start 지점을 찾아서 인덱스를 유지 시켜줘야 한다.2) 그 외는 N과 M(3)과 비슷하다.3) 중복 조합을 찾아서 넣어주는 문제다. 5. 문제 코드let result = []; // 결과를 저장할 배열function recursive(current, start, n, m) { if (current.length === m) { result.push(current.join(" ")); // 길이가 M인 수열을 결과에 추가 return; } for (let i = start; i