Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

roadmap

4. 값과 참조 본문

web programming/JavaScript

4. 값과 참조

kdw_w 2020. 8. 5. 13:41

 

 

 

자바스크립트는 기본타입과 참조타입을 가지고 있다

본질적으로 값, 참조 개념과 같은 것이다

 

 

먼저 C언어에서 문자열을 저장하면 그것을 수정할 수 없다 

 

1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() {
    char* s = "why?";
    s[0= 's';    // *s과 같음
 
    printf("%s\n", s);
}
cs

디버깅해보면 s[0]이 0x.... 메모리 번지수를 가리킨다고 나오며 오류가 뜬다

이유는 문자열을 저장하면 일단 그것이 텍스트 세그먼트로 저장된다 

그런데 텍스트 세그먼트는 프로그래머가 수정할 수 없고 읽기만 가능하다

s[0] = "s"; 는 s 위치의 것을 문자 's'로 수정하는 것이므로 오류가 나온다

 

 

그런데 이렇게 하면 어떨까?

1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() {
    char s[5= "why?";
 
    s[0= 's';
    printf("%s\n", s);
}
cs

정상적으로 작동한다 

 

여기선 문자열이 텍스트 세그먼트에 저장되지 않는다

스택 세그먼트에 s[0] = 'w', s[1] = 'h', ... 으로 각각 저장된다 

문장은 비슷하지만 전혀 다르게 작동한다

 

 

참조는 *s가 문자열의 첫글자의 저장주소를 가리키는 것이다 

값은 변수의 메모리에 직접 'w'를 저장하고 있는 것이다

 

 

 

자바스크립트는 숫자와 불리언은 기본타입(value)이고, 그외는 모두 참조타입(reference)이다

숫자와 불리언 외에 모두 메모리 주소를 참조만 한다

 

위의 예시처럼 문자열의 수정 또한 이루어지지 않는다 

모든 것이 참조타입인 만큼 크기가 고정되어 있지 않다

동적 자료형을 사용하므로 (변수가 객체이면 동적 자료형일 수 밖에 없다)

가비지 컬렉션으로 메모리를 해제한다 

 

 

1
2
3
      var s = "hello";  // 문자열을 위한 메모리 할당
      var u = "world";  // 새로운 문자열 생성
      s = u;            // 참조를 덮어 씌움, 접근 할 수 없으므로 처음 문자열의 메모리는 해제
cs

 

 

자바스크립트 인터프리터는 어떤 객체에 더 이상 접근할 수 없다고 판단되면 

더 이상 필요치 않다는 의미이므로 메모리를 회수한다 

 

 

 

 

 

'web programming > JavaScript' 카테고리의 다른 글

6. 배열  (0) 2020.08.05
5. 객체  (0) 2020.08.05
3. 메모리 구조  (0) 2020.08.05
2. 변수  (0) 2020.08.04
1. JavaScript를 배우는 이유  (0) 2020.08.04