변수와 데이터타입

heejung·2022년 1월 5일
0

코어자바스크립트

목록 보기
1/4
post-thumbnail

변수

값이 들어있는 메모리 상의 주소를 기억하는 저장소이다.
흔히 변수와 식별자를 혼용하는 경우가 많은데, 명확히 말하자면 변수는 데이터를 뜻하고 식별자는 변수명을 뜻한다.

var a; //선언
a = 'abc'; //할당

변수의 선언과 할당을 위한 메모리 영역은 변수명 영역과 데이터 영역으로 구분할 수 있다.

변수를 선언하면 메모리 영역의 빈 공간(변수명 영역)을 하나 확보하고 이름을 a로 지정한다.
그리고 변수에 값을 할당하면 다른 공간(데이터 영역)을 따로 확보하여 값을 저장하고 그 데이터 영역의 주소를 변수명 영역의 값에 저장한다.

변수 영역에 직접 값을 저장하지 않고 한 단계 더 거치는 이유는 데이터 변환을 자유롭게 하고 메모리를 효율적으로 사용하기 위해서이다.
자바스크립트는 동적 타입 언어로, 선언 시 변수의 타입을 지정하지 않고 할당할 때 변수의 타입을 결정한다. 미리 데이터 영역을 확보해뒀다가 나중에 할당받은 데이터가 그 영역보다 크면 메모리를 늘리는 등 번거로운 작업을 거쳐야하기 때문에, 우선 변수명을 저장해놓고 나중에 값을 할당받으면 데이터 공간을 확보하여 저장하는 것이다.

데이터타입

ES6에서 제공하는 데이터타입은 7가지로, 기본형 데이터와 참조형 데이터로 구분된다.

기본형 데이터 (원시 타입)

  • Number
    • 모든 수를 실수 처리한다.
    • Infinity : 양의 무한대
    • -Infinity : 음의 무한대
    • NaN : 산술 연산 불가
  • String
    • " "' ' 안에 텍스트를 넣어 생성
    • 인덱스를 통해 접근 가능 (유사배열)
  • Boolean
    • 논리적 참(true), 거짓(false)을 나타내는 값을 가진다.
    • null, undefined, 0은 false 값을 가진다.
  • null
    • 의도적으로 변수에 값이 없다는 걸 명시하기 위해 사용
    • 변수에 저장된 메모리 주소의 참조 정보를 제거
    • typeof로 연산하면 object 반환 => JS 설계상 오류
    • null인지 아닌지 확인하려면 일치연산자(===) 사용
  • undefined
    • 자바스크립트 엔진에 의해 초기화된 값
      • 선언 후 할당하지 않은 변수에 접근할 때
      • 존재하지 않는 객체의 프로퍼티에 접근할 때
      • 함수 호출 시 유효한 값을 반환할 수 없을 때
    • 값이 없다는 걸 명시하고 싶다면 null을 사용하자.
  • Symbol
    • 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키를 만들기위해 사용

참조형 데이터 (객체 타입)

  • Object (배열, 함수, 정규표현식 등)
    • 데이터, 데이터와 관련된 동작(절차, 방법, 기능)을 모두 포함할 수 있는 개념적 존재
    • 프로퍼티와 메소드를 포함
      • 프로퍼티: 이름과 값을 가지는 데이터
      • 메소드: 동작을 의미

불변값과 가변값

변수와 상수를 구분짓는 성질은 '변경 가능성'이다.
바꿀 수 있으면 변수, 바꿀 수 없으면 상수이다.
그렇다면 상수와 불변값이 같은 개념일까? 답은 '아니오'다.

변수와 상수를 구분짓는 변경 가능성의 대상은 변수 영역 메모리이다. 데이터 할당이 된 변수 영역에 다른 값을 재할당 할 수 있느냐가 관건이다.
반면, 불변성 여부를 구분짓는 변경 가능성의 대상은 데이터 영역 메모리이다.

기본형 데이터는 불변값이다.
숫자든 문자든 한 번 값을 할당하면 다른 값으로 변경할 수 없다. 새로운 데이터 공간에 다른 값을 저장하여 그 주소를 연결하면 되지만 이걸 값을 변경했다고 볼 수는 없다. 이전의 데이터 값의 주소를 참조하지 않을 뿐 여전히 그 값은 존재하기 때문이다.
한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 절대 변하지 않는다.

참조형 데이터는 기본형 데이터와 달리 객체의 변수(프로퍼티) 영역이 따로 존재하여 그곳에 프로퍼티를 저장하고, 데이터 영역에 그 주소를 저장한다.
그래서 객체 변수 영역의 값이 다른 주소로 변경되어도 데이터 영역에는 변경사항이 없다. 즉, 데이터 영역에 변화가 없음에도 프로퍼티의 값이 달라질 수 있기 때문에 가변값이라고 보는 것이다.

단, 참조형 데이터가 가변값이라는 건 참조형 데이터 자체를 변경할 경우가 아니라 내부의 프로퍼티를 변경할 때만 성립한다.

profile
프론트엔드 공부 기록

0개의 댓글