
강의목표
-> 2022/03/08(화) 수업때 자바스크립트 정리를 위한 글
-> 수업시간때 애기하셨던 혹은 중요했던 부분들을 모아 정리해보자
본문
Q. 크롬개발자도구란 ??
-> 웹프론트앤드개발자를 웹 브라우저 응용 어플리케이션 개발자라고하는데 이때 디버깅을 하기위한 도구가 크롬 개발자 도구
*cmd option j or i(맥용) 크롬에서 개발자도구를 열기위한 단축키

-> 위 그림이 크롬에서 개발자도구를 열었을때의 모습인데 디자인을 하거나 혹은 웹프론트앤드개발자가 자신이 만든 웹을 디버깅할때 매우 유용하게 쓰일 수 있다는것을 알 수 있다!
Q. 자바스크립트의 자료형
Q. 자바스크립트에서 기본형은 불변형이다

-> 위 그림에서 나는 변수 a라는 저장공간에 5라는 값을 넣은 이후에 7이라는 값을 다시 넣어주니 값이 변하였다... 엥 근데 기본형은 불변형이라며?? var로 선언해줘서 그런가?

->이번에 상수를 저장할 수 있는 let을 이용하여 위처럼 똑같이 해주었더니 또 값이 변경되었다... 그렇다면 자바스크립트에서 말하는 기본형은 불변한다는게 무엇일까 ??
Q. 정적언어 vs 동적언어
정적언어(C, C++, C#, Java, Swift)
-> 데이터타입을 컴파일 시에 결정
-> func함수를 실행하기전에 미리 선언부에 대한 메모리공간을 할당해놓고 이후에 할당부를 넣어줌
동적언어(Javascript, Ruby, Python)
-> 데이터타입을 런타입에 결정
-> 컴파일타임에 선언부의 타입을 알 수가 없어서 할당부의 값을 확인하고 타입을 추론
***위에서 말하는 선언부와 할당부는 int a = 5라 할때 int a가 선언부, a = 5가 할당부이다
Q. 자바스크립트는 숫자타입인 경우(정수형인지 부동소수형인지 구분않고) 8바이트를 확보한다 ??
C/C++, 자바 등의 정적 타입 언어는 메모리의 낭비를 최소화하기 위해 데이터 타입별로 할당할 메모리 영역을 2바이트, 4바이트 등으로 나누어 정해놓았습니다. 따라서 2바이트 크기의 정수형 타입(short)은 0을 포함해 -32768 ~ +32767의 숫자만 허용합니다.
때문에 범위 보다 큰 수나 적은 수를 입력하면 오류가 나거나 잘못된 값이 저장되고 맙니다. 이 문제에 대응하기 위해서는 사용자가 직접 4바이트 크기의 정수형 타입(int)등으로 형변환해야 합니다. 메모리가 부족했던 시절에는 이러한 선택이 불가피했다고 합니다.
-> 위에서 말한 애기가 무슨 말이냐면은 정적타입언어들은 미리 선언부를 보고 메모리에 공간을 할당해놓아야한다고 위에서 언급했는데 이 때문에 각각의 자료형에 따라서 효율적이고 낭비하지않을만큼의 크기를 정해놨어야했던것이다, 그렇기에 shot는 2바이트, int는 4바이트, float은 4바이트, double혹은 long double은 8바이트 이런식으로
-> 반면에 동적언어인 자바스크립트같은 경우는 메모리가 전보다 널널했으니 어떤 타입이든간에 8바이트를 확보해놓은것이다
***나는 short형 2개에 대한 연산을 할때 int형으로 변환하여 계산하고 다시 short로 형변환하여 값을 넣는다는것을 알고있었다, 이에 대해 말하자면 메모리에는 short형으로 올려지고 레지스터에서 4바이트로 변형하여 연산하여 다시 메모리에 결과값을 올리는것인데 이 이유가 뭐냐면은 cpu가 몇 바이트냐에 따라서 레지스터가 몇바이트인지 정해진다, cpu가 32비트일때는 레지스터가 4바이트, 64비트일때는 레지스터가 8바이트로 정해진다, 그렇기에 앞서 int형으로 변환되는것은 32비트일때 애기고 64비트일때는 또 그렇지않다, 즉 연산을 할때에는 cpu에 따라서 레지스터가 효율적으로 동작할 수 있는 형으로 바뀌어져 연산되어지는것이다

-> 각 비트는 고유의 식별자를 가지는데 무언갈 찾을때 비트별로 확인하는것은 비효율적, 그래서 바이트라는 단위로 맨 처음 식별자를 사용하여 메모리주소값을 식별한다
Q. 변수 선언과 데이터 할당

-> a라는 식별자를 위한 공간, 리터럴 문자열 abc를 위한 공간, 식별자 a에는 리터럴 문자열 abc가 위치하고있는 주소값을 가지고있다

-> 위 같은 경우는 리터럴값인 abcdef만을 데이터영역에 저장되있고 이를 다시 변수의 식별자에 가리키게 한다
Q. 그런데 위와 같이 리터럴값마다 따로 주소값을 할당하게되면은 비효율적인것 아닌가 ??
-> 사실 이 부분에 대해선 비효율적인면도 있겠지만 효율적인 상황도 있을것이다, 예를 들어서 변수 여러개에 동일한 리터럴값을 저장해야하는 상황이 있다라고한다면 데이터영역에 저장되어있는 리터럴값의 주소값만 식별자를 통해 가리키게한다면 즉 중복된 데이터에 대한 처리 효율이 증가할 것이다
Q. 그런데 기본형은 불변이라면서요, 위 예시에선 값이 변경되는데요 ??
-> 맨 위에서 애기했던것에 대한 결론을 애기해보겠다
데이터영역값이 바뀌지않으면 불변, 불변하지않은것(데이터영역)
상수인지 변수인지는 위에 안바뀌면 상수 바뀌면 변수(변수영역)
->이 애기가 무슨말이냐면은 불변이라는 애기는 데이터영역 즉 리터럴값이 저장되어있는 영역의 불변을 이야기하는것이고 변수와 상수의 차이는 변수영역에서의 불변이냐 가변이냐는것이다
-> 즉, let으로 선언할 경우에는

-> 위 그림처럼 값이 변할 수 있는것은 일단 첫번째로 7과 3은 각각 데이터영역에 따로 저장되어있는 저장소이기때문에 불변인것이고 상수이므로 변수영역에서 b라는 식별자에 7이라는 리터럴을 가리키는 것 하나, 그리고 또 다른 변수영역 b라는 식별자에 3이라는 리터럴을 가리키는것 즉 변수영역에도 기존과 다른 영역에 공간을 할당받게되는것이다
Q. 기본형은 불변이다는 알겠다 그렇다면 참조형인 경우에는 어떨까 ??

-> 참조형 데이터같은 경우는 객체만의 변수영역에 따로 존재하게된다
-> 위에서 자바스크립트는 중괄호로 묶은 표현식이 Map을 표현하는것이다
-> 우리가 참조형데이터에 식별자로 접근하게되면은 주소값이 나오지않는가? 이에 대한 이유가 위 그림에서 나온다 obj1식별자에 접근하게되면은 @5001주소값에 저장되어있는곳의 데이터를 읽게되고 그것이 주소값인것이다, 근데 여기서 @7103은 이 참조형데이터의 첫번째 a라는 이름을 가진 주소값을 읽게되니 @7103이라 써있는것이다

-> 자바스크립트의 Map에서는 key값을 이용해 value값에 접근할때 obj1["key"]로 접근가능하지만 obj1.key로도 접근가능하다
