JavaScript & Node.js
#.7 Class
Haksae
2022. 1. 9. 15:35
1. JS class
- ES6에 도입됨
- 클래스가 도입되기 전에는 클래스를 정의하지 않고 함수를 이용해서 클래스를 만들고 오브젝트를 생성해서 사용했었음
- 기존에 존재하던 자바스크립트에 추가된 것이기에 기존에 존재하던 프로토 타입을 기반하여 그 위에 간편하게 쓸 수 있도록 문법만 클래스가 추가된 것임 (syntactical sugar)
- prototype based inheritance된 클래스이기 때문에, 프로토타입을 이해하는 것이 좋음
- JS에 클래스가 없다면? : 정의한 모든 변수들이 파편화되어 규모있는 프로젝트를 진행하기 어려웠을 것
- class : 조금 더 연관있는 것들을 묶어놓는 하나의 컨테이너
- 클래스는 속성(field), 행동(method)가 들어있음
- data class : 속성만 들어있는 클래스
- 다형성, 캡슐화, 추상화
- 객체지향 언어는 리얼 월드에 있는 사물과 물체를 객체로 정의해서 프로그래밍하는 것이 자연스럽기 때문에, 개발자들이 유연하게 프로그래밍 할 수 있는 장점을 가짐
- class : 붕어빵을 만드는 틀과 같음
- template
- declare once
- no data in
- 데이터는 들어있지 않고 틀만, 템플릿만 정의해놓는다.
- object : 붕어빵
- instance of a class
- created many times
- data in
- 클래스를 통해서 새로운 인스턴스를 만들면 객체
- 클래스는 정의만 한 것이여서 실제로 메모리에는 올라가지 않음, 객체는 메모리에 올라감
2. 클래스 선언
class Person {
//constructor 생성자를 이용해서 오브젝트를 만들 때 필요한 데이터를 전달
constructor(name, age) {
//fields 오브젝트에 존재하는 두 가지 필드에 전달된 데이터를 할당
this.name = name;
this .age = age;
}
//methods
speak() {
console.log(`${this.name}: hello!`);
}
}
3. Object 생성
- 새로운 object를 만들 때는 new라는 키워드를 사용
const haksae = new Person('haksae', 20);
console.log(haksae.name); // 출력
console.log(haksae.age);
haksae.speak(); // 함수 호출
4. getter & setter
- 소위 accessor property(접근자 프로퍼티)라고 함. 값이 없고 프로퍼티를 읽거나 쓸 때 호출하는 함수를 값 대신 지정할 수 있는 프로퍼티
- get : parameter가 없는 함수로, property를 읽을 때 동작함
- set : 인수가 하나인 함수로, property에 값을 쓸 때 호출됨
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
get age() { //get이라는 키워드를 통해서 값을 리턴
return this._age; // 변수가 변경될 때 콜백이 되지 않도록 변수 이름을 다르게함
}
set age (value) { // set이라는 키워드를 통해서 값을 설정. set은 값을 설정하기 떄문에 value를 받아와야함
// if (value < 0) {
// throw Error('age can not be negative'); IF를 통해서 제어해도되고
// }
this._age = value < 0 ? 0 : value; // 밸류가 - 라면 0, 아니면 그냥 사용
}
}
const user1 = new User('Steve', 'Job', -1);
// 사람의 나이가 -1이 된 것, 이러한 상황을 막아야함. 그래서 위와 같이 getter&setter를 사용
console.log(user1.age); // 0 출력
5. Public & Private
- 최근에 추가된 기능
- 생성자를 쓰지 않고 필드를 정의할 수 있음
class Experiment {
publicField = 2; // 외부에서 접근 가능
#privateField = 0; // 클래스 내부에서만 값이 보여지고, 변경 가능
const experiment = new Experiment();
console.log(experiment.publicField);
console.log(experiment.privateField);
6. Static
- 최신에 추가된 기능
- 일반적으로 클래스 안에 있는 필드와 메소드들은 그대로 객체에 복제됨
- 그러나 스태틱은 클래스에 계속해서 귀속됨
- Static은 오브젝트와 데이터에 상관없이 클래스와 연결되는 메소드를 선언할 때 사용
- 장점 : 메모리 사용을 줄여줄 수 있음
class Article {
static publisher = 'Dream'; // static 변수
constructor(articleNumber) {
this.articleNumber = articleNumber;
}
static printPublisher () { // static 메소드
console.log(Article.publisher);
}
}
const article1 = new Article(1);
console.log(article1.publisher); // undefined 출력
console.log(Article.publisher); // object가 아닌 클래스로 불러야함
Article.printPublisher(); // 동일하게 class로
7. 상속(Inheritance), 다형성 or 다양성(Polymorphism)
- 선언 : class 클래스이름 extends 상속할클래스이름
- 상속할 클래스의 field와 method가 상속되어, 그대로 사용 가능
- overriding(오버라이딩)
- 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 기술
- 필요한 함수만 오버라이딩해서 사용 가능
- super
- super.상위클래스메소드명();
- 오버라이딩을 통해서 상위 클래스의 메소드를 재정의했는데, 상위 클래스의 메소드도 사용하고 싶은 경우는 super로 불러온다.
8. instanceOf
- checking instanceOF
- (오브젝트명 instanceof 클래스명): 해당 오브젝트가 클래스의 인스턴스인지 확인
- ex) : console.log(sm5 instanceof Car);
출처 : 드림코딩엘리 https://www.youtube.com/channel/UC_4u-bXaba7yrRz_6x6kb_w