[JS 스터디] 데이터 타입과 연산자

2023. 3. 31. 02:29JavaScript

데이터 타입

  • 모든 값은 데이터 타입을 갖는다.
  • 원시 타입 : 변경이 불가능한 값
    • 숫자 타입
      • 모든 수를 실수로 처리 (배정밀도 64비트 부동소수점 형식의 2진수로 저장)
      • 따라서 정수끼리 나누면 실수가 나올 수 있다
      • 2진수, 8진수, 16진수 표현하기 위한 데이터 타입 존재 X → 참조 시 모두 10진수로 해석
      • Infinity , -Infinity , NaN
    • 문자열 타입
      • 0개 이상의 16비트 유니코드 문자의 집합
      • <cf> C나 자바는 문자열 타입 없음. 문자의 배열로 표현하거나 객체로 표현. 자바스크립트는 문자열타입이 원시타입 !! → 변경 불가능한 값
      • 템플릿 리터럴
    • 불리언 타입
    • undefined 타입
      • undefined 타입의 값은 undefined가 유일
      • 자바스크립트 엔진이 변수를 초기화 하는 데 사용 (’개발자’가 할당한 값이 없다. 정의되지 않았다. 를 의미)
      • 개발자가 undefined값을 할당하는 것은 바람직하지 않고, 값이 없음을 표현하고 싶다면 null을 할당
    • null 타입
      • null 타입의 값은 null이 유일
      • 변수에 값이 없다는 것을 의도적으로 명시하기 위해 사용
        • 이전에 할당돼 있던 값을 제거, 이전에 참조하던 값 참조하지 않겠다
      • 자바스크립트 엔진이 해당 메모리 공간 가비지콜렉션 수행
      • 함수가 유효한 값을 반환할 수 없는 경우 null 반환
    • 심벌 타입 (ES6)
      • 다른 값과 중복되지 않는 ‘유일무이한 값’
      • 보통 객체의 유일한 키를 만들기 위해 사용
      • var key = Symbol('key')
  • 객체 타입
    • 6가지 원시 데이터 타입 이외의 모든 값
    • 자바스크립트는 객체 기반의 언어

템플릿 리터럴

(ES6) 템플릿 리터럴 : 새로운 문자열 표기법

  • 편리한 문자열 처리 기능 제공
    • 멀티라인 문자열
      • <cf> 일반 문자열은 줄바꿈 등을 이스케이프 시퀀스 를 사용해야 표현 가능
      • 줄바꿈, 공백 등 모두 있는 그대로 표현됨
    • 표현식 삽입
      • <cf> 일반 문자열은 문자열을 연결하려면 + 연산자 사용 (피연산자 중 하나 이상이 문자열일 경우 문자열로 연결)
      • ${ } 로 표현식을 감싸 평가 결과를 문자열로 강제 변환하여 삽입
    • 태그드 템플릿

데이터 타입의 필요성

  • 메모리 공간의 확보와 참조 시 메모리 크기를 알기 위해
    • 값을 할당할 때 자바스크립트 엔진은 값의 종류, 즉 데이터 타입에 따라 확보해야 하는 메모리 공간(셀)의 크기를 알 수 있음
    • 값을 참조할 때 자바스크립트 엔진은 값의 종류, 즉 데이터 타입에 따라 한 번에 읽어들여야 할 메모리 셀의 크기를 알 수 있음
      • 만약 숫자 값을 읽어들일 때 숫자의 크기인 8byte 단위로 읽어들이지 않으면 값이 훼손됨
  • 값을 어떻게 해석할지 알기 위해
    • 데이터 타입과 상관없이 메모리에는 값이 2진수로 저장
    • 데이터 타입을 알아야 2진수를 숫자로 해석할지, 문자열로 해석할지 등을 알 수 있음

동적 타이핑

<cf> 정적 타입 언어: 변수 선언 시 변수의 타입이 결정됨. 이후 변경 불가.

동적 타입 언어: 변수 할당 시 변수의 타입이 동적으로 결정됨. 이후 재할당에 의해 변경 가능.

  • 변수는 타입을 갖지 않는다.
    • 값은 타입을 갖는다.
    → 변수에 할당돼 있는 값에 의해 변수의 타입이 동적으로 결정된다.
  • 단점
    • 매변 값이 변경될 수 있기 때문에,
    • 변수 값을 추적하기 어렵다. 타입도 추적하기 어렵다.
    → 타입에 대한 잘못된 예측으로 프로그램에 오류가 발생할 가능성이 크다.
