02. 데이터 타입

HoonDong_K·2022년 6월 3일
0
post-thumbnail

❗ 데이터 타입

⭕ 숫자 타입

C나 자바의 경우, 숫자를 정수와 실수로 구분하여 int, double, float 등 다양한 숫자 타입을 제공한다. 하지만 자바스크립트의 경우 하나의 숫자 타입만 존재한다.

var integer = 10
var double = 10.12
var negative = -12
//단지 변수를 선언하고 할당할 뿐, 데이터 타입을 미리 규정하지 않는다.

다만 숫자 타입에서 세 가지 특별한 값도 표현이 가능하다.

  • Infinity : 양의 무한대
  • -Infinity : 음의 무한대
  • NaN : not a number (산술 연산 불가)

⭕ 문자열 타입

문자열은 작은 따옴표( '' ), 큰 따옴표( "" ), 백틱 ( `` ) 으로 텍스트를 감싸 사용이 가능하다 .

** 만약 문자열 내부에 따옴표를 사용하고 싶다면 문자열을 나타내는 따옴표와 다른 따옴표를 사용해야 한다.

var text = 'I said "Hello"'
var text2 = "I said 'Hello'"
console.log(text)
console.log(text2)

문자열을 사용하게 될 때 코드 상 줄바꿈은 허용되지 않는다.

첫 번째 text 변수에서 큰 따옴표를 사용하여 문자열 내부에 줄바꿈을 포함하려 하였지만, 허용되지 않았으며 두 번째 text 변수에서 백틱을 사용하여 줄바꿈을 포함하여 성공적으로 변수를 선언하였다.

만약 일반 문자열에서 줄바꿈을 표현하고 싶다면 Escape sequence를 사용하여 표현할 수도 있다.

백틱을 사용하면 더 편리하게 표현식을 삽입할 수 있다.

일반적으로 문자열에서 문자열 연산자 '+'를 사용하여 연결할 수 있으며 변수를 활용하여 문장을 생성한다.

var firstName = 'Ethen'
var lastName = 'Kang'

console.log('My name is ' + firstName + ' ' + lastName)

하지만 백틱을 사용한다면 연산자 없이 표현할 수 있기에 가독성을 높일 수 있다.

console.log(`My name is ${firstName} ${lastName}`)

⭕ 불리언 타입

불리언 타입은 true, false 값을 나타낸다. 참 거짓을 나타내는 boolean 타입은 조건문에서 자주 사용된다. 추후 조건문 포스팅에서 자세히 적어내겠다.

⭕ undefined

변수를 선언할 때 자바스크립트 특성 상 암묵적으로 undefined로 초기화된다. 이는 garbage value를 지우기 위해 자동적으로 초기화 된다.

undefined라는 값은 개발자가 의도적으로 할당하는 게 아닌 자바스크립트 엔진에 의해서 할당되기 때문에 만약 변수 참조 시 undefined가 반환되었다면 우리는 그 변수가 개발자에 의해 초기화된 값이 아니라는 것을 추측할 수 있는 이점이 있다.

** 그렇기 때문에 개발자가 의도적으로 변수에 undefined를 할당하는 것은 본래 취지에 어긋나 혼란일 일으킬 수 있기에 권장되지 않는다.

⭕ null

개발자는 값을 알지 못하는 변수에 undefined를 할당할 수 없으니 null이란 값을 할당해준다. null 은 undefined 와 다르게 개발자가 의도적으로 변수에 값이 없다라는 것을 명시하기 위해서 사용된다.

즉, null을 할당한다는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다. 또한 자바스크립트 엔진은 더 이상 참조되지 않는 메모리 공간에 의해 garbage collection 을 수행할 것이다.

** 추가적으로 함수가 유효한 값을 반환할 수 없는 경우 null 을 반환하기도 한다.

'hello'라는 클래스를 사용하는 요소가 없다면 element 변수는 null이 반환된다.

⭕ 심벌 타입

심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다.

