function 함수이름(복수의, 매개변수는, 콤마로, 구분합니다) {
/* 함수 본문 */
}
함수란 프로그램을 구성하는 주요 '구성 요소(building block)
함수를 이용하면 중복 없이 유사한 동작을 하는 코드를 여러 번 호출할 수 있다.
함수는 값입니다. 따라서 함수도 값처럼 할당, 복사, 선언할 수 있다.
함수 표현식은 실행 흐름이 표현식에 다다랐을 때 만들어진다.
함수 선언문은 함수가 선언되기 이전에도 함수를 활용할 수 있다.
객체란 프로퍼티의 순서 없는 집합. 주체가 아님, 주체가 활용하는 것, 연관배열
객체 = 서랍장(이해를 위해) 서랍장 안 파일은 프로퍼티, 파일 각각에 이름표는 객체의 키.
복잡한 서랍장 안에서 이름표를 보고 원하는 파일을 쉽게 찾을 수 있듯이, 객체에선 키를 이용해 프로퍼티를 쉽게 찾을 수 있다.
그렇기에 생성, 검색, 삭제, 테스트, 프로퍼티 열거가 용이하다.
장점 : 복잡도를 낮추기 위해서, 유지보수가 편하고 연관성이 잘 드러난다.
사용하지 않으면 메소드나 변수가 한번 더 쓰여지면서 원래의 기능이나 값이 변형될 수 도 있다.
1.다른 언어에서는 어떻게 데이터 타입을 정의 할까요, 장단점은 무엇일까요?
정적 타입 언어 C, C#, C++, Java, 그리고 TypeScript
미리 타입을 지정했기 때문에 컴파일 시 자료형에 맞지 않는 값이 들어가면 에러를 발생시킨다
장점
컴파일 시 타입에 대한 정보를 미리 결정했기 때문에 실행속도의 이점이 있다
타입 에러로 인한 문제점을 초기에 발견할 수 있어 안정성이 있다.
단점
매번 코드 작성시 변수형을 결정해줘야 하는 번거로움이 있다
2.기본형 데이터와 참조형 데이터를 굳이 왜 구분해서 다룰까요? 혹시 하나의 방식으로 다 다룰수는 없을까요?
기본형은 값을, 참조형은 값이 저장된 주소값을 할당한다
어떻게 다뤄야하는지, 내부적으로 어떻게 진행되는지
—>
3.왜 불변 객체를 이용해야 할까요? 어떤 실수가 있을 수 있을까요?
처음 저장한 데이터의 크기보다 더 큰 데이터를 '재할당' 해야한다면 데이터 공간을 재확보, 참조가 일어나지 않는다. (이건 수정하자)
부수효과를 피해 오류를 최소화 할 수 있다.
부수효과: 변수의 값이 바뀌거나 객체의 필드값을 설정하거나 예외나 오류가 발생하여 실행이 중단되는 현상
4.왜 자바스크립트에는 undefined와 null이 있을까요?
null과 undefined은 존재하지 않는 것을 나타내는 자바스크립트가 가진 특별한 타입, null은 직접적으로 값이 없어라고 말한 상태이지만 undefined는 아무것도 하지 않은 상태(컴터는 응당 값 지정 예상)
undefined는 내가 손수 쓰면 안된다.
모든 data는 bite 단위의 식별자인 메모리 주소값을 통해서 서로 구분이 된다.
값을 바로 변수에 대입하지 않는 이유(무조건 새로 만드는 이유)
1. 자유로운 데이터 변환 (ex. 이미 입력한 문자열이 길어진다면?)
2. 메모리의 효율적 관리 (ex. 똑같은 데이터를 여러번 저장해야 한다면?)
가비지컬렉팅(garbage colletong:GC) 변수가 바뀜으로서 더이상 사용되지 않는 곳을 처리
기본형 데이터와 참조형 데이터의 변수 할당과정 차이 : 객체의 변수(프로퍼티) 영역의 별도 존재 여부
불변성 : 데이터영역의 값(메모리)이 바뀌는지, 변수의 값(주소) 이야기가 아님
기본형 데이터가 불변인 이유 : 값이 바뀌면 데이터가 새로 생성되어 '변수영역' 값(주소)이 바뀐다.
참조형 데이터가 가변형인 이유 : 변수영역이 아닌 '데이터영역'(그림에서 변수영역을 제외한 밑쪽으로 생각하면 편함)이 바뀜 (객체의 참조영역)
변수복사 비교= obj1를 복제한 obj2/ obj2.c의 값을 바꿔도 obj1 === obj2 //true
obj2.c를 바꾸고 싶었는데 obj1도 바뀜 ->> 가변임을 유의해야함, 불변하도록 만들어야함
불변하도록 변경 ->> 복사할곳의 value에 접근할 때 객체의 프로퍼티로 접근하는것이 아니라, 객체 자체의 값을 바꿔서 할당해줘보자. obj1를 위한 공간이 아닌 obj2를 위한 공간을 설정해줄것 같은 값이라도 아예 다른곳에서 값을 설정한다고 생각하자. 공간이 분리되었다고.
얕은복사는 obj를 복사하는게 아니라, obj[prop]를 for구문의 반복을 통해 가져오는것. 기능도 똑같이 들어가고 하드코딩이 아니라 가볍다. 바로 아래 단계의 값만 복사. 1depth는 생성되지만 2depth는 여전히 참조가 된다. (중첩된 객체(객체안에 객체)의 경우 참조형 데이터가 저장된 프로퍼티를 복사할 때 주소값만 복사.)
깊은복사는 1depth만큼 진행되는 얕은 복사를 프로퍼티 안에서 한번더 1depth만큼 진행해준다. 재귀형
1.실행 컨텍스트는 무엇일까요?
컨텍스트를 수행하는 배경지식, 변수들, 설정
실행할 코드에 제공할 환경(전역공간, 함수 내부 환경)정보들을 모아놓은 객체 (순서보장)
실행 컨텍스트는 식별자(변수, 함수, 클래스 등의 이름)를 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘으로, 모든 코드는 실행 컨텍스트를 통해 실행되고 관리된다.
콜스택 :
힙 :
2.실행 컨텍스트 객체가 활성화되는 시점에 수집되는 정보는 무엇일까요? 각각 왜 수집할까요?
해당 컨택스트에 관련된 코드들을 실행하는데 필요한 환경정보들을 수집해서 실행 컨택스트 객체에 저장 (자바 스크 엔진이 활용할 목적)
VariableEnvironment 초기상태유지 스냅샷 (LexicalEnvironment 현재상태)
LexicalEnvironment 매개변수명, 선함수의 함수명, 변수의 식별자
ThisBinding this로 지정된 객체 저장
3.호이스팅은 무엇일까요?
처리 순서, 규칙 위로 올리는것
자바스크립트 엔진이 실행 컨텍스트를 구성할 때 environmentRecord 에 식별자의 정보를 수집합니다. 이러한 과정을 통해 엔진은 함수를 실행하기도 전에 해당 컨텍스트 내부의 변수명들을 이미 알고있습니다.
이렇기에 식별자들을 코드의 최상단으로 끌어올렸다(가상 개념)
4.왜 귀찮게 호이스팅같은 개념이 있을까요?
자바스크립트 엔진은 함수선언문 해석 -> 변수 초기화 -> 코드실행 순서로 진행된다.
코드를 실행할 땐 이미 함수 선언문과 변수가 생성되어있는 상태이기 때문에
어디에서든 함수나 변수를 호출할 수 있다. (심지어 제일 위에서도!)
변수 선언과 함수 선언을 순서에 구애받지 않고 자유롭게 할 수 있다는 장점이 있지만 함수표현식과 같은 예외도 있기 때문에 신중히 사용해야만 한다. 호이스팅만 믿고 중구난방으로 코드를 작성하기보다 처음부터 코드의 가독성과 유지보수를 고려해 개발하여 호이스팅이 발생하지 않도록 하는것이 최선이다.
5.스코프는 무엇일까요?
스코프는 참조 대상 식별자(identifier, 변수, 함수의 이름)를 찾아내기 위한 규칙이다. 자바스크립트는 이 규칙대로 식별자를 찾는다.
식별자를 찾아 유효한 범위를 만든다.
6.스코프는 왜 중요할까요?
스코프가 없다면 같은 식별자 이름은 충돌을 일으키므로 프로그램 전체에서 하나밖에 사용할 수 없다. 식별자는 자신이 어디에서 선언됐는지에 의해 자신이 유효한(다른 코드가 자신을 참조할 수 있는) 범위를 갖는다.
실행 컨텍스트는 '실행할 코드에 제공할 환경 정보'들을 모아놓은 객체입니다.
자바스크립트는 어떤 실행 컨텍스트가 활성화되는 시점에
선언된 변수를 위로 끌어올리고(hoisting) 외부 환경 정보를 구성하고 this값을 설정한다.
콜 스택(call stack)
1. 실행 컨텍스트를 콜 스택에 쌓는다. 2. 가장 위에 쌓여있는 컨텍스트와 관련된 코드를 실행하는 방법으로 코드의 환경 및 순서를 보장 3. 전역공간(스크립트가 실행되는 순간 자동부여), eval() 함수, 함수
실행컨텍스트에 담기는 정보
VE,LE의 구성요소 environmentRecord(=record), outerEnvironmentReference(=outer)
environmentRecord(=record)
-현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장(수집)
-수집 대상 정보 : 함수에 지정된 매개변수 식별자, 함수 자체, var로 선언된 변수 식별자 등
-컨텍스트 내부를 처음부터 끝까지 순서대로 훑어가며 수집
호이스팅(hoisting)
변수의 선언과 초기화를 분리한 후, 선언만 코드의 최상단으로 옮기는
console.log(num); // 호이스팅한 var 선언으로 인해 undefined 출력
var num; // 선언
num = 6; // 초기화
변수정보 수집을 모두 마쳤더라도 아직 실행 컨텍스트가 관여할 코드는 실행 전의 상태임(JS 엔진은 코드 실행 전 이미 모든 변수정보를 알고 있는 것)
매개변수 식별자, var로 선언된 변수 식별자는 변수명이 올라감
함수선언문은 함수 자체가 올라감, 함수표현식은 변수명만 올라감
outerEnvironmentReference(=outer)
스코프 : 식별자에 대한 유효범위
스코프 체인 : 함수가 중첩 상태일 때 하위함수에서 상위함수의 스코프와 전역스코프까지 참조할 수 있다. 이것을 스코프 체인을 통해 탐색한다.
스코프 체인이 가능토록 하는것(외부 환경의 참조정보)
수정중, 이번주는 시간이 절대적으로 부족한것같다. 아직도 쉬고싶고 유튜브 보고싶고 놀고싶은 마음이 남아있는것같다. 다잡고 남은시간동안 다시 문법부터 1회독 더 하고 알고리즘 스터디를 풀어봐야겠다.
시간복잡도, 공간복잡도를 찾아보고 알고리즘에 적용해보자