💡 변수 사용 시 주의사항
변수는 꼭 필요한 경우에 제한적으로 사용한다.
변수는 가급적 스코프를 좁게 설정한다.
변수보다는 상수를 사용한다.

연산자

  • 값으로 표현되는 표현식인 피연산자
  • 피연산자와 연산자의 조합으로 이루어진 ‘연산자 표현식’도 값으로 표현
  • 산술 연산자 : 새로운 숫자 값을 만든다
    • 산술 연산이 불가능한 경우: NaN 반환
    • 1+false 의 경우 불리언 값을 0으로 강제 타입 변환함: 암묵적 타입 변환 / 타입 강제 변환
    • 이항 산술 연산자 : 2개의 피연산자를 산술 연산
      • +, -, *, /, %
    • 단항 산술 연산자 : 1개의 피연산자를 산술 연산
      • ++, --, +, -(음수를 양수로, 양수를 음수로)
      • 증가, 감소 연산자 ++, --는 피연산자의 값을 변경하는 부수 효과 O → 피연산자의 값을 변경하는 암묵적 ‘할당’이 이루어짐
        • 피연산자 앞에 위치 → 전위 증가/감소 연산자 → 피연산자 값 증가/감소 후에 다른 연산
        • 피연산자 뒤에 위치 → 후위 증가/감소 연산자 → 다른 연산 후에 피연산자 값 증가/감소
      • +, - 단항연산자는 피연산자를 숫자 값으로 변환한 새로운 값을 생성하여 반환
  • 문자열 연결 연산자 : +
    • 피연산자 중 하나라도 문자열이면 문자열 연결 연산자로 동작, 이 외에는 모두 산술 연산하여 숫자 값 반환
  • 할당 연산자
    • 우항의 피연산자의 평가 결과를 좌항의 변수에 할당
    • 할당문(c = 10)은 ‘표현식인 문’
      • 할당된 값으로 평가되기 때문에 ‘표현식인 문’
      • → 할당문을 다른 변수에 할당 가능 → 연쇄 할당(a = b = c = 10) 가능
  • 비교 연산자
    • 좌항 우항 비교 후 불리언 값을 반환
    • 동등 연산자 ==
      • 암묵적 타입 변환하여 값만 비교하기 때문에 예측이 어려움, 지양
    • 일치 연산자 ===
      • 암묵적 타입 변환하지 않고 타입까지 비교하기 때문에 예측 용이
      • NaN는 NaN과 === 해도 false 반환 (NaN이 유일) → Number.isNaN() 빌트인 함수 사용 → (ES6) Object.is(피1, 피2) 메서드 사용
    • 대소관계 비교 연산자
  • 삼항 조건 연산자 : … ? … : …
    • 두 번째 or 세 번째 피연산자를 반환
    • 첫 번째 피연산자는 조건식
      • 불리언 값으로 평가될 표현식
        • 평가 결과가 불리언 값이 아니라면 불리언 값으로 암묵적 타입 변환
    • if … else 문과 달리 값으로 사용할 수 있는 ‘표현식인 문’ → 조건에 따라 값을 반환해야 하는 상황이라면 유리 → 조건이 여러 개라 가독성이 중요한 경우가 아니라면 삼항 조건 연산자가 유리
  • 논리 연산자 : ||, &&, !
    • 논리 부정 연산자 ! 는 항상 불리언 값 반환
      • 피연산자가 불리언 값이 아니더라도 불리언으로 암묵적 타입 변환
    • 논리합 ||, 논리곱&& 연산자 표현식은 항상 두 피연산자 중 하나로 평가
  • 쉼표 연산자 : ,
    • 왼쪽 피연산자부터 차례대로 평가 후 마지막 피연산자의 평가 결과 반환
  • 그룹 연산자 : ()
    • 우선순위 조절
  • typeof 연산자
    • string, number, boolean, undefined, symbol, object, function 중 하나를 반환
      • 7가지 데이터 타입과 정확히 일치X
      • null 대신 object 반환
      • 선언하지 않은 식별자는 ReferenceError가 아닌 undefined 반환
  • 지수 연산자 : **
    • 이항 연산자 중 우선순위 가장 높다
      • 음수가 밑인 경우는 음수를 괄호로 묶어줘야 (-5) ** 2

부수효과가 있는 연산자

  • 다른 코드에 영향을 주는 부수효과
    • 할당연산자 =: 변수의 값을 변경함
    • 증가감소연산자++,--: 피연산자의 값을 변경함
    • delete연산자: 객체의 프로퍼티를 삭제함