Class: 제로베이스
Created: November 28, 2022 4:01 PM
Type: Javascript
강의 명: 이론부터 실전까지 모든 것을 담은 자료구조/알고리즘
사용자가 프로그램과 상호작용하기 위한 방법으로, 입력과 출력을 아우르는 개념
운영체제에서의 대표적인 입출력은 “표준 입력 / 표준 출력 / 표준 오류 출력”
일반적으로 컴퓨터의 키보드의 응답을 받아 입력
프로그램의 데이터를 추가하기 위한 입력 장치
알고리즘에서는 문제의 testcase 입력을 위해 사용
일반적으로 컵퓨터의 모니터에 문자열로 출력
프로그램의 실행 상태 혹은 실행 결과를 보고 판단
알고리즘에서는 문제 정답확인 혹은 디버깅 용도로 많이 사용
자바스크립트는 문법의 대부분을 c, c++, JAVA로부터 차용해서 제작된 스크립트 기반 언어
다수의 표현식으로 하나의 명령문이 만들어지고, 명령문으로 프로그램 수행
하나의 명령문 끝은 개행 문자 혹은 세미콜론으로 표시
자바스크립트에서 문법을 만들 때 미리 정해진 용도로 동작하기 위해 정의해 놓은 단어
키워드 목록은 코드를 작성하며 알 수 있고, 변수로 작성이 불가하다.
스크립트에서 변수나 함수에 이름을 붙일 떄 사용하는 단어
대소문자를 구별하고 유니코드 문자셋을 이용
자바스크립트 내 식별자 규칙
변수는 선언 후 할당하건, 선언과 동시에 초기화하는 등, 중간에 코드에 의해 변경될 수 있는 소지가 충분함, 그 소지를 차단하기 위해 상수를 많이 사용한다.
목적에 따라 특별한 성질이나 정해진 범주를 가지고 있는 데이터의 종류
자바스크립트에서는 6가지의 원시 타입 자료형과 1가지의 객체타입 자료형으로 구성
원시타입
객체 타입
인수의 자료형을 반환하는 연산자
console.log(typeof 123); //number
console.log(typeof 456n); //bigint
console.log(typeof 123.123); //boolean
console.log(typeof true); //boolean
console.log(typeof "hello"); //string
console.log(typeof Symbol("id")); //symbol
console.log(typeof Math); //object
console.log(typeof null); //object
console.log(typeof console.log); //function
논리적인 값을 표현하는 자료형
참인 true, 거짓인 false 두가지만 저장
주로 조건문 등에서 동작 판단의 기준으로 사용
값이 비어있다는 의미로 표현되는 자료형
존재하지 않는, 비어있는, 알수 없는 값을 나타내는데 사용
값이 할당되어 있지 않은 상태를 나타낼 때 사용되는 자료형
정수, 부동소수점 숫자를 표현하는 자료형
number와 관련돤 연산은 사칙연산이 대표적
number에는 일반적인 숫자 외에 infonity, -infinity, NaN 같은 특수 숫자 값이 포함
number 에서는 2^53 -1보다 큰 값을 사용할 수 없으며, 더 큰 정수를 다루고 싶다면 bigint 자료형을 사용해야 한다.
소수점에 대한 처리가 100% 확실한 처리가 어렵다. Math를 통해 결과를 깔끔하게 만들 수 있음
문자, 문자열을 표현하는 자료형
큰따움표, 작은 따옴표, 역 따옴표(백틱)을 통해 표현할 수 있다.
역 따옴표(백틱)을 활용할 때는, 문자열 안에 변수를 같이 사용할 수 있다.
다수의 원시 자료형을 포함하거나, 복잡한 개체(entity)를 표현할 수 있는 자료형
Object() 클래스 혹은 중괄호 { } 리터럴방식을 통해 생성한다.
object의 개체는 key : value 형태로 표현하며, 접근은 object.key 형태로 표현한다.
객체는, 선언된 변수 내에는 메모리 주소만을 저장하고, 참조(referenc)를 통해 실제 데이터는 다른 곳에 저장되고, 그 곳에 대한 데이터에 접근할 수 있다.
let user = {
name : 'kody',
age: 25
};
console.log (typeof user); // object
console.log (typeof user.name); // string
console.log (typeof user.age); // number
console.log (user); // { name: 'kody', age: 25 }
console.log(user.name); // kody
console.log(user['age']); // 25
user.weight = 65; // <- 객체에 새로운 속성과 값 추가
console.log(user) // { name: 'kody', age: 25, weight: 65 }
delete user.age; // <- 객체에 있던 속성과 값 삭제
console.log(user); // { name: 'kody', weight: 65 }
객체에 개체 추가는 obj.key=value, 삭제는 delete 명령어를 통해 수행 가능하다.
let user = {
name : 'kody',
age: 25
};
let admin = user;
console.log(admin); // { name: 'kody', age: 25 }
admin.name = 'park'
console.log(admin.name); // park
console.log(user.name); // park
user.age = '30';
console.log(user.age); // 30
console.log(admin.age); // 30
let user 의 주소를 admin과 같은 주소로 변경했기 때문에, 두 변수가 가리키는 주소가 같다.
따라서 두 변수는 이름만 다를 뿐, 같은 주소를 가리키는 변수이다. 때문에 둘 중 하나의 속성값만 바뀌어도 다른 변수에 까지 영향을 미친다.
object 의 값을 복사할 때는 대상 전체가 아닌 object 내 주소 값만 복사되는 문제 발생
가리키는 대상 전체를 복사하는 방법은 “얕은복사와 깊은복사 “를 통해 가능하다.
객체를 다룰 때는 주소에대한 개념을 유념해야한다.
반복문 for 문을 통한 복사
let user = {
name : 'kody',
age: 25
};
let admin = {}; // admin 을 빈 객체로 정의하고
for(let key in user) {
admin[key] = user[key]; // 반복문을 통해 키 값을 복사
} // 이제 두 개가 다른 주소를 가진 객체 이므로
admin.name = "park"
console.log(admin.name); // admim의 키 값이 바뀌어도
console.log(user.name); // user에게 영향을 주지 않는다.
Object.assign( ) 을 통한 복사
let user = {
name : 'kody',
age: 25
};
let admin = Object.assign({}, user)
admin.name = "park"
console.log(admin.name); // park
console.log(user.name); // kody
전개연산자를 이용한 복사
let user = {
name : 'kody',
age: 25
};
let admin = {...user}
admin.name = "park"
console.log(admin.name); // park
console.log(user.name); // kody
하지만 객체 내의 또 다른 객체가 있다면 복사되지 않는다.
재귀함수를 이용한 깊은 객체 복사
let user = {
name : 'kody',
age: 25,
sizes: {
height: 180, weight: 72
},
};
function copyObj(obj) {
let result = {};
for(let key in obj) {
if(typeof obj[key] === "object") {
result[key] = copyObj(obj[key]);
} else {
result[key] = obj[key];
}
}
return result;
}
let admin = copyObj(user);
admin.sizes.weight ++;
console.log(admin.sizes.weight); // 73
console.log(user.sizes.weight); // 72
JSON 객체를 이용한 깊은 복사, stringhify는 객체를 문자열로 변환하는데 이 때 원본 객체와의 참조가 끊긴다.
let user = {
name : 'kody',
age: 25,
sizes: {
height: 180, weight: 72
},
};
// stringfy: js object -> string, parse: string -> js object
let admin = JSON.parse(JSON.stringify(user));
admin.sizes.weight ++;
console.log(admin.sizes.weight); // 73
console.log(user.sizes.weight); // 72