TIL : 23.01.20

jin·2023년 1월 24일
0

TIL

목록 보기
8/39
post-thumbnail

23.01.18-23.01.26 언어학습주차 / javascript 데이터타입, 실행컨텍스트

데이터타입

📌 1.다른 언어에서는 어떻게 데이터 타입을 정의 할까요?
정적타입의 언어 / 사용자가 표현하고자 하는 형변환을 직접해주어야 함
2.다른 언어들처럼 데이터 타입을 다룬다면 장단점은 무엇이 있을까요?
정수형, 문자형 과 같이 타입별로 허용되는(할당된) 범위가 존재했으며, 메모리 용량확보는 되나 범위를 벗어날 경우 오류가 난다는 장단점이 있다.
3.기본형 데이터와 참조형 데이터를 굳이 왜 구분해서 다룰까요? 혹시 하나의 방식으로 다 다룰수는 없을까요?
기본형 데이터의 경우 불변값 / 참조형 데이터의 경우 가변값이라고 한다. 참조형의 경우 기본형과 달리 객체의 변수 영역이 별도로 존재하는데, 이 부분의 값이 변할 수 있는 값이기 때문에 가변값이라 불린다. 데이터값을 구분해서 다루는 이유는 값 변환에 있어 좀 더 자유롭고, 메모리 관리를 보다 효율적으로 하기 위함이 이유라고 생각된다..!
4.왜 불변 객체를 이용해야 할까요? 어떤 실수가 있을 수 있을까요?
새롭게 전달 받은 객체가 변경되더라도 원본 객체가 유지되어야 할때 필요하다.
5.왜 자바스크립트에는 undefined와 null이 있을까요?
undefined의 경우 어떤 변수에 값이 존재하지 않을 경우로 명시되지않아 자바스크립트 내에서 자동으로 반환하는 값에 쓰인다. 만약 사용자가 명시를 할 경우 하나의 명시된 객체로 인식해 배열 내에서 키값(이름)을 가지게 된다. 따라서 비어있음을 나타낼 경우에는 null을 사용하는 것이 좋다.
null은 사용자가 명시적으로 없음을 나타내기 위해 만든 데이터로 값을 대입하지 않은 변수에 접근하고자 비어있음을 지정해줄때 사용된다.

📌 1.타입을 지정하는 언어는 어떠한 언어가 있는지 확인해보고 해당 언어들과 자바스크립트의 방식의 장단점을 조사해주세요, 가능하다면 실제 케이스를 찾아보고 대답해주세요
자바스크립트와 같은 동적언어의 경우 자바스크립트파이썬이 이에 해당된다.
이러한 언어의 경우 사용자가 타입을 지정해주지않아도 되며, 한줄한줄 컴파일 후 실행되므로 런타임까지 타입에 대한 유연성을 둘 수 있다.단, 한줄한줄 컴파일 되므로 시간이 오래 걸리고 실행시 버그가 발생되는 단점이 있다.

let a = "5" // 숫자임을 명시X
let sum = a+5 // 5가 숫자임을 확인해, sum의 결과는 10이 출력된다.
let b = "오렌지"
let combine = b+5 // "오렌지"라는 문자와 숫자를 더하지 못하므로 "오렌지5"가 출력된다.

반대로 정적언어의 경우 C, C++, C# 등이 이에 해당된다.
해당 언어의 경우 사용자가 타입을 명시해주어야 하므로 코드 작성에 시간이 소요되며, 데이터와 타입이 맞지않을 경우 오류가 생성된다. 단, 전체적인 컴파일 후 실행이 되므로 실행 전 오류를 잡아낼 수 있으며 컴파일시간이 짧다는 장점이 있다.

int a = 5
int b = "사과" // int의 경우 정수형 타입이므로 "사과"와 맞지 않음.

