📌 Javascript 역사
2005년 ajax 등장
버튼을 눌러서 동작하려면 새로고침이 되야했는데
Ajax가 나오고 편리해짐.
=> 폭발적인 UX(사용자 경험) 향상
2008년 v8엔진 출시(google chrome)로 브라우저의 속도가 빨라짐
2009년 노드js 등장
서버 개발 활성화, js는 브라우저에서 동작하도록 만들어졌음.
브라우저를 깨고 나와서 어디에든 사용할 수 있도록 만든게 Node.js
📌 Node.js는
프론트엔드+백엔드+디비 = ✨풀스택 ✨ 을 가능하게 하는 언어
📌 Javascript 언어 특징
1. 객체 지향 프로그래밍 지원
2. 동적 타이핑
3. 함수형 프로그래밍 지원
4. 비동기 처리
5. 클라이언트 측 및 서버 측 모두에서 사용 가능
절차지향
- 첫번째 일을처리한 다음에 두번째 일을 처리하는 순서대로 프로그램 개발
객체지향
- 데이터와 함수를 객체라는 그룹으로 묶어서 처리합니다.
객체는 상태와 행동을 가지고 있으며, 상태는 객체의 속성(property)이라고도 합니다.
동적 타이핑 언어
- 자바스크립트는 동적 타이핑을 지원하는 언어로서, 변수를 선언할 때 타입을 지정하지 않습니다.
이것은 런타임 시점에 변수에 할당되는 값에 따라 자동으로 데이터 타입이 결정된다는 것을 의미합니다.
c언어나 자바같은 경우, string, char 등 데이터 타입 지정
=> 변수의 타입을 따로 지정하지 않고 코드가 다 짜이고 실행이 될때 (런타임) 데이터 타입이 결정된다.
함수형 프로그래밍 지원
- 자바스크립트는 함수형 프로그래밍을 지원하는 언어로서, 함수를 일급 객체로 취급하고, 고차 함수를 지원합니다.
이를 통해 코드의 재사용성과 가독성을 높일 수 있습니다.
비동기 처리
- 비동기 처리는 작업을 순차적으로 기다리지 않고, 병렬로 처리할 수 있도록 하는 방식
클라이언트 측 및 서버 측 모두에서 사용가능
- 자바스크립트는 클라이언트 측에서만 사용되는 것이 아니라, nodejs를 이용하여 서버측에서도 사용됩니다.
이를 통해 웹 개발 전반에 걸쳐 자바스크립트를 활용할 수 있다.
📌 기본 문법
변수와 상수
기억하고 싶은 값을 메모리에 저장하고 저장한 값을 읽어들여서 재사용한다.
📌 변수의 5가지 주요 개념
변수 이름 : 저장된 값의 고유 이름
변수 값 : 변수에 저장된 값
변수 할당 : 변수에 값을 저장하는 행위
변수 선언 : 변수를 사용하기 위해 컴퓨터에 알리는 행위
변수 참조 : 변수에 할당된 값을 읽어오는 것
📌 변수를 선언할 수 있는 3가지 방법 : var, let, const
1. var
var myVar = "Hello World"
var myVar = "var는 똑같은 키워드로 재할당이 가능하다."
myVar = "이것도 재할당 가능"
console.log(myVar);
2. let
let myLet = "Hello World1"
// let myLet = "let은 똑같은 키워드로 재할당 불가"\
myLet = "이 방식으로 재할당 가능"
console.log(myLet);
3. const
const myConst = "Hello World2"
// const myConst = "const는 똑같은 키워드로 재할당 불가"
// myConst = "이것 마저도 불가능"
console.log(myConst);
📌 데이터 타입
1. 숫자
1-1. 정수
let num1 = 10;
console.log(num1); // 출력 결과 : 10
console.log(typeof num1); // 타입 출력 결과 : number
1-2. 실수(float)
let num2 = 3.14;
console.log(num2); // 출력 결과 : 3.14
console.log(typeof num2); // 타입 출력 결과 : number
1-3. 지수형(Exp)
let num3 = 2.5e5;
console.log(num3); 출력 결과 : 250000
console.log(typeof num3); // 타입 출력 결과 : number
1-4. Nan : Not a number
let num4 = "Hello" / 2;
console.log(num4); // 출력 결과 : Nan
1-5. Infinity(무한대)
let num5 = 1 / 0;
console.log(num5); // 출력 결과 : Infinity
console.log(typeof num5); // 타입 출력 결과 : number
1-6. -Infinity(-무한대)
let num6 = -1 / 0;
console.log(num6); // 출력 결과 : -Infinity
console.log(typeof num6); // 타입 출력 결과 : number
2. 문자 : string(문자열 = 문자의 나열) // ' ' = " "
let str = "Hello World!";
console.log(str); // 출력결과 : Hello World!
console.log(typeof str); // 출력결과 : string
console.log(str.length); // 출력결과 : 12
2-1. 문자열 길이 확인하기
let str = "Hello World!";
console.log(str.length); // 출력결과 : 12
2-2. 문자열 결합하기(Concatenation)
let str1 = "Hello,";
let str2 = "World!";
let result = str1.concat(str2);
console.log(str); // 출력결과 : Hello, World!
2-3. 문자열 자르기
let str3 = "Hello, World!";
console.log(str3.substr(7,5)); // 출력 결과 : World
console.log(str3.slice(7,12)); // 출력 결과 : World
2-4. 문자열 검색
let str4 = "Hello, World";
console.log(str4.search("World")); // 출력 결과 : 7
2-5. 문자열 대체
let str5 = "Hello, World!";
let result01 = str5.replace("World", "Javascript")
console.log(result01); // 출력 결과 : Hello, Javascript
2-6. 문자열 분할
let str6 = "apple, banana, kiwi";
let result02 = str6.split(",");
console.log(result02); // 출력 결과 : ['apple', 'banana', 'kiwi']
3. 불리안(Boolean) - true(참), false(거짓)
let bool1 = true;
let bool2 = false;
console.log(bool1); // 출력결과 : true
console.log(typeof bool1); // 출력결과 : boolean
console.log(bool2); // 출력결과 : false
console.log(typeof bool2); // 출력결과 : boolean
4. undefined // un : not, define : 정의하다
let x;
console.log(x); // 출력 결과 : undefined
5. null : 값이 존재하지 않음을 '명시적'으로 나타내는 방법
6. object(객체) : key-value pair
let person = {
name: 'choi',
age: 20
}
7. array(배열) : 여러개의 데이터를 순서대로 저장하는 데이터 타입
let number = [1, 2, 3, 4, 5];
let fruits = ['apple', 'banana', 'orange'];
===============
📌 형 변환
형태 => 바꾼다.
명시적 형 변환, 암시적 형 변환
1. 암시적 형 변환
1-1. 문자열 변환
let result1 = 1 + "2";
console.log(result1); // 출력 결과 : 12
console.log(typeof result1); // 출력 결과 : string
let result2 = "1" + true;
console.log(result2); // 출력 결과 : 1true
console.log(typeof result2); // 출력 결과 : string
console.log("1" + {}); // "1[object Object]" (string)
console.log("1" + null); // "1null" (string)
console.log("1" + undefined); // "1undefined" (string)
1-2. 숫자 변환
console.log(1 - "2"); // -1 (number)
console.log("2" * "3"); // 6 (number)
console.log(4 + +"5"); // 9 (number)
1-3. 불리언 변환 : 어떤 값이 들어있으면 true
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean("false")); // true
console.log(Boolean({})); // true
2. 명시적 형 변환
2-1. 문자열 변환
console.log(String(123)); // "123"
console.log(String(true)); // "true"
console.log(String(false)); // "false"
console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
console.log(String({})); // "[object Object]"
2-2. 숫자 변환
console.log(Number("123")); // 123
console.log(Number("")); // 0
console.log(Number(" ")); // 0
console.log(Number(true)); // 1
console.log(Number(false)); // 0
======================
📌 연산자
1. 산술연산자
1-1. 더하기 연산자
console.log(2 + 3); // 5
console.log("2" + "3"); // "23"
console.log("2" + 3); // "23"
console.log(2 + "3"); // "23"
1-2. 빼기 연산자
console.log(5 - 2); // 3
console.log("5" - "2"); // 3
console.log("5" - 2); // 3
console.log(5 - "2"); // 3
console.log("five" - 2); // NaN
1-3. 곱하기 연산자
console.log(2 * 3); // 6
console.log("2" * "3"); // 6
console.log("2" * 3); // 6
console.log(2 * "3"); // 6
console.log("two" * 3); // NaN
1-4. 나누기 연산자 ( / )
console.log(6 / 3); // 2
console.log("6" / "3"); // 2
console.log("6" / 3); // 2
console.log(6 / "3"); // 2
console.log("six" / 3); // NaN
1-5. 나누기 연산자 ( % )
console.log(7 % 3); // 1
console.log("7" % "3"); // 1
console.log("7" % 3); // 1
console.log(7 % "3"); // 1
console.log("seven" % 3); // NaN
2. 할당 연산자 (assignment operators)
2-1. 등호 연산자
let x = 10;
console.log(x); // 10
x = 5;
console.log(x); // 5
2-2. 더하기 등호 연산자 ( += )
let x = 10;
console.log(x); // 10
x += 5;
console.log(x); // 15
2-3. 빼기 등호 연산자 (-=)
let x = 10;
console.log(x); // 10
x -= 5;
console.log(x); // 5
2-4. 나누기 등호 연산자 (/=)
let x = 10;
console.log(x); // 10
x /= 5;
console.log(x); // 2
2-5. 나머지 등호 연산자 (%=)
let x = 10;
console.log(x); // 10
x %= 3;
console.log(x); // 1
3. 비교 연산자
3-1. 일치 연산자 (===) + 타입까지 일치해야함
console.log(2 !== 2); // false
console.log("2" !== 2); // true
console.log(2 !== "2"); // true
3-2. 불일치 연산자 (!==)
console.log(2 !== 2); // false
console.log("2" !== 2); // true
console.log(2 !== "2"); // true
3-3. 작다 연산자 (<)
console.log(2 < 3); // true
console.log(2 < "3"); // true
console.log("2" < 3); // true
3-4. 크다 연산자 (<)
console.log(2 > 3); // false
console.log(2 > "3"); // false
console.log("2" > 3); // false
3-5. 작거나 같다(<=) 연산자
console.log(2 <= 3); // true
console.log(2 <= "3"); // true
console.log("2" <= 3); // true
console.log(2 <= 2); // true
3-6. 크거나 같다(>=) 연산자
console.log(2 >= 3); // false
console.log(2 >= "3"); // false
console.log("2" >= 3); // false
console.log(2 >= 2); // true
4. 논리 연산자
4-1. 논리곱(&&) 연산자
console.log(true && true); // true
console.log(true && false); // false
console.log(false && true); // false
console.log(false && false); // false
4-2. 논리합(\\) 연산자
console.log(true || true); // true
console.log(true || false); // true
console.log(false || true); // true
console.log(false || false); // false
4-3. 논리부정(!) 연산자
console.log(!true); // false
console.log(!false); // true
console.log(!(2 > 1)); // false
5. 삼항 연산자
5-1. 삼항 연산자 (?:)
let x = 10;
let result = (x > 5) ? "크다" : "작다";
console.log(result); // "크다"
6. 타입 연산자
6-1. typeof 연산자
console.log(typeof 123); // "number"
console.log(typeof "123"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
📌 1. 함수 (functioin)
input과 output을 가지고 있는 기능의 단위
Javascript에서는 함수를 정의하여 코드의 재사용성을 높일 수 있습니다.
📁 input : 함수의 input -> 매개변수(매개체가 되는 변수)
📤 output : return 문 뒤에 오는 값 : 반환 값
1-1. 함수 선언문
function add(x, y) {
return x + y;
}
console.log(add(2, 3)); // 5
두 개의 숫자를 입력받아서 덧셈을 한 후 내보내는 함수
1-2. 함수 표현식
let add = function(x, y) {
return x + y;
}
console.log(add(2, 3)); // 5
1-1 함수랑 기능은 같음
2. 함수 호출하기
2-1. 함수 호출하기
function add(x, y) {
return x + y;
}
console.log(add(2, 3)); // 5
3. 함수 매개변수와 반환값
3-1. 함수 매개변수
function add(x, y) {
return x + y;
}
console.log(add(2, 3)); // 5
3-2. 함수 반환값
function add(x, y) {
return x + y;
}
let result = add(2, 3);
console.log(result); // 5
4. 함수 스코프(scope)
: 변수의 영향 범위
4-1. 전역 스코프
let x = 10;
function printX() {
console.log(x);
}
printX(); // 10
4-2. 지역 스코프
function printX() {
let x = 10;
console.log(x);
}
printX(); //
4-3. 블록 스코프
: 블록이 생성될 때마다 새로운 스코프가 형성
if (true) {
let x = 10;
console.log(x);
}
console.log(x); // ReferenceError: x is not defined
5. 화살표 함수
✨ ES6 신문법 ✨
5-1. 기본적인 화살표 함수
let add = (x, y) => {
return x + y;
}
console.log(add(2, 3)); // 5
5-2. 한줄로 된 화살표 함수
let add = (x, y) => x + y;
console.log(add(2, 3)); // 5
5-3. 매개변수가 하나인 화살표 함수
let square = x => x * x;
console.log(square(3)); // 9
📌 조건문 (if, else if, else, switch)
1. if문
1-1. 기본적인 if문
let x = 10;
if (x > 0) {
console.log("x는 양수입니다.");
}
1-2. if-else문
let x = -10;
if (x > 0) {
console.log("x는 양수입니다.");
} else {
console.log("x는 음수입니다.");
}
1-3. if-else if-else문
let x = 0;
if (x > 0) {
console.log("x는 양수입니다.");
} else if (x < 0) {
console.log("x는 음수입니다.");
} else {
console.log("x는 0입니다.");
}
2. switch문
let x = 0;
if (x > 0) {
console.log("x는 양수입니다.");
} else if (x < 0) {
console.log("x는 음수입니다.");
} else {
console.log("x는 0입니다.");
}
3. 삼항 연산자
let age = 20;
let message = (age >= 18) ? "성인입니다." : "미성년자입니다.";
console.log(message); // "성인입니다."
4. 조건문의 중첩
let age = 20;
let gender = "여성";
if (age >= 18) {
if (gender === "남성") {
console.log("성인 남성입니다.");
} else {
console.log("성인 여성입니다.");
}
} else {
console.log("미성년자입니다.");
}
5. 조건부 실행
let x = 10;
(x > 0) && console.log("x는 양수입니다."); // 출력 결과 : x는 양수입니다.
x가 0보다 크면 "x는 양수입니다." 출력.
6. 삼항 연산자와 단축 평가
let x; // undefined
let y = x || 10; // x가 undefined이면 10을 할당해줘.
console.log(y); // 10
7. falsy한 값과 truthy한 값
(= 조건이 될 수 있는 값과 될 수 없는 값)
: ( ) 안에는 조건이 들어가야 한다.
if (0) {
console.log("이 코드는 실행되지 않습니다.");
}
if ("") {
console.log("이 코드는 실행되지 않습니다.");
}
if (null) {
console.log("이 코드는 실행되지 않습니다.");
}
if (undefined) {
console.log("이 코드는 실행되지 않습니다.");
}
if (NaN) {
console.log("이 코드는 실행되지 않습니다.");
}
if (false) {
console.log("이 코드는 실행되지 않습니다.");
}
2. 반복문
1. for문
1-1.기본적인 for문
for (let i = 0; i < 10; i++) {
console.log(i);
}
1-2. 배열과 함께 사용하는 for문
let numbers = [1, 2, 3, 4, 5];
for (let i = 0; i < numbers.length; i++) {
console.log(numbers[i]);
}
1-3. for...in문
let person = { name: "John", age: 30, gender: "male" };
for (let key in person) {
console.log(key + ": " + person[key]);
}
2. while문
let i = 0;
while (i < 10) {
console.log(i);
i++;
}
3. do...while 문
let i = 0;
do {
console.log(i);
i++;
} while (i < 10);
4. break문과 continue문
4-1. break문
for (let i = 0; i < 10; i++) {
if (i === 5) {
break;
}
console.log(i);
}
4-2. continue문
for (let i = 0; i < 10; i++) {
if (i === 5) {
continue;
}
console.log(i);
}
4. 배열, 객체 기초
* 객체와 객체 메소드
- Javascript에서는 객체(Object)를 사용하여 여러 개의 값을 하나의 변수에 담고 관리할 수 있습니다.
1. 객체 생성
1-1. 기본적인 객체 생성
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
1-2. 생성자 함수를 사용한 객체 생성 🎈
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
let person1 = new Person("홍길동", 30, "남자");
let person2 = new Person("홍길순", 25, "여자");
2. 객체 속성 접근
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
console.log(person.name); // "홍길동"
console.log(person.age); // 30
console.log(person.gender); // "남자"
3. 객체 메소드
3-1. Object.keys() 메소드 : key를 가져오는 메소드
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let keys = Object.keys(person);
console.log(keys); // ["name", "age", "gender"]
3-2. Object.values() 메소드 : value를 가져오는 메소드
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let values = Object.values(person);
console.log(values); // ["홍길동", 30, "남자"]
3-3. Object.entries() 메소드 : key와 value를 묶어서 배열로 만든 배열 (2차원 배열)
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let entries = Object.entries(person);
console.log(entries);
// [['name', '홍길동'],['age','30'],['gender','남자']]
3-4. Object.assign() 메소드 : 객체 복사
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let newPerson = {};
Object.assign(newPerson, person);
console.log("newPerson => ", newPerson);
// newPerson => { name: "홍길동", age: 30, gender: "남자" }
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let newPerson = {};
Object.assign(newPerson, person, { gender: "여자" });
console.log("newPerson => ", newPerson);
// newPerson => { name: "홍길동", age: 30, gender: "여자" }
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let newPerson = Object.assign({}, person, { age: 35 });
console.log(newPerson); // { name: "홍길동", age: 35, gender: "남자" }
3-5. 객체 비교 ✨
let person1 = {
name: "홍길동",
age: 30,
gender: "남자"
};
let person2 = {
name: "홍길동",
age: 30,
gender: "남자"
};
let str1 = "aaa";
let str2 = "aaa";
console.log("answer => ", person1 === person2) // true
console.log(person1 === person2); // false
console.log(JSON.stringify(person1) === JSON.stringify(person2)); // true
str1과 str2은 string이어서 true
person1과 person2는 객체여서 false
왜? 👉 객체는 크기가 상당히 크다. 메모리에 저장할 때 별도의 공간에 저장한다.
그래서 값을 갖고 있는게 아니라 person1과 person2 각각의 주소를 저장한다.
stringfy 👉 문자열화 시킨다.
3-6. 객체 병합
... : spread operator ( ✨ ES6 신문법✨)
let person1 = {
name: "홍길동",
age: 30
};
let perfectMan = {...person1};
// 위아래 코드가 같은 뜻.
let perfectMan = { name: "홍길동", age: 30 };
let person1 = {
name: "홍길동",
age: 30
};
let person2 = {
gender: "남자"
};
let mergedPerson = {...person1, ...person2};
console.log(mergedPerson); // { name: "홍길동", age: 30, gender: "남자" }
📌 배열과 배열 메소드
Javascript에서는 배열(Array)을 사용하여 여러 개의 값을 저장하고 관리할 수 있습니다.
1. 배열 생성
1-1. 기본적인 배열 생성
let fruits = ["사과", "바나나", "오렌지"];
1-2. 배열의 크기 지정
let numbers = new Array(5);
2. 배열 요소 접근
let fruits = ["사과", "바나나", "오렌지"];
console.log(fruits[0]); // "사과"
console.log(fruits[1]); // "바나나"
console.log(fruits[2]); // "오렌지"
3. 배열 메소드
3-1. push() 메소드
let fruits = ["사과", "바나나"];
fruits.push("오렌지");
console.log(fruits); // ["사과", "바나나", "오렌지"]
3-2. pop() 메소드
let fruits = ["사과", "바나나", "오렌지"];
fruits.pop();
console.log(fruits); // ["사과", "바나나"]
3-3. shift() 메소드
javascriptCopy code
let fruits = ["사과", "바나나", "오렌지"];
fruits.shift();
console.log(fruits); // ["바나나", "오렌지"]
3-4. unshift() 메소드
let fruits = ["바나나", "오렌지"];
fruits.unshift("사과");
console.log(fruits); // ["사과", "바나나", "오렌지"]
3-5. splice() 메소드
let fruits = ["사과", "바나나", "오렌지"];
// 0 1 2
fruits.splice(1, 1, "포도"); // 1부터 시작해서 1개를 지우고 "포도"를 끼워줘
console.log(fruits); // ["사과", "포도", "오렌지"]
3-6. slice() 메소드
let fruits = ["사과", "바나나", "오렌지"];
// 0 1 2
let slicedFruits = fruits.slice(1, 2); // 배열 1번부터 2번까지 새 배열로 만들어줘
console.log(slicedFruits); // ["바나나"]
3-7. forEach() 메소드
: 하나하나 작업할 때
let numbers = [1, 2, 3, 4, 5];
numbers.forEach(function(number) {
console.log(number);
});
// 출력결과
// 1
// 2
// 3
// 4
// 5
3-8. map() 메소드
: forEach와 다르게 return문이 있어야 한다.
기존에 있던 배열의 요소들을 가공해서 새로운 배열 생성.
원본 배열 길이 만큼이 리턴이 된다.
리턴을 안하더라도 해당 그 개수에 undefined가 채워져서 리턴.
let numbers = [1, 2, 3, 4, 5];
let squaredNumbers = numbers.map(function(number) {
return number * number;
});
console.log(squaredNumbers); // [1, 4, 9, 16, 25]
3-9. filter() 메소드
: 조건
let numbers = [1, 2, 3, 4, 5];
let evenNumbers = numbers.filter(function(number) {
return number % 2 === 0;
});
console.log(evenNumbers); // [2, 4]
3-10. reduce() 메소드
: 배열 원소들의 합 구하기
let numbers = [1, 2, 3, 4, 5];
let sum = numbers.reduce(function(accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
console.log(sum); // 15
3-11. find() 메소드
: 조건에 맞는 첫 번째 값만 반환
let numbers = [1, 2, 3, 4, 5];
let foundNumber = numbers.find(function(number) {
return number > 3;
});
console.log(foundNumber); // 4
3-12. some() 메소드
let numbers = [1, 2, 3, 4, 5];
let hasEvenNumber = numbers.some(function(number) {
return number % 2 === 0;
});
console.log(hasEvenNumber); // true
3-13. every() 메소드
let numbers = [2, 4, 6, 8, 10];
let isAllEvenNumbers = numbers.every(function(number) {
return number % 2 === 0;
});
console.log(isAllEvenNumbers); // true
3-14. sort() 메소드
let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
3-15. reverse() 메소드
let numbers = [1, 2, 3, 4, 5];
numbers.reverse();
console.log(numbers); // [5, 4, 3, 2, 1]