js 공부

김민재·2024년 8월 14일
0
post-thumbnail

알고리즘 코드카타(59번문제 - 덧칠하기)

처음엔 for문을 통해서 접근을 해볼려고 했으나 좋은 시도가 아니었던 것 같았다.
n의 길이가 10만 이상 넘어가게 되는 경우에 그와 같이 section의 크기도 늘어나게 되므로 중첩for문을 통해서 n과 section이 같은지를 비교하면 시간이 너무 오래걸렸다.
고민을 한번 해보다가 도저히 답이 나오지 않아서 정답을 찾아보니,
먼저 n과 section이 동일한 것들을 0으로 처리한 배열을 만드는 것이었다.

이런식으로 처리를 하게되면 배열에는 0에 해당하는 값이 남게되는데 이를 하나씩 감지하여 i+m개만큼까지 +1로 칠한 표시를 내는 것이었다.

이런 방법도 있구나. 라는걸 다시 한번 깨닫고 가는 것 같고,
앞으로 크기 참조를 많이 해야되는 처리에서 배열이나 객체를 미리 할당하여 처리할 수 있도록 노력해봐야겠다.

SQL 코드카타

59번 자동차 대여기록에서 대여중/대여 가능 여부 구분하기
처음에 해볼때는 if문을 이용하여 처리해본 결과

되지 않았는데 직접 데이터를 확인해본 결과로 car_id에 해당하는 값들 중에서 group by로 보이지 않더라도 보이지 않는 값들 역시 전부다 고려해야 되는 것들이었다.

하면 모든 날짜중에서 조건에 만족하는 값들을 뽑아낸다고 한다.

js 공부

값을 바로 변수에 대입하지 않는 이유.

1.자유로운 데이터 변환:별도 공간에 데이터를 입력해놓고 가져오는 것이 더 효율적(실제 데이터를 저장하게 되는 경우에는 데이터의 형이 변할 때 일일이 저장 장소를 밀고 당겨주거나 해야한다. - 정수 => 문자열)
2.메모리의 효율적인 관리
1을 1만번 저장하게 되면 데이터를 직접 저장하게 되는 경우에는 1을 1만개 만들어야 하지만,
데이터를 별도의 공간에 만들어 참조하게 되는 경우엔 이를 1번만 저장하고 저장소의 주소를 불러와 참조하여 할 수 있게되어 메모리가 줄어들게 된다.
(이때 같은 메모리 주소를 참조하게 되어 변수 하나의 값을 변경할 경우에 모든 변수의 값이 바뀌게 되므로 조심해야 한다.)

위의 문제점으로 야기되는 객체의 변수 영역의 문제

객체를 복사할 때도 위와 마찬가지로 같은 변수 영역을 공유하게 되어 하나의 객체의 값을 변경할 때 모든 객체가 변경되는 경우가 있다.
이를 해결하는 방법중 하나가 얕은 복사인데,

이렇게 새롭게 변수를 만들어서 할당하는 방법이 있는데 이는 객체 안에 들어가 있는 객체(내부 객체)에 대해서는 동일한 주소를 가지게 되버리는 문제가 발생해버린다.
이를 해결하는 것이 깊은 복사다.

내부 객체의 경우에 재귀적으로 다시 호출하여 안에 있는 값을 복사하는 방 법이다.

undefined? null?

변수에 값이 지정되지 않은 경우, 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때나 .이나 []로 접근하려 한 데이터가 없을 경우 또는 return 문이 없거나 호출되지 않는 함수의 실행결과에 반환되는 값이다.

실행컨텍스트

스택

이런식으로 과학 실험실에서 보던 비커컵 같이 생긴 자료구조에 데이터를 하나하나씩 쌓는 방식이다.
이때 먼저 쌓인 데이터는 제일 밑으로 들어가게 되고 이를 제일 늦게 들어간 순서대로 제일 먼저 뽑아서 순서를 정하게 된다.(LIFO)

LE(LexicalEnvironment)? VE(VariableEnvironment)?
둘다 외부 환경 정보(outer)와 현재 컨텍스트내의 식별자 정보(record)를 가지고 있으나
VE는 변경사항(snapShot)이라는 것을 유지하고 있고 LE는 유지하지 않는다.(즉, VE는 LE의 snapShot이 실행 될 때의 초기 모습을 그대로 간직하고 있는 것이다.)

LE와 호이스팅?
현재 컨텍스트와 관련된 코드의 식별자 정보(함수에 지정된 매개변수 식별자,함수 자체,var로 선언된 변수 식별자 등)들이 저장(수집,기록)된다.