2.변수와 식별자는 어떻게 다를까요?
변수는 변할 수 있는 데이터를 의미하며, 식별자는 그 변수를 구분하는 변수의 이름이다.
3.기본형과 참조형은 자바스크립트에서 어떻게 다르고 어떻게 구현되어 있나요?
기본형의 경우 주솟값을 복사하는 과정이 한번만 이뤄지고
참조형은 한단계를 더 거치게 된다.
4.불변 객체에 대해서 알게된 만큼 작성해주세요
전달 받은 객체가 변경되더라도 원본 객체가 유지되어야 할때 필요한 객체로 기본형 데이터의 경우 모두 불변값이다.
가변의 경우 데이터 자체가 아닌 내부 프로퍼티를 변경하고자 할때 성립되는데,
객체 또한 재할당을 하기로 규칙을 정하거나, 자동으로 새로운 객체를 만들거나 할 경우 불변성이 있는 객체 취급된다.
5.얕은 복사와 깊은 복사는 어떠한 차이점이 있으며, 그렇다면 각각의 복사는 어떠한 장단점이 있을까요?
얕은 복사는 바로 다음 단계의 값만 복사하는 방법, 깊은 복사는 내부가 포함하는 모든 값을 하나하나 복사하는 방법이다. 이때, 얕은 복사의 경우 원본과 사본이 동일한 참조형의 주소를 가리키게 되며, 원본과 사본이 상호작용으로 함께 변경된다. 따라서 불변객체로써의 복사가 필요할때 깊은 복사가 이루어지게 된다고 생각된다..

✏️개념 정리

  • 기본형: number, string, boolean 등과 같이 타입을 나타내는 불변값
  • 참조형: 객체/ 객체는 function, array, map 등과 같이 변할 수 있는 가변값
  • 불변성: 자체적인 변경이 아닌 새로 만드는 동작을 통해 변경할 수 있는 성질
  • 메모리 주소: 바이트의 위치를 파악할 수 있는 식별자
  • 변수: 변할 수 있는 데이터 혹은 그 데이터를 담는 공간
  • 식별자: 변수를 구분하는 변수의 이름
  • 가변값: 변동 가능한 값(값 자체의 변경이 아닌, 삭제 추가로 인한 변동값)
  • 데이터 영역: 변경가능한 영역
  • 변수 영역: 변경할 수 없는 영역
  • 불변 객체: 기본형 데이터가 해당되며, 원본객체가 유지되어야 하는 객체로 객체가 가진 프로퍼티값을 변경하지 않는다.
  • 얕은 복사: 해당 코드의 다음코드 혹은 주소만 복사
  • 깊은 복사: 원본이 포함/참조하는 모든 값을 복사
  • undefined: 값이 명시되지않았을때, 자바스크립트 엔진 내에서 자동으로 부여하는 빈값
  • null: 값이 없음을 명시해야할때 사용자가 직접적으로 부여하는 빈값

실행컨텍스트

