javascript 연산자
연산자.
연산자란 하나이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행하여 하나의 값을 만드는 행위이다.
이때 연산의 대상을 피연산자라 한다. 피연산자는 값으로 평가될 수 있는 표현식이여야 한다. 그리고 피연산자와 연산자의 조합으로 이루어진 연산자 표현식도 값으로 평가될 수 있는 표현식이다.
1 | // 산술 연산자 |
연산자란 하나이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행하여 하나의 값을 만드는 행위이다.
이때 연산의 대상을 피연산자라 한다. 피연산자는 값으로 평가될 수 있는 표현식이여야 한다. 그리고 피연산자와 연산자의 조합으로 이루어진 연산자 표현식도 값으로 평가될 수 있는 표현식이다.
1 | // 산술 연산자 |
C나 자바 같은 정적타입 언어는 변수를 생성할 때 변수에 할당할 수 있는 값의 종류 즉 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 선언 이라고 한다.
정적 타입 언어에서는 변수의 타입을 변경 할 수 없으머 변수에 선언한 타입에 맞는 값만 할당이 가능하다. 컴파일 시점에서 타입 체크를 수행한다. 이때 통과를 하지 못하면 에러가 발생하고 프로그램이 실행 되지 않는다. 이를 통해 타입의 일관성을 강제함으로써 안정적인 코드의 구현으로 실행시 일어나는 에러를 줄일 수 있다.
하지만 자바스크립트는 변수를 선언할때 타입을 명시하지 않는다. 이로 인해 어떠한 값도 변수에 할당이 가능하다. 이러한 특징으로 인해 정적 타입 언어에서의 데이터 타입과 개념이 조금 다르다.
자바스크립트는 값을 할당하는 시점에 변수의 데이터 타입을 동적으로 결정한다. 또한 이 값을 언제든 변경이 가능하다.
즉 자바스크립트에서 변수는 선언이 아닌 할당에 의해 타입이 결정되고 재할당에 의해 변수의 타입은 변경이 언제든지 가능하다고 볼 수 있다. 이러한 특징을 통적 타이핑이라 한다.
동적 타입 언어에서는 변수에 어떤 데이터 값도 자유롭게 할당이 가능하다. 이는 너무나도 편하고 좋은 기능이다. 하지만 떄로는 위험도 있는 것이 동적 타이핑의 단점이다.
모든 소프트웨어 아키텍쳐에는 트레이드오프가 존재한다. 이러한 문제를 해결할 명확한 해결책은 없듯이 동적 타입 언어 구조 또한 구조적인 단점이 존재한다.
트레이드 오프 두개의 정책이나 목표 중 하나를 달성하려할 때 다른 목표의 달성이 늦어지거나 손실이 생기는 모순적인 상황을 의미한다.
동적 타이핑의 구조적 단점으로는 변수값이 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서 변하는 값을 추적하기 어렵다는 단점 그리고 변수의 타입이 고정되어 있지 않고
동적으로 변하는 언어의 변수는 값의 변경만으로 타입이 변할 수 있다는 단점이 있다. 즉 동적 타입 언어의 변수는 값을 확인하기 전까지 값의 타입을 확신 할 수 없다.
또한 자바스크립트는 개발자의 의도와 상관없이 타입이 엔진에 의해 변하는 상황이 생기기도 한다. 이러한 문제들로 인해 동적 타이핑은 유연성이 높다는 장점을 가지고 신뢰성이 떨어진다는 단점이 존재한다.
이때문에 자바스크립트에서 변수를 사용할 때는 다음과 같은 주의 사항이 필요하다.
데이터 타입은 값의 종류를 말한다. 자바스크립트의 모든 값은 데이터 타입을 갖는다.
자바스크립트에서는 데이터 타입으로 7가지를 제공한다.
원시 타입
객체 타입
값은 메모리에 저장하고 참조 할 수 있어야 한다. 메모리에 값을 저장하기 위해서는 먼저 메모리의 공간을 확보하고 크기를 결정해야한다.
score라는 변수에 100이라는 값을 할당하기 위해서 자바스크립트 엔진은 데이터 타입에 따라 메모리의 크기를 결정하고 공간을 확보한 후 값을 저장해준다.
이렇게 값이 저장된 메모리의 값을 참조하는 경우는 식별자 score를 통해 값 100이 저장되있는 메모리의 공간을 찾아야한다. 이때 값을 참조하기 위해서는 읽어 들여야하는 메모리의 크기를 알아야 한다.
이때 자바스크립트가 변수에는 숫자 타입의 값이 할당되어있는 것을 보고 타입에 맞는 단위로 메모리에 저장된 값을 읽어들인다.
이렇게 읽어온 2진수의 데이터를 해석하는 과정에서는 데이터의 타입을 자바스크립트가 알고 있으므로 해당 타입의 값으로 해석을 하게 된다.
이러한 이유로 데이터 타입의 중요성에 대해 정리하자면 다음과 같다.
자바스크립트에서는 하나의 숫자형 타입만 존재한다.
자바스크립트에서는 모든 수를 실수로 처리하며 정수만 표현하기위한 데이터 타입은 존재하지 않는다.
1 | var integer = 10; // 정수 |
위의 값은 모두 숫자 타입이다.
이러한 특징으로 인해 자바스크립트에서 숫자형은 표기하는 방식만 다를뿐 모두 같은 값을 가질 수 있다는 것을 의미한다.
문자열 타입은 텍스트 데이터를 나타내는 데 사용한다. 문자열은 0개 이상의 16비트 유니코드 문자의 집합으로 대부분의 문자 표현이 가능하다.
문자열은 작은따옴표, 큰따옴표 또는 백틱으로 텍스트를 감싼다. 자바스크립트에서 가장 일반적인 표기법은 작은따옴표를 사용하는 것이다.
1 | var string = 'String'; |
템플릿 리터럴은 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.
일반 문자열 내에서는 줄바꿈이 혀용되지 않는다. 일반 문자열 내에서 줄바꿈을 하려면 \ 로 시작하는 이스케이프 시퀸스를 따라야한다.
이스케이스 시퀀스 | 의미 |
---|---|
\0 | Null |
\b | 백스페이스 |
\f | 폼피드, 프린터로 출력할경우 다음 페이지의 시작 지점으로 이동한다. |
\n | 개행, 다음 행으로 이동 |
\r | 개행, 커서를 처음으로 이동 |
\t | 탭(수평) |
\v | 탭(수직) |
\uXXXX | 유니코드 |
' | 작은따옴표 |
" | 큰따옴표 |
\ | 백슬래쉬 |
1 | var templete = '<ul>\n\t<li><a href="#">Home<\a></li>\n</ul>'; |
result
1 | <ul> |
문자열은 + 기호를 사용해 연결할 수 있다. + 기호는 피연산자 중 하나 이상이 문자열일 때 문자연결 연산자로 통한다.
1 | var first = 'Han'; |
1 | var first = 'Han'; |
표현식을 삽입하기 위해서 ${}로 감싸면 된다.
불리언 타입의 값은 논리적 참, 거짓을 나타내는 true, false만 존재한다.
1 | var foo = true; |
undefined 타입의 값은 undefined가 유일하다.
var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화가 된다. 이러한 이유로 값이 할당되지 않은 변수를 참조시 undefined가 출력된다.
1 | var foo; |
undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수에 할당하는 것이므로 개발자가 직접 할당하는 것은 undefined의 취지에 어긋나며 혼란을 줄 수 있게되므로 권장하지 않는다.
null 타입의 값은 null이 유일하다. 자바스크립트는 대소문자를 구분하므로 null, Null NULL은 모두 다르다.
null은 변수에 값이 없다는 것을 의도적으로 명시 할 때 사용한다.
1 | var foo = 'Lee'; |
심벌은 ES6에서 추가된 타입으로 변경이 불가능한 원시적인 타입이다. 다른 값과 중복 되지 않는 유일한 값이기 때문에 주로 충돌 가능성이 없는 유일한 프로퍼티 키 값을 만들 때 주로 사용하게 된다.
Symbol 함수를 호출하여 생성한다. 이때 생성된 값은 외부에 노출되지 않으며 다른 값과 중복되지 않는 값이다.
1 | var key = Symbol('key'); |
값은 식이 평가되어 생성된 결과를 의미한다. 평가란 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.
1 | 10 + 20; |
10 + 20 이 평가되어 30이라는 값을 생성한다.
모든 값은 데이터 타입을 가지며 메모리에 2진수로 저장된다. 메모리에 저장된 값은 타입에 따라 다르게 해석 될 수 있다. 0100 0000이란 2진수를 문자열로 해석하면 A 이지만 숫자로 해석하면 65인것 처럼 말이다.
리터럴이란 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법을 의미한다.
리터럴 | 예시 | 비고 |
---|---|---|
정수 | 100 | |
부동소수점 | 10.5 | |
2진수 | 0b01000001 | ob로 시작 |
8진수 | 0o101 | ES6에서 도입 |
16진수 | 0x41 | ES6에서 도입 |
문자열 | ‘Hello’ | |
불리언 | true, false | |
null | null | |
undefined | undefined | |
객체 | {name: ‘Lee’, address: ‘seoul’}; | |
배열 | [‘lee’, ‘han’]; | |
함수 | function() {} | |
정규표현식 | /[A-Z]+/g |
표현식은 값으로 평가될 수 있는 문이다. 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
문 은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다. 이러한 문은 여러개의 토큰으로 이루어지며 토큰이란 문법적인 의미를 가지며 문법적으로 더이상 나눌 수 없는 코드의 기본 요소를 의미한다. 예를 들면 키워드, 식별자, 연산자, 리터럴, 세미콜론, 마침표 등의 특수기호는 문법적인 의미를 가지며 모두 토큰이다.
문은 선언문, 할당문, 조건문, 반복문 등으로 구분이 가능하다.
1 | // 선언문 |
컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션의 한종류이다.
컴퓨터에게 전달하는 기계어를 사람이 이해할수있는 약속된 구문으로 구성된 프로그래밍 언어를 사용하여 프로그램을 작성하고 기계어로 변환하는 과정을 이용한다. 이때 변환하는 일종의 번역기를 컴파일러 혹은 인터프리터라고 한다.
즉 프로그래밍언어는 컴퓨터와의 일종의 커뮤니케이션으로 프로그래밍 언어는 구문과 의미의 조합으로 표현된다.
이러한 과정을 거치는 프로그래밍이란 결국 요구사항의 집합을 분석하여 적절한 자료구조와 함수의 집합으로 변환한 후 그 흐름을 제어하는 것이다.