Q1.호이스팅이란 무엇일까?
호이스팅은 코드에 적혀있는 식별자 정보들을 수집하여 끌어올리는 것이다.
변수 정보 수집 과정을 쉽게 이해할려고 하는 가상 개념이기에 실제로 그렇진 않다고 한다.

Q1-1.함수를 호이스팅 한다고 했는데 모든 함수가 다 그런가?
다르다.
함수 선언문은 전체를 호이스팅 하게 된다.
그렇기에 함수 선언문이 올라가게되므로 기존에 있던 같은 이름의 함수들과 꼬이게 될 가능성이 생겨버려서 함수 표현식으로 표현하는 것이 좋다고 한다.
let smp = ()=> {}; //함수 표현식:변수 내에 함수를 저장하는 것
smp();

Q1-2.변수는 호이스팅되면 어떻게 될까?
변수의 선언부분(var sample)만 올라가게되고 변수의 할당부는 제자리에 있게된다.
var sample;

console.log(sample); //undefined;가 나오게 된다.
sample="hello";

스코프?

스코프는 식별자에 대한 유효범위를 의미한다.(과연 어디까지 살아있을까?)
스코프 체인:식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해 나가는 것이다.
각각의 실행 컨텍스트는 LE안에 record와 outer를 가지고 있고, outer(외부환경참조)안에 실행 컨텍스트가 선언될 당시의 LE정보가 들어있으니 스코프 체인에 의해서 상위 컨텍스트의 record를 읽어올 수 있다.

this

this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수(self-reference variable)이며 this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.
전역환경에서 this => 노드:global 객체 / 브라우저:window 객체를 가르키게 된다.

this는 함수 내부에서는 어떻게 될까?
어떤 함수를 함수로써 호출할 경우에는 this는 지정되지 않는다.
실행 컨텍스트를 활성화 할시 this가 지정되지 않았다면 this는 전역 객체를 의미하게 된다.
즉, 함수를 '독립적'으로 호출하게 될 때는 this는 전역 객체를 가르키게 된다.

이때 this는 outer 함수를 가르키게 되나

독립적으로 부른 innerFunc()은 전역 객체인 global(node에선)을 가르키게 된다.

this binding
binding이란 식별자와 값을 연결하는 과정인데,
this는 어디서 사용되느냐에 따라서 바인딩이 다르게 된다.
1.화살표 함수
화살표 함수에서는 this binding자체가 없기 때문에 전역 객체를 바라보지 않게 되고 그 함수를 바라보게 된다.
2.콜백 함수
콜백 함수에서 this를 호출시에는 this를 별도로 바인딩하는게 아니라면 전역 객체(객체 그 자체)를 무조건 바라보게 된다.
3.생성자 내의 this
인스턴스가 새롭게 생성될 때마다 this는 달라진다.

이런 this 바인딩을 명시적으로 하는 방법이 존재하는데
1.call

이런식으로 {x:1}을 this에 바인딩 시키는 방법이 있다.

2.apply
call과 비슷하나 나머지 부분을 배열 형태로 반환해야만 한다.

3.bind
bind는 위 1,2와 같이 바인딩 하는 메서드지만 즉시 호출하지 않는다는 다른 점이 있다.
이를 통해서 함수에 this를 미리 적용하고 부분 적용 함수에 사용할 수 있는 이점이 있다.


2번째 사진에서 innerFunc 안에 있는 this는 outer의 this인 Function outer가 된다.

유사 배열 객체
말그대로 배열같은 객체인것
1.반드시 length가 필요하다.
2.index번호가 0부터 시작해서 1씩 증가해야만 한다.

이렇게 만들어진 유사 배열 객체는 call 또는 apply를 통해서 배열 메서드를 차용할 수 있게 된다.

Q.Array.prototype은 무엇일까?
유사배열객체와 배열의 큰차이는 Array.prototype을 상속하느냐 안하느냐로 갈리게 되는데 이를 상속하는 유사배열객체는 배열의 메서드를 사용할 수 있게 된다.

3주차 문제

1.나이가 든 유저

user 객체 내에 detect함수를 선언하고 그 함수안에 함수 표현식을 선언하여 bind함수로써 객체인 user를 this로 넣어두었다.(detect의 this는 user을 가르키게 됨)

2.누가 더 강한가?

user1을 bind로 this 객체로 취급하여 받은 후에 user2를 넣어 실행하게 만들었다.
서로의 힘(str)을 비교하여 승리를 선언하는 문장이다.

느낀점

자바스크립트를 이번에 처음 하게되므로써 처음 듣는 것들인데
많이 생소한 문법들이라 헷갈리는 부분이 많은 것 같다.

profile
ㅇㅇ

0개의 댓글