-
2021_12_07 변수의 생명주기IT/js 2021. 12. 7. 15:06
딥다이브 변수의 생명주기 정리
1. 변수의 생명주기
1.1 지역 변수의 생명주기
- 변수에 생명주기가 필요한 이유는??
- 변수에 생명주기가 없으면 한번 선언된 변수는 프로그램을 종료하지 않는 한 영원히 메모리 공간을 점유한다.
- 변수는 기본적으로 자신이 선언된 위치에서 생성되고 소멸 ( 함수 내부에서 호출되면 종료시 소멸 )
- 이전 책 내용에서 변수 선언은 런타임 이전에 실행된다 라고 했는데 전역 변수 한정이다.
- 메모리 공간이 확보 된 시점 (변수 선언) 메모리 공간이 해제 되어 메모리 풀에 반환되는 시점 (소멸)
- 함수 스코프 내부에 있는 경우 함수가 종료될때 가비지 콜렉터에 의해 데이터 소멸
* c++ 에서는 동적으로 생성된 메모리들을 수작업으로 소모 시켜줘야하는데
js는 임의로 데이터 소멸을 해준다 문제는 C# 처럼 수작업으로도 가능하고 가비지 콜렉터가 잇는게 아니라
오로지 가비지 콜렉터만 있어서 임의로 소멸시킬 수 없다. (라고 책에 적혀있었음)
- 오래 살아남는 지역 변수는 함수보다 오래 생존하는 경우도 있다
-> 수업 중 배운 closure 즉, 함수 바깥에서 함수 내부의 변수를 건들이고 있을 경우에는 함수가 계속 살아있다.
// 문제1 var value = 100; function x(){ console.log(value); var value = 10; } x(); console.log(value); // 문제2 var value = 100; function x(){ var value = 10; console.log(value); } x(); console.log(value);2. 함수 내부의 변수 선언
- 함수 스코프 내의 지역 변수는 함수가 실행될 때 최상단의 올라온 것과 유사하게 작동 된다 ( js 고유 특징 )
- 유사하기만 하지 똑같지는 않음...
- 1번의 value 변수는 함수가 실행되고 변수가 할당되는 런타임 이전에 undefined 값만 가진다. (호이스팅)
- 만약 value가 호이스팅 안되고 console.log(value) 아래에만 있다고 이건 에러 문법이다! 라고 생각하면 안된다.
- var value가 아래에 있더라도 초기화(undefined)는 되고 있다는 소리 고로 최상단의 올라온 것과 유사한 작동
- 또 하나의 이유는 해당 x 함수를 할당해서 로그를 뽑아 보면 값이 10이 잇다는 것을 알 수 있다.
- 2번으로 함수 스코프 내부에서 변수 선언된 후 함수가 종료 시 바로 소멸되기 때문에
- 함수 내부에서 똑같이 value를 해봤자 바로 소멸되어 함수 내부에 있는 value 내부에 영향을 끼치는게 없다.
정답
// 1번 undefined; 100; // 2번 10; 100; // 1번 호이스팅 증명 문법 var value = 100; function x(){ console.log(value); var value = 10; return value; } let value2 = x(); console.log(value2); // 10 console.log(value); // 1003. 전역 변수의 생명 주기
- 전역 변수는 반환문을 사용할 수 없으므로 마지막 문이 실행될때, 더 이상 실행할 문이 없을 때 종료
- 전역 변수 var는 window의 프로퍼티이다. ( 2021_12_07 수업 기준 전역변수는 window의 유전자이다!)
- 고로 window가 죽을때 죽는다
4. 전역 변수의 문제점
4.1 암묵적 결합
- 전역 변수는 전역 즉, 코드 어디서든 할당할 수 있는 변수를 사용 하겠다는 것
- 모든 함수, 코드가 참조, 변경 할 수 있는 암묵적 결합을 허용한다.
- 변수의 유효 범위(사용범위) 가 클수록 코드의 가독성은 나빠지고 의도치 않게 변경 될 수 있는 위험성이 있다
- 코드의 신뢰성이 하락한다!!
4.2 긴 생명 주기 및 리소스 낭비
- 전역 변수는 window의 프로퍼티이기 때문에 생명 주기가 아주 길다. 리소스도 오랜 기간 소비한다.
- 전역 변수는 스코프 체인 상에서 종점 즉, 마지막에 찾게된다.
- 문제를 풀어보자
// 퀴즈 - 스코프 체인이란?- 스코프 체인이란?
- 전역 변수로 x 선언하고 sum 함수로 x 참조 받는 상황이 있다고 가정
- sum 함수가 Number 함수 내부, Cac함수 내부에 있을 경우 변수 x를 찾기 위해 Number 함수 다 검색
- Cac함수 내부를 다 검색 하고 다 돌아 다닌 뒤에 찾는게 전역 변수이다.
- 이처럼 스코프들을 타고타고 넘어다니면서 찾는 것을 스코프 체인이라 한다
- 물론 현대 사회 좋은 컴퓨터들은 문제가 안되겠지만 지역변수로 했을 경우가 더 빠르긴한다.
- 또한 수업 중 js 파일이 전역변수를 공유한다고 했으니 스코프체인 및 변수가 겹쳐서 대참사가 일어날 수 있다.
4.3 전역 변수 억제법
- 너무 당연한 내용이라 넣을까 말까 고민했지만...
- 모든 코드를 함수 안에서만 쓰자
- 변수 자체를 하나의 오브젝트로 만들어서 내부 데이터가 있는 방식으로 쓰자
- 오브젝트로 만드는건 그다지 유용해 보이지않는다.
5. 모듈 패턴
- 모듈 패턴이란?? 보통 일반적인 함수를 생각하면 마음 편하다.
- 장점은 전역 변수 억제, 캡슐화, 구현 은닉성 까지 갖춤!
- 모듈 패턴은 closure 을 기반으로 한다
- c++ 은 public, private, protected 가 있지만
- js의 모듈에서는 public과 private가 반반 섞인 오염도를 막으면서 외부에서 접근도 어느정도 허용 가능하다.
- 독자적인 모듈 스코프를 제공 받아 사용하는 것이고 해당 모듈 내부에서 var 키워드로 선언한 변수는
- 전역 변수도 아니고 window 프로퍼티도 아니다.
- 모듈 추가 후
- 사용법은 <script type="module" src="lib.mjs> </script>
- 그러나 IE에서는 작동하지 않는다...
- 모듈에 대한 자세한 설명은 49장에서 설명
'IT > js' 카테고리의 다른 글
2021_12_14 생성자 함수에의한 객체 생성 (0) 2021.12.14 2021_12_08 윤년계산 알고리즘 (0) 2021.12.08 2021_12_04 node, npm 용어가 cmdlet... 에러 (0) 2021.12.04 2021_12_01 js 시간값 얻어오기 (0) 2021.12.01 2021_11_29 데이터 타입 (0) 2021.11.30