이름 충돌 위험이 없는 객체의 프로퍼티 키를 만들기 위해 사용된다.

추후 symbol 포스팅에서 자세히 다루겠다.

❓ 데이터 타입은 왜 있을까

데이터 타입의 필요성은 크게 세 가지로 볼 수 있다.

  • 값을 저장하기 위한 메모리 공간 크기 결정
  • 값을 참조하기 위한 메모리 공간 크기 결정
  • 메모리에서 가져온 값 해석 방법 결정

우리는 값을 변수에 할당하여 메모리에 저장할 수 있다. 하지만 메모리를 효율적으로 사용하기 위해서 변수는 값에 알맞는 최적의 메모리 공간을 확보할 수 있어야 한다. 이 과정에서 변수에 할당되는 값의 데이터 타입에 따라 적절한 메모리 공간 크기를 판단하고, 이에 맞는 메모리 공간을 찾아 저장할 수 있는 것이다.

두 번째로 우리가 값을 메모리로부터 참조를 할 때, 데이터 타입은 메모리의 어느 셀까지 읽어와야 하는 지 판단의 기준점이 된다. 변수에 담긴 메모리 주소는 해당 메모리의 선두 메모리 셀의 주소이기 때문에 모든 메모리 셀의 주소가 담겨져 있지 않다. 그렇기 때문에 우리는 변수에 담겨진 데이터 타입을 보고, 메모리 공간의 크기를 판단한 후, 메모리 첫 셀의 주소부터 데이터 타입의 크기의 메모리까지 읽어올 수 있는 것이다.

마지막으로 메모리에서 가져온 값의 해석 방법이다. 메모리에 값을 저장하면 2진수로 저장되게 된다. 그렇기 때문에 우리가 메모리로부터 가져온 값 또한 2진수로 가져올 것이다. 만약 메모리에서 '0100 0001' 이라는 2진수를 가져왔다면 이는 데이터 타입에 따라서 다르게 해석될 수 있을 것이다. 숫자로 읽는다면 '65'가 나올 것이고, 문자로 해석한다면 'A'가 나올 것이다. 이 처럼 우리가 값을 어떤 타입으로 해석할 것인지에 대한 기준점도 제공해준다.

❗ 동적 타이핑

C와 자바와 같은 정적 타입 ( static/strong type) 언어는 변수를 선언할 때 데이터 입을 미리 선언해야 한다.

char c;
int num;

이런 정적 타입 언어는 변수 선언 후 타입 변경이 불가하며, 데이터 타입에 맞는 값만 할당할 수 있다. 이는 컴파일 과정에서 타입 체크를 수행하게 되며, 타입에 맞지 않는 값이 할당되었을 경우 에러를 발생시킨다. 이러한 정적 타입 언어는 타입의 일관성을 강제하여 더욱 안정적인 코드를 구현하여 런타임 도중 발생하는 에러를 줄여준다.

이와 반대로 자바스크립트는 변수를 선언할 때 타입을 함께 선언하지 않으며 변수에 할당되는 값에 따라 타입을 추론하고 재할당을 통해 언제든지 동적 ( dynamic/weak type )으로 타입이 변할 수 있다.

이렇게 변수가 쉽게 변경될 수 있을 가능성이 큰 만큼, 복잡한 프로그램에서는 변수의 타입을 추적하기 어려울 수 있으며, 직접 값을 확인하기 전까지 타입을 확정지을 수 없다는 어려움도 있다. 그렇기 때문에 안정적인 프로그램을 만들기 위해서는 몇 가지 주의사항이 필요하다.

  • 변수는 꼭 필요한 경우 제한적으로 사용한다.
  • 변수의 유효 범위 ( 스코프 )를 최대한 좁게 만들어 변수의 부작용을 억제한다
  • 변수보다 상수(const)를 사용하여 값의 변경을 억제한다
  • 변수의 이름은 파악하기 쉽게 네이밍해야 한다.
profile
코드 한 줄이 나를 증명하는 개발자

0개의 댓글