# class
① class (틀)
- template : 템플릿
- declare once : 한 번만 선언
- no data in : 정의만 한 것이기 때문에 데이터가 없음
② object (내용물)
- instance of a class : 클래스의 인스턴스
- created many times : 여러 번 선언 가능
- data in : 데이터가 실제로 있는 것
③ Object-oriented programming
- class: template // 템플릿에 속함
- object: instance of a class
- JavaScript classes
introduced in ES6 - class는 ES6에서 새롭게 추가된 개념
syntactical sugar over prototype-based inheritance
ㄴ기존에 존재하던 프로토타입 기반으로 문법만 클래스가 추가된 것
1. Class declarations : 클래스 선언
class Person{
// constructor
constructor(name, age){ // 생성자
// fields - 데이터 클래스(인스턴스 변수만 있는 클래스)
this.name = name;
this.age = age;
}
// methods
speak() {
console.log(`${this.name}: hello!`);
}
}
const ellie = new Person('ellie', 20); // 오브젝트 생성
console.log(ellie.name);
console.log(ellie.age);
ellie.speak(); // 결과 : ellie: hello!
2. Getter and setters
class User{
constructor(firstName, lastName, age){
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
get age() {
return this._age; // age 호출 시 해당 메소드 호출됨
}
set age(value){ // 값을 설정, value 필요, _를 사용해 무한반복 되지 않도록 변수명에 변화를 줌
// if(value < 0){
// throw Error('age can not be negative');
// }
this._age = value < 0 ? 0 : value; // 위와 동일 내용
}
}
const user1 = new User('Steve', 'Job', -1); // 실수로 -1이라고 입력한 경우
console.log(user1.age);
3. Fields (public, private) - Too soon! 최근에 추가된 내용으로 아직 많이 사용하고 있진 않음
class Experiment{ // 멤버변수만 있는 클래스
publicField = 2;
#privateField = 0;
// 지원하지 않는 브라우저 있는 경우 있어 신중히 사용할 것
}
const experiment = new Experiment();
console.log(experiment.publicField);
console.log(experiment.privateField); // undefined
4. Static properties and methods - Too soon! 개념을 알아만 두기!
공통적으로 사용하는 내용이라면 스테틱을 사용하여 메모리를 효율적으로 사용할 수 있다.
class Article{
static publisher = 'Dream Coding';
constructor(articleNumber){
this.articleNumber = articleNumber;
}
static printPublisher(){
console.log(Article.publisher);
}
}
const article1 = new Article(1);
const article2 = new Article(2);
console.log(article1.publisher);
// 결과 : undefined 출력 (스테틱변수이기 때문)
console.log(Article.publisher); // Dream Coding
Article.printPublisher();
스테틱은 오브젝트가 아닌 클래스 자체에 붙어 있기 때문에 클래스명으로 호출해야 한다.
자바스크립트에서는 참조변수로 접근 불가능하고, class명으로만 접근 가능하다.
5. Inheritance (상속) - a way for one class to extend another class.
class Shape{ // 공통적으로 쓰이는 속성값이 들어있는 클래스
constructor(width, height, color){
this.width = width;
this.height = height;
this.color = color;
}
draw(){
console.log(`drawing ${this.color} color!`);
}
getArea(){
return this.getAreawidth * this.height;
}
}
class Rectangle extends Shape{} // extends로 위의 Shape 클래스를 상속
class Triangle extends Shape{
draw(){
super.draw(); // 부모의 메소드를 호출
console.log('🔺'); // 문자열
}
getArea(){
return (this.width * this.height) / 2; // 필요한 함수들만 오버라이딩 하여 사용 가능 (다양성)
} // 자바와 마찬가지로 메소드 오버라이딩(하위 클래스가 재정의하는 것) 가능
toString(){
return `Triangle: color: ${this.color}`;
}
}
const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw();
console.log(rectangle.getArea()); // 결과 : 400
const triangle = new Triangle(20, 20, 'red');
triangle.draw();
console.log(triangle.getArea());
6. Class checking: instanceOf : 왼쪽의 오브젝트가 오른쪽의 클래스로 만들어진 것인지 확인하는 것
console.log(rectangle instanceof Rectangle); // 형변환이 가능하다면 true, 불가능하면 false
console.log(triangle instanceof Rectangle);
console.log(triangle instanceof Triangle); // 결과 : false
console.log(triangle instanceof Shape);
console.log(triangle instanceof Object); // command + Object click 정의된 곳으로 이동 , 가장 최상위 class
console.log(triangle.toString());
console.log(triangle); // 자바에서는 참조변수를 넘기면 toString()이 자동으로 실행되지만 객체 자체가 리턴된다.
#array
1. Declaration : 배열 선언
const arr1 = new Array(); // new 키워드 사용한 방법
const arr2 = [1, 2]; // [ ]를 사용한 방법
2. Index position
const fruits = ['사과', '바나나'];
console.log(fruits);
console.log(fruits.length);
console.log(fruits[0]); // 첫 인덱스에 접근할 때
console.log(fruits[1]);
console.log(fruits[fruits.length - 1]); // 마지막 인덱스에 접근할 때
3. Looping over an array
a. for
for(let i = 0;i < fruits.length; i++){
console.log(fruits[i]);
}
b. for of : 데이터를 순차적으로 할당하는 방법
for (let fruit of fruits) {
console.log(fruit);
}
c. forEach : 배열 안의 각 인덱스마다 전달한 콜백함수를 value 호출
fruits.forEach(function (fruit, index, array) { // array - 배열 그 자체
console.log(fruit, index, array) // 결과 : 사과, 0, ["사과","바나나"]
});
// 위와 동일 내용
fruits.forEach( (fruit) => console.log(fruit) ); // 결과 : 사과 바나나
4. Addition, deletion, copy
- push : add an item to the end - 배열의 가장 뒤에 넣는 것
fruits.push('딸기', '복숭아');
console.log(fruits); // 결과 : ["사과","바나나", "딸기", "복숭아"]
- pop: remove an item from the end - 배열의 가장 뒤에서 하나를 빼는 느낌으로 지우는 것
fruits.pop();
fruits.pop();
console.log(fruits);
- unshift: add an item to the beginning - 배열의 가장 앞에 하나를 추가하는 것
fruits.unshift('딸기', '레몬');
console.log(fruits);
- shift: remove an item from the beginning - 배열의 가장 앞에서부터 하나를 지우는 것
fruits.shift();
fruits.shift();
console.log(fruits);
// Tip : note!! shift, unshift are slower than pop, push
ㄴ pop, push의 경우 뒤에서 단순 삽입, 삭제만 하면 되지만
shift, unshift은 기존의 데이터들이 당겨져 오면서 움직여야 하기 때문에 속도가 느리다!
∴ 되도록이면 pop, push를 사용하는 것이 좋다!
- splice: remove an item by index position - 원하는 인덱스 포지션을 지우는 것
몇 개를 지울 것인지 갯수를 설정하지 않으면 시작 번호 이후의 모든 인덱스가 삭제된다.
fruits.push('딸기', '복숭아', '레몬');
console.log(fruits);
fruits.splice(1, 1); // splice(지우기 시작하는 인덱스 번호, 몇개를 지울 것인지의 갯수)
console.log(fruits);
fruits.splice(1, 1, '사과', '수박'); // 지우고 나서 원하는 데이터를 넣고 싶은 경우
console.log(fruits);
- combine two arrays : 두 가지 배열을 묶어서 사용하는 경우
const fruits2 = ['모과', '코코넛'];
const newFruits = fruits.concat(fruits2); // concat으로 새로운 배열을 추가하여 리턴하게 됨
console.log(newFruits);
5. Searching : find the index
- indexOf : 몇 번째에 위치하는지 알고 싶을 때 사용, 없으면 -1을 반환
console.log(fruits);
console.log(fruits.indexOf('사과'));
console.log(fruits.indexOf('수박'));
console.log(fruits.indexOf('코코넛'));
- includes : 해당 내용이 있으면 true, 없으면 false 반환
console.log(fruits.includes('수박'));
console.log(fruits.includes('코코넛'));
- lastIndexOf : 가장 마지막에 있는 동일 값을 출력하는 경우
fruits.push('사과');
console.log(fruits);
console.log(fruits.indexOf('사과')) // 먼저 오는 동일 값의 인덱스 출력
console.log(fruits.lastIndexOf('사과')); // 가장 마지막에 오는 동일 값의 인덱스 출력
Q.
// Q1. make a string out of an array
{
const fruits = ['apple', 'banana', 'orange'];
}
// Q2. make an array out of a string
{
const fruits = '사과, 키위, 바나나, 체리';
}
// Q3. make this array look like this: [5, 4, 3, 2, 1]
{
const array = [1, 2, 3, 4, 5];
}
// Q4. make new array without the first two elements
{
const array = [1, 2, 3, 4, 5];
}
class Student {
constructor(name, age, enrolled, score) {
this.name = name;
this.age = age;
this.enrolled = enrolled;
this.score = score;
}
}
const students = [
new Student('A', 29, true, 45),
new Student('B', 28, false, 80),
new Student('C', 30, true, 90),
new Student('D', 40, false, 66),
new Student('E', 18, true, 88),
];
// Q5. find a student with the score 90
{
}
// Q6. make an array of enrolled students
{
}
// Q7. make an array containing only the students' scores
// result should be: [45, 80, 90, 66, 88]
{
}
// Q8. check if there is a student with the score lower than 50
{
}
// Q9. compute students' average score
{
}
// Q10. make a string containing all the scores
// result should be: '45, 80, 90, 66, 88'
{
}
// Bonus! do Q10 sorted in ascending order
// result should be: '45, 66, 80, 88, 90'
{
}
Q1. make a string out of an array : 배열을 문자열로 바꿔라
A.
{
const fruits = ['apple', 'banana', 'orange'];
const result = fruits.join();
// const result = fruits.join(', '); // 세 가지 방법으로 나눌 수 있음
// const result = fruits.join('|');
// const result = fruits.join(', and ');
console.log(result);
}
Q2. make an array out of a string : 문자열을 배열로 바꿔라
A.
{
const fruits = '사과, 키위, 바나나, 체리';
const result = fruits.split(','); // 세 가지 방법
// const result = fruits.split(',', 2); // 값을 2로 주면 2개짜리 배열이 만들어짐
// const result = fruits.split(); // , 기준으로 만듬
console.log(result);
}
Q3. make this array look like this: [5, 4, 3, 2, 1]
A.
{
const array = [1, 2, 3, 4, 5];
const result = array.reverse(); // 역순으로 만드는 것
console.log(result);
console.log(array); // reverse 사용 시 array 자체도 역순으로 바뀐다
}
Q4. make new array without the first two elements : 처음 2개를 제외하고 새 배열을 만들어라
A.
{
const array = [1, 2, 3, 4, 5];
const result = array.slice(2, 5); // 4 위치까지 출력되어야 하므로 5라고 한 것, 원래 array는 변경되지 않는다.
// const result = array.splice(0,2); // 1,2만 제외하는 것, 원래 array는 바뀐다
console.log(result);
console.log(array);
}
Q5. find a student with the score 90 : 점수가 90점인 학생을 찾아라
A. for문을 이용한 방법
class Student {
constructor(name, age, enrolled, score) {
this.name = name;
this.age = age;
this.enrolled = enrolled;
this.score = score;
}
}
const students = [
new Student('A', 29, true, 45),
new Student('B', 28, false, 80),
new Student('C', 30, true, 90),
new Student('D', 40, false, 66),
new Student('E', 18, true, 88),
];
{
for(let i=0;i<students.length;i++){
if(students[i].score === 90) console.log(students[i]);
}
}
A. find 함수를 이용한 방법
class Student {
constructor(name, age, enrolled, score) {
this.name = name;
this.age = age;
this.enrolled = enrolled;
this.score = score;
}
}
const students = [
new Student('A', 29, true, 45),
new Student('B', 28, false, 80),
new Student('C', 30, true, 90),
new Student('D', 40, false, 66),
new Student('E', 18, true, 88),
];
{
// const result = students.find(function(student, index) // 콜백함수를 통해 students의 내용을 불러옴
// find 함수를 사용하여 점수 찾기 편함
{
// console.log(student, index);
// });
// const result = students.find(function(student){
// return student.score === 90; // 조건에 해당하는 리턴값을 주게 되면 조건을 만족하는 것의 값을 리턴한다.
// });
const result = students.find((student) => student.score === 90); // 에로우 펑션으로 구현한 것
console.log(result);
}
Q6. make an array of enrolled students : 등록된 학생만으로 배열을 만들어라
A. for문을 이용한 방법
{
let eStudents = [];
for(let i=0;i<students.length;i++){
if(students[i].enrolled === true) eStudents.push(students[i]); // eStudent에 해당 학생들만 넣는 것
}
console.log(eStudents);
}
A. filter함수를 이용한 방법
{
const result = students.filter( (student) => student.enrolled ); // filter : 원하는 형태의 것만 걸러주는 역할
console.log(result);
}
Q7. make an array containing only the students' scores : 학생들의 점수로만 배열을 만들어라.
// result should be: [45, 80, 90, 66, 88]
A. for문을 이용한 방법
{
let studentsScores = [];
for(let i=0;i<students.length;i++){
studentsScores.push(students[i].score); // studentsScores에 해당 점수들을 넣는 것
}
console.log(studentsScores);
}
A. map함수를 이용한 방법
{
const result = students.map( (student)=>student.score); // map : 원하는 형태로 가공할 때 사용
console.log(result);
}
Q8. check if there is a student with the score lower than 50 : 점수가 50점 미만인 학생이 있는지 체크하라.
A. for문을 이용한 방법
{
for(let i=0;i<students.length;i++){
if(students[i].score < 50) console.log("score가 50점 미만인 학생이 있음");
}
}
A. some, every 함수를 이용한 방법
{
const result = students.some( (student) => student.score < 50); // some : 조건에 맞는 것이 하나라도 있으면 true를 반환
console.log(result);
const result2 = students.every((student) => student.score < 50); // every : 전체 요소가 해당 조건에 해당하는 경우 true를 반환
console.log(result2);
const result3 = !students.every((student) => student.score >= 50); // some을 쓰면 편하지만 every를 사용하는 경우 예시임
console.log(result3);
console.log(!true);
}
Q9. compute students' average score : 학생들의 점수 평균을 구하시오.
A. for문을 이용한 방법
{
let sum = 0;
for(let i=0;i<students.length;i++){
sum += students[i].score;
}
console.log(sum/students.length);
}
A. reduce 함수를 이용한 방법
{
// const result = students.reduce( (prev, curr) => { // reduce : prev(이전 값)과 curr(현재 값)을 매개변수로 받을 수 있다
// console.log('------------------');
// console.log(prev);
// console.log(curr);
// });
// const result = students.reduce( (prev, curr) => { // 콜백함수를 에로우 펑션을 만들어 넣어준 것
// console.log('------------------');
// console.log(prev);
// console.log(curr);
// return curr; // 현재 값을 리턴하여 다음에서 이전 값으로 쓸 수 있게 한다.
// });
// const result = students.reduce( (prev, curr) => {
// console.log('------------------');
// console.log(prev);
// console.log(curr);
// return curr;
// }, 0); // 이전 값의 초기값이 0이 된 것
// const result = students.reduce( (prev, curr) => {
// console.log('------------------');
// console.log(prev);
// console.log(curr);
// return prev + curr.score; // 이전 값 0 + 현재 점수
// }, 0);
// console.log(result);
// const result = students.reduceRight( (prev, curr) => {
// reduceRight는 오른쪽 끝에서부터!
// console.log('------------------');
// console.log(prev);
// console.log(curr);
// return prev + curr.score;
// }, 0);
// console.log(result);
const result = students.reduce( (prev, curr) => prev + curr.score, 0);
console.log(result / students.length);
}
Q10. make a string containing all the scores : 모든 점수를 문자열로 만드시오.
// result should be: '45, 80, 90, 66, 88'
A. for문과 push함수를 이용한 방법
{
let studentsScores = [];
for(let i=0;i<students.length;i++){
studentsScores.push(students[i].score);
}
let result = studentsScores.join();
console.log(result);
}
A. map, filter, join 함수를 이용한 방법
{
// const result = students // 메소드 체이닝처럼 연결하여 사용한 것
// .map( (student) => student.score ) // 배열 리턴
// .filter( (score) => score >=50 ) // 배열 필터
// .join(); // 문자열 바꾸기
// console.log(result);
const result = students.map( (student) => student.score ).join();
console.log(result);
}
+ Bonus! do Q10 sorted in ascending order : 10번의 결과를 오름차순으로 정렬하시오.
// result should be: '45, 66, 80, 88, 90'
A.
{
let studentsScores = [];
for(let i=0;i<students.length;i++){
studentsScores.push(students[i].score);
}
studentsScores.sort(function(a, b){return a - b});
let result = studentsScores.join();
console.log(result);
}
A.
{
const result = students.map((student) => student.score) // score만의 배열 만듬
.sort( ( a, b) => a - b) // 배열 정렬
.join(); // 문자열로 만듬
console.log(result);
}
[참고자료] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference
'Web > javascript' 카테고리의 다른 글
[필기정리]Day52 - let, const, symbol 등 (0) | 2020.09.04 |
---|---|
[필기정리]Day51-2 - Hoisting, 자바스크립트 실습문제 등 (0) | 2020.09.04 |
[필기정리]Day51-1 - 자바스크립트의 역사, use strict 등 (0) | 2020.09.03 |
[필기정리] Day50-2 - 자바스크립트 예시 및 문제 (0) | 2020.09.03 |
[필기정리] Day50-1 - array sort, 유효성체크 (0) | 2020.08.31 |