📌 1.실행 컨텍스트는 무엇일까요?
즉, 자바스크립트 코드가 실행되고 , 연산되기 위한 하나의 범위/공간
코드 실행에 필요한 환경 정보를 [컨텍스트]라고 이름지으며 객체로 만들어둔 후, 실행 순서에 따라 콜스택에 쌓았다가, 가장 위에 쌓여있는 컨텍스트(정보)와 관련있는 코드를 실행하는 순서로 이루어진다.
2.실행 컨텍스트 객체가 활성화되는 시점에 수집되는 정보는 무엇일까요? 각각 왜 수집할까요?
변경이 불가능한 현재 내부 식별자의 정보+외부 환경정보 VariableEnviroment / 스냅샷 개념
변경이 가능한 내부 식별자의 정보+외부 환경정보 Lexicalenviroment
this로 지정된 객체, this가 없을 경우 전역객체 저장 ThisBinding
호이스팅을 할때, 위 정보들을 복사해 미리 그에 대한 정보를 알고 있으므로 스택되어진 코드들에 대해 아래로 내려가는 과정을 거치지 않아도 알기 위해
3.호이스팅은 무엇일까요?
실행컨텍스트가 관여하는 코드를 위로 끌어올려주는 과정, 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다. (var로 선언한 변수의 경우 호이스팅 시 undefined로 변수를 초기화하지만, let과 const로 선언한 변수의 경우 호이스팅 시 변수를 초기화하지 않음.)
4.왜 귀찮게 호이스팅같은 개념이 있을까요?
코드해석을 수월하게 하기 위해? 스택되어진 코드들은 오래될 수록 밑으로 쌓이게 되는 구조이므로 다 꺼내봐야 그 내용을 알 수가 있는데, 꺼내보지 않아도 선언전에 미리 보여줌으로써 코드해석이 쉬워질 수 있다..?
5.함수 선언문과 함수 표현식은 어떻게 다를까요?
함수 선언문의 경우 별도의 할당 명령없이 function(함수) {} 와 같은 형식이지만, 함수명이 정의되어야 하며 함수 표현식의 경우 let 함수 = function(){} 과 같이 별도의 변수에 할당 해주어야 하고, 함수명이 필수로 정의되지않아도 된다 .
6.스코프는 무엇일까요?
변수, 함수와 같은 식별자를 찾아내기 위한 하나의 규칙 , 이 규칙에 의거해 자바스크립트 내에서 식별자를 찾아낸다.
7.스코프는 왜 중요할까요?
스코프가 없을 경우 충돌이 일어날수 있으므로 식별자 이름은 프로그램 내에서 유일한 이름처럼 사용되어야한다.(재할당, 재선언 불가)

📌 1.우리가 실행 컨텍스트를 제대로 이해하지 못한다면 어떤 문제가 일어날까요?
점점 쌓이는 스택된 코드들의 하단 코드를 찾기 위해 모든 코드를 다 꺼내보아야 알 수 가 있으므로 변수명이나 객체를 확인할때 소요되는 시간이 늘어날것이라고 생각된다.
2.우리가 스코프를 제대로 이해하지 못한다면 어떤 문제가 일어날까요?
규칙없이 오로지 변수명이나, 함수명과 같은 이름으로만 식별자를 구분하게 된다면 지역변수나 전역변수를 각각 사용하고, 선언하고 호출할 경우 중복으로 호출될 수 있을 것 같다.

✏️개념정리

  • 실행 컨텍스트: 자바스크립트 코드가 실행/연산되어지기 위한 공간
  • this: 식별자, 객체를 지정하며 지정된 객체가 없을 경우 전역객체를 가리킨다..?
  • 환경 정보: 현재 컨텍스트와 관련된 코드의 식별자 정보(값X, 어떤식별자?ㅇ)
  • 스택: 가장 먼저 들어오는 코드를 컵의 바닥부터 쌓는것과 같은 방식
  • 큐: 가장 먼저 들어오는 코드를 좌측으로 밀어넣는 뚫려있는 파이프에 밀어넣는것과 같은 방식
  • 전역 컨텍스트: 프로그램의 모든 코드, 동작 환경을 포함하는 컨텍스트/객체
    콜스택: 실행시킨 컨텍스트들의 스택
  • Variable Environment: 변수명, 데이터, 참조값 등과 같이 내부 식별자가 가진 정보나 외부의 환경 정보 등을 담은 원본/스냅샷
  • Lexical Environment: 변수명, 데이터, 참조값 등과 같이 내부 식별자가 가진 정보나 외부의 환경 정보 등을 담은 변경 가능한 사본
  • 호이스팅: 실행컨텍스트가 관여하고 있는 코드를 위로 올려주는 과정
  • 함수 선언문: 함수 자체로 할당 명령없이 선언하는 방식으로 함수명의 정의되어야 한다.
  • 함수 표현식: 함수를 별도의 변수에 할당하는 방식, 함수명은 별도 정의되지않아도 된다.
  • 스코프: 함수나 변수같은 식별자를 찾기 위한 규칙으로 자바스크립트의 경우 오직 함수 내에서만 생성된다.
  • 스코프체인: 스코프를 안에서부터 바깥으로 차례대로 검색해나가는 것
profile
。˚⋆。˚ ☁︎˚。⋆。˚☽˚。⋆˚ ☁︎˚

0개의 댓글