해당 포스팅은 링크된 웹사이트를 보고 이해한 내용을 정리합니다.
변수(Variable)
변수(Variable)란, 메모리 주소(Memory Address)에 접근하기 위해 사람이 이해할 수 있는 언어로 지정한 식별자(Identifier)
쉽게 말해, 메모리 상의 주소지를 의미해요!
인사이드 아웃처럼 컴퓨터 내부에도 컴퓨터를 이루는 구성들 간의 작은 세상이 존재해요!
인간의 주소지처럼, 컴퓨터 내부의 메모리 상의 주소지도 존재해요.
그래야 어느 집에 누가 사는지 알 수 있으니까요.
변수에 들어가서 사는 친구의 이름이 값(value)이고 이를 저장해두어요. 우리 주민센터에서 하는 일이랑 같아요.거주지에 거주자를 저장해두잖아요. 세대주는 누구고, 가구원은 누가 있는지 같은 것들이요.그리고 저장된 값을 참조하기 위해 사용해요. 필요에 의해 요청하면 거기서 사용할 수 있게 한다는 거죠.
변수도 사람 사는 세상과 같은 개념이 적용됩니다. 우리 파티룸 같은 거 당일치기로 빌릴 때 주민센터에 가서 주소지를 바꾸지 않죠? 그것처럼 변수도 한 번 쓰고 마는 값이 아니라 유지(chashing)할 필요가 있는 값만 담아서 사용해요.
+) 좋은 점은 변수 이름을 값의 의미를 담아 정할 수 있다는 거예요!
= 코드의 가독성을 위함이지만요.
var x;
x = 6;
변수를 선언할 때는 var 키워드를 사용하고 할당 연산자 = 는 변수에 값을 할당하기 위해 사용
값(Value)
: 프로그램에 의해 조작될 수 있는 대상
값을 생성하는 방법 - 리터럴 표기법(literal notation)
데이터 타입(Data Type) | 프로그래밍 언어에서 사용할 수 있는 값의 종류 |
변수(Variable) | 값이 저장된 메모리 공간의 주소를 가리키는 식별자(identifier) |
리터럴(literal) | 소스코드 안에서 직접 만들어 낸 상수 값 자체를 말하며 값을 구성하는 최소 단위 |
* 원시 타입 리터럴은 다양한 연산자의 피연산자가 되어 하나의 값이 될 수 있음
원시 타입(Primitive Data Type) | number, string, boolean, null, undefined, symbol |
객체 타입(Object Data Type) | object |
* 자바스크립트는 C나 Java와는 다르게 변수를 선언할 때 데이터 타입을 미리 지정 X
= 변수에 할당된 값의 타입에 의해 동적으로 변수 타입 결정(동적 타이핑)
연산자
하나 이상의 표현식으로 산술, 할당, 비교, 논리, 타입 연산 등을 수행해 하나의 값 생성
연산의 대상 : 피연산자(Operand)
* 피연산자의 타입 반드시 일치할 필요 X -> 암묵적 타입 강제 변환을 통해 연산 수행
키워드
수행할 동작을 규정한 것
ex) var 키워드는 새로운 변수를 생성할 것을 지시함
주석
작성된 코드의 의미 설명 - 코드 이해+가독성 향상
한줄 주석은 //
여러 줄 주석은 /*과 */ 사이에 작성
문
각각의 명령을 문(statement)
리터럴, 연산자(Operator), 표현식(Expression), 키워드(Keyword) 등으로 구성 + 세미콜론( ; )으로 끝나야 함
코드 블록(code block, {…})으로 그룹화 - 함께 실행되어져야 하는 문을 묶기 위함
위에서 아래의 순서로 실행
조건문(if, switch)이나 반복문(while, for)의 사용으로 제어(흐름제어(Control Flow)) 또는 함수 호출로 변경
자바스크립트에서는 블록 유효범위(Block-level scope)를 생성 X
함수 단위의 유효범위(Function-level scope)만 생성
표현식
표현식(Expression)은 하나의 값으로 평가(Evaluation)
* 값(리터럴), 변수, 객체의 프로퍼티, 배열의 요소, 함수 호출, 메소드 호출, 피연산자와 연산자의 조합
문 vs 표현식
문(Statement) : 마침표로 끝나는 하나의 완전한 문장(Sentence) - 변수/함수 생성 O, 제어문 생성 O, 프로그램 흐름 제어
= 표현식을 통해 평가한 값을 통해 실제로 컴퓨터에게 명령해 뭔가를 진짜 하는 친구!
표현식 : 문을 구성하는 요소 - 값 생성, 그 이상의 행위 X
// 선언문(Declaration statement)
var x = 5 * 10; // 표현식 x = 5 * 10를 포함하는 문이다.
// 할당문(Assignment statement)
x = 100; // 이 자체가 표현식이지만 완전한 문이기도 하다.
함수
어떤 작업을 수행하기 위해 필요한 문(statement)들의 집합을 정의한 코드 블록
이름과 매개변수 O, 필요한 때에 호출해 코드 블록에 담긴 문들 일괄 실행 O
여러 번 호출 O
코드의 재사용 측면에서 유용
객체
자바스크립트를 이루는 원시 타입(Primitives)을 제외한 모든 것 (함수, 배열, 정규표현식 등) = 객체
자바스크립트 객체는 키(이름)와 값으로 구성된 프로퍼티(property)의 집합
프로퍼티 값으로 함수를 사용 O -> 일반 함수와 구분하기 위해 메소드라 명명
=> 객체는 데이터를 의미하는 프로퍼티(property)와 데이터를 참조하고 조작할 수 있는 동작(behavior)을 의미하는 메소드(method)로 구성된 집합
데이터와 동작을 하나의 단위로 구조화할 수 있어 유용
객체지향의 상속을 구현하기 위해 “프로토타입”이라고 불리는 객체의 프로퍼티와 메소드를 상속 O
배열(Array)
1개의 변수에 여러 개의 값을 순차적으로 저장할 때 사용
데이터 타입과 변수
메모리에 값을 저장하기 위해서는 먼저 메모리 공간을 확보해야 할 메모리의 크기(byte) 알아야 함
값의 종류에 따라 확보해야 할 메모리의 크기가 다르기 때문
값의 종류=데이터의 종류=데이터 타입(Data Type)
1byte(8bit)로 표현할 수 있는 경우의 수, 즉 값의 총 개수는 256개(28)로 아스키코드(ASCII)를 표현
C나 Java같은 C-family 언어는 정적 타입(Static/Strong Type) 언어로 변수 선언 시 변수에 저장할 값의 종류를 사전에 타입 지정(Type annotation)
자바스크립트는 변수의 타입 지정(Type annotation)없이 값이 할당되는 과정에서 자동으로 변수의 타입이 결정(타입 추론, Type Inference) = 같은 변수에 여러 타입의 값을 자유롭게 할당 O
데이터 타입
데이터를 메모리에 저장할 때 확보해야 하는 메모리 공간의 크기와 할당할 수 있는 유효한 값에 대한 정보, 그리고 메모리에 저장되어 있는 2진수 데이터를 어떻게 해석할 지에 대한 정보를 컴퓨터와 개발자에게 제공
=> 메모리 공간의 효율적 사용, 데이터의 다양한 형태로의 사용
ECMAScript 표준(ECMAScript 2015 (6th Edition), 이하 ES6)은
- 원시 타입 (primitive data type)
- boolean
- null
- undefined
- number
- string
- symbol (ES6에서 추가)
- 객체 타입 (object/reference type)
- object
의 7개 데이터 타입 제공
원시 타입
변경 불가능한 값(immutable value)이며 pass-by-value(값에 의한 전달)
- Number
C / Java: 정수와 실수를 구분, int, long, float, double 등 다양한 숫자 타입 존재
자바스크립트: 하나의 숫자 타입만 존재
모든 수 실수(소수) 처리, 정수만을 표현하기 위한 특별한 데이터 타입(integer type) X
- Infinity : 양의 무한대
- -Infinity : 음의 무한대
- NaN : 산술 연산 불가(not-a-number)
와 같은 3가지 특별한 값 표현 가능
String
작은 따옴표(‘ ’) 또는 큰 따옴표(“ ”) 안에 텍스트를 넣어 생성
자바스크립트의 문자열은 원시 타입이며 변경 불가능(immutable / read only)
배열처럼 인덱스를 통해 접근 가능(: 유사 배열)
! 새로운 문자열을 재할당하는 것은 가능
Boolean
논리적 참, 거짓을 나타내는 true와 false
주로 흐름을 제어하는 조건문에서 사용
비어있는 문자열과 null, undefined, 숫자 0은 false
Undefined
선언 이후 값을 할당하지 않은 변수의 값
= 선언은 되었지만 값을 할당하지 않은 변수에 접근하거나 존재하지 않는 객체 프로퍼티에 접근할 경우 undefined 반환
자바스크립트 엔진에 의해 초기화된 값: 변수 선언 후, 값이 할당된 적 없는 변수임을 판별할 수 있음
null
* 자바스크립트는 대소문자를 구별(case-sensitive)하므로 null은 Null, NULL등과 다름
null은 의도적으로 변수에 값이 없다는 것을 명시할 때 사용
함수가 호출되었으나 유효한 값을 반환할 수 없는 경우, null 반환
자바스크립트 설계 상의 오류
타입을 나타내는 문자열을 반환하는 typeof 연산자로 null 값을 연산해 보면 null이 아닌 object 반환
= null 타입을 확인할 때 typeof 연산자를 사용 X, 일치 연산자(===) 사용
symbol
ES6에서 새롭게 추가된 7번째 타입으로 변경 불가능한 원시 타입 값
이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키(property key)를 만들기 위해 사용
객체 타입(Object Type, Reference Type)
프로퍼티(property)와 메소드(method)를 포함할 수 있는 독립적 주체
변수의 중복 선언
var 키워드로 선언한 변수는 중복 선언 가능 = 중복 선언해도 에러 발생 X
변수를 중복 선언하면 에러없이 이전 변수의 값을 덮어씀 = 사람은 똑똑하지만 완전무결할 수 없는 존재이니 가급적이면 같은 변수명은 사용하지 않는 것을 권장
동적 타이핑(Dynamic Typing)
변수의 타입 지정(Type annotation)없이 값이 할당되는 과정에서 값의 타입에 의해 자동으로 타입이 결정(Type Inference)되는 것
= 같은 변수에 여러 타입의 값 할당 가능
변수 호이스팅(Variable Hoisting)
변수를 선언하지 않고 console.log(변수명)으로 호출하는 경우, 콘솔에 undefined가 출력될 수 있는 이유
= 자바스크립트에서는 모든 선언문(var, let, const, function, class 등)이 선언되기 전에 참조 가능
변수 생성 단계
1. 선언 단계 : 변수 객체에 변수 등록
2. 초기화 단계 : 변수에 메모리 할당
undefined로 초기화됨
3. 할당 단계
실제값 할당
1단계와 2단계가 한 번에 이루어짐
따라서, 선언문 이전에 접근해도 존재는 하고 있기 때문에 에러가 발생하지 않고 undefined를 반환하는 것
함수 레벨 스코프(Function-level scope) | 함수 내에서 선언된 변수(지역 함수)는 함수 내에서만 유효 함수 외부(전역 변수)에서는 참조 X |
블록 레벨 스코프(Block-level scope) | 코드 블록 내에서 선언된 변수는 코드 블록 내에서만 유효 코드 블록 외부에서는 참조 X |
=> var 키워드로 선언된 변수의 문제점을 알아볼 수 있었다.
이를 보완하기 위해 ES6에서는 let 과 const 키워드를 도입
산술 연산자
이항 산술 연산자 : 2개의 피연산자 대상
+ : 덧셈
- : 뺄셈
* : 곱셈
/ : 나눗셈
% : 나머지
단항 산술 연산자 : 1개의 피연산자 대상
++ : 증가
-- : 감소
+ : 효과 X, 음수를 양수로 반전 X,
- : 양수 -> 음수 / 음수 -> 양수 반전해 값 반환
* + / - : 숫자 타입이 아닌 피연산자에 사용하면 숫자 타입으로 변환해 반환
* + : 문자열 연결 연산자
할당 연산자 : 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당
할당 연산 표현식을 다른 변수에 할당 가능 (연쇄 할당 : Chained assignment)
= x = y x = y += x += y x = x + y -= x -= y x = x - y *= x *= y x = x * y /= x /= y x = x / y %= x %= y x = x % y
동등 / 일치 비교 연산자
- 동등 비교: == (값 같음)
- 일치 비교: === (값&타입 같음)
- 부등 비교: != (값 다름)
- 불일치 비교: !== (값&타입 다름)
** NaN은 자신과 일치하지 않는 유일한 값, 숫자가 NaN인지 조사하려면 빌트인 함수 isNaN 사용
대소 관계 비교 연산자
x > y x가 y보다 크다 x < y x가 y보다 작다 x >= y x가 y보다 같거나 크다 x <= y x가 y보다 같거나 작다 크기를 비교하여 boolean 값 반환
삼항 조건 연산자
(조건식) ? (조건식이 ture일때 반환할 값) : (조건식이 false일때 반환할 값)
논리 연산자
논리 부정(!) 연산자: 언제나 불리언 값 반환
|| 논리합(OR) && 논리곱(AND) ! 부정(NOT)
논리합(||) 연산자와 논리곱(&&) 연산자: 일반적으로 불리언 값 반환, 반드시 불리언 값 반환해야 하는 것 X
#외에도 순서를 나타내는 쉼표 연산자(,), 그룹 내의 표현식에 우선순위가 있음을 알리는 그룹 연산자(( )), 피연산자의 데이터 타입을 문자열로 반환하는 typeof연산자 등이 있다.
제어문
주어진 조건에 따라 코드 블록을 실행(조건문)하거나 반복 실행(반복문)할 때 사용
위 -> 아래로 순차 실행되는 게 일반적이지만 제어문은 코드 실행 순서를 인위적으로 제어 가능
블록문
: 0개 이상의 문들을 { }로 묶은 것(: 코드 블록 / 블록)
조건문
: 주어진 조건식(boolean으로 평가될 수 있는 표현식)의 평가 결과에 따라 블록문 실행 결정
-> if...else문, switch문
1) if...else문
if (조건식1) { // 조건식1이 참이면 이 코드 블록이 실행된다. } else if (조건식2) { // 조건식2이 참이면 이 코드 블록이 실행된다. } else { // 조건식1과 조건식2가 모두 거짓이면 이 코드 블록이 실행된다. }
* 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 강제 변환되어 논리적 참, 거짓 구별
* else if문은 여러 번 사용 가능
* 삼항 조건 연산자로 바꿔쓸 수 있음
2) switch문switch (표현식) { case 표현식1: switch 문의 표현식과 표현식1이 일치하면 실행될 문; break; case 표현식2: switch 문의 표현식과 표현식2가 일치하면 실행될 문; break; default: switch 문의 표현식과 일치하는 표현식을 갖는 case 문이 없을 때 실행될 문; }
: 표현식을 평가해 그 값과 일치하는 표현식을 갖는 case 문으로 실행 순서 이동
* 일치하는 표현식을 갖는 case 문이 없다면 실행 순서 default 문으로 이동(default 옵션 사용/사용 X는 선택)
* 불리언 값 < 문자열, 숫자 값
* break 문: 코드 블록에서 탈출하는 역할
반복문
: 주어진 조건식의 평가 결과가 참은 경우 블럭 실행 -> 다시 검사해 여전히 참인 경우 블럭 재실행 (거짓일 때까지 반복)
-> for문, while문, do...while문
1) for문for (초기화식; 조건식; 증감식) { 조건식이 참인 경우 반복 실행될 문; }
* for문 내에 for문 중첩 가능
2) while문while (조건식) { 조건식의 평가 결과가 참일 경우 반환할 값; }
* 평가 결과가 참이면 코드 블록을 계속해서 반복 실행, 조건문의 평가 결과가 거짓이 되면 실행 종료
3) do...while문do { 조건식이 참일 경우 반환할 값; } while (조건식);
4) break문
: 레이블문(식별자가 붙은 문), 반복문(for, for…in, for…of, while, do…while) 또는 switch 문의 코드 블록 탈출
* 이외에 사용하면 SyntaxError(문법 에러)가 발생
5) continue문
: 반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 이동
타입 변환
명시적 타입 변환(Explicit coercion) / 타입 캐스팅 | 개발자에 의해 의도적으로 값의 타입을 변환 |
암묵적 타입 변환(Implicit coercion) / 타입 강제 변환 | 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환 에러없이 평가하기 위해 기존 값을 바탕으로 새로운 타입의 값을 만들어 단 한번 사용하고 버림 |
# 암묵적 타입 변환
1 + '2' // "12"
5 * '10' // 50
피연산자 중 하나 이상이 문자열 => 문자열 연결 연산자로 동작
+ 는 덧셈도 되지만 문자열 연결 연산자이기도 하기 때문에!
+ 단항 연산자는 피연산자가 숫자 타입의 값이 아니면 숫자 타입의 값으로 암묵적 타입 변환 수행
이 말은 산술 연산자에만 해당되는 거면 숫자 타입으로 나온다는 말도 되겠지요.
// 숫자 타입
0 + '' // "0"
-0 + '' // "0"
1 + '' // "1"
-1 + '' // "-1"
NaN + '' // "NaN"
Infinity + '' // "Infinity"
-Infinity + '' // "-Infinity"
// 불리언 타입
true + '' // "true"
false + '' // "false"
// null 타입
null + '' // "null"
// undefined 타입
undefined + '' // "undefined"
// 심볼 타입
(Symbol()) + '' // TypeError: Cannot convert a Symbol value to a string
// 객체 타입
({}) + '' // "[object Object]"
Math + '' // "[object Math]"
[] + '' // ""
[10, 20] + '' // "10,20"
(function(){}) + '' // "function(){}"
Array + '' // "function Array() { [native code] }"
* 빈 문자열(‘’), 빈 배열([]), null, false는 0, true는 1로 변환
* 객체와 빈 배열이 아닌 배열, undefined는 변환되지 않아 NaN
boolean 타입으로 변환
불리언 타입이 아닌 값을 Truthy 값(참으로 인식할 값) / Falsy 값(거짓으로 인식할 값)으로 구분
=> Truthy 값 = true로, Falsy 값 = false
false
undefined
null
0, -0
NaN
" "(빈 문자열)
위는 false로 평가되는 Falsy값
이외의 값은 true로 평가되는 Truthy값
# 명시적 타입 변환
문자열 타입 변환
- String 생성자 함수를 new 연산자 없이 호출하는 방법
- Object.prototype.toString 메소드를 사용하는 방법
- 문자열 연결 연산자를 이용하는 방법
숫자 타입 변환
- Number 생성자 함수를 new 연산자 없이 호출하는 방법
- parseInt, parseFloat 함수를 사용하는 방법(문자열만 변환 가능)
- 단항 연결 연산자를 이용하는 방법
- 산술 연산자를 이용하는 방법
불리언 타입 변환
- Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
- ! 부정 논리 연산자를 두번 사용하는 방법
단축 평가
논리곱 연산자(&&) : 모두 true일 때 true
논리합 연산자(||) : 단축 평가(Short-Circuit evaluation)
* 객체가 null인지 확인하고 프로퍼티 참조
단축 평가 표현식 평가 결과 true || anything true false || anything anything true && anything anything false && anything false
* 함수의 인수 초기화
=> 위의 경우에 사용해서 발생하는 에러를 방지할 수 있음
'JS' 카테고리의 다른 글
JAVASCRIPT의 배열은 배열이 아니다? (0) | 2024.08.15 |
---|---|
정규표현식(Regular Expression) (0) | 2024.08.13 |
JAVASCRIPT04 (0) | 2024.08.13 |
JAVASCRIPT03 (0) | 2024.08.09 |
JAVASCRIPT01 (0) | 2024.07.30 |