[JS 스터디] 데이터 타입과 연산자
2023. 3. 31. 02:29ㆍJavaScript
데이터 타입
- 모든 값은 데이터 타입을 갖는다.
- 원시 타입 : 변경이 불가능한 값
- 숫자 타입
- 모든 수를 실수로 처리 (배정밀도 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 반환
- string, number, boolean, undefined, symbol, object, function 중 하나를 반환
- 지수 연산자 : **
- 이항 연산자 중 우선순위 가장 높다
- 음수가 밑인 경우는 음수를 괄호로 묶어줘야 (-5) ** 2
- 이항 연산자 중 우선순위 가장 높다
부수효과가 있는 연산자
- 다른 코드에 영향을 주는 부수효과
- 할당연산자 =: 변수의 값을 변경함
- 증가감소연산자++,--: 피연산자의 값을 변경함
- delete연산자: 객체의 프로퍼티를 삭제함
'JavaScript' 카테고리의 다른 글
[JS스터디] 실행 컨텍스트, 스코프 (0) | 2023.04.04 |
---|---|
[JS스터디] 함수 (0) | 2023.04.04 |
[JS스터디] 원시 값과 객체의 비교 (0) | 2023.04.03 |
[JS스터디] 제어문, 타입변환과 단축평가 (0) | 2023.03.31 |
[JS스터디] 변수, 표현식, 문 (0) | 2023.03.31 |