심화주차 강의 (1강~3강) 내용을 정리한 것임.
3줄 요약:
좋은 설계란 요구사항 수행과 유연한 변경을 위한 가독성 높은 코드이며, 객체지향은 기능을 객체로 취급하여 캡슐화, 상속, 다형성에 초점을 둔 프로그래밍 패러다임 중 하나의 방식임.
이를 통해 코드의 가독성과 유지보수성을 높이며, 캡슐화는 중요 정보를 숨기고, 상속은 코드 재사용성을 높이며, 추상화는 코드 간결성을 유지하고, 다형성은 객체의 다양한 동작을 표현함.
/** Encapsulation **/
class User {
private name: string; // name 변수를 외부에서 접근을 할 수 없게 만듭니다.
private age: number; // age 변수를 외부에서 접근을 할 수 없게 만듭니다.
setName(name: string) { // Private 속성을 가진 name 변수의 값을 변경합니다.
this.name = name;
}
getName() { // Private 속성을 가진 name 변수의 값을 조회합니다.
return this.name;
}
setAge(age: number) { // Private 속성을 가진 age 변수의 값을 변경합니다.
this.age = age;
}
getAge() { // Private 속성을 가진 age 변수의 값을 조회합니다.
return this.age;
}
}
const user = new User(); // user 인스턴스 생성
user.setName('이용우');
user.setAge(30);
console.log(user.getName()); // 이용우
console.log(user.getAge()); // 30
console.log(user.name); // Error: User 클래스의 name 변수는 private로 설정되어 있어 바로 접근할 수 없습니다.
/** Inheritance **/
class Mother { // Mother 부모 클래스
constructor(name, age, tech) { // 부모 클래스 생성자
this.name = name;
this.age = age;
this.tech = tech;
}
getTech(){ return this.tech; } // 부모 클래스 getTech 메서드
}
class Child extends Mother{ // Mother 클래스를 상속받은 Child 자식 클래스
constructor(name, age, tech) { // 자식 클래스 생성자
super(name, age, tech); // 부모 클래스의 생성자를 호출
}
}
const child = new Child("이용우", "28", "Node.js");
console.log(child.name); // 이용우
console.log(child.age); // 28
console.log(child.getTech()); // 부모 클래스의 getTech 메서드 호출: Node.js
/** Abstraction **/
interface Human { --> Human이란 인터페이스는 name이란 변수와 set/get 두 가지 메서드를 가짐
name: string;
setName(name);
getName();
}
// 인터페이스에서 상속받은 프로퍼티와 메소드는 구현하지 않을 경우 에러가 발생합니다.
class Employee implements Human {
constructor(public name: string) { }
// Human 인터페이스에서 상속받은 메소드
setName(name) { this.name = name; }
// Human 인터페이스에서 상속받은 메소드
getName() { return this.name; }
}
const employee = new Employee(""); --> employee 인스턴스 생성
employee.setName("이용우"); // Employee 클래스의 name을 변경하는 setter
console.log(employee.getName()); // Employee 클래스의 name을 조회하는 getter
/** Polymorphism **/
class Person {
constructor(name) { this.name = name; }
buy() {}
}
class Employee extends Person {
buy() { console.log(`${this.constructor.name} 클래스의 ${this.name}님이 물건을 구매하였습니다.`); }
}
class User extends Person {
buy() { console.log(`${this.constructor.name} 클래스의 ${this.name}님이 물건을 구매하였습니다.`); }
}
const employee1 = new Employee("이용우");
const employee2 = new Employee("김창환");
const user1 = new User("이태강");
const user2 = new User("김민수");
const personsArray = [employee1, employee2, user1, user2];
// personsArray에 저장되어 있는 Employee, User 인스턴스들의 buy 메소드를 호출합니다.
personsArray.forEach((person) => person.buy());
// Employee 클래스의 이용우님이 물건을 구매하였습니다.
// Employee 클래스의 김창환님이 물건을 구매하였습니다.
// User 클래스의 이태강님이 물건을 구매하였습니다.
// User 클래스의 김민수님이 물건을 구매하였습니다.
[Node.js] 심화 이론 (5) (아키텍처 패턴: MVC / LAP / CA / MSA) (0) | 2024.02.19 |
---|---|
[Node.js] 심화 이론 (4) (SOLID: SRP / OCP / LSP / ISP / DIP) (0) | 2024.02.19 |
[javascript] 쓰로틀링 vs 디바운싱 / 페이지네이션 / 메타데이터 (0) | 2024.02.06 |
[Node.js] Windows 환경 Error: EPERM: operation not permitted 2 (0) | 2024.01.29 |
[Node.js] Windows 환경 Error: EPERM: operation not permitted (1) | 2024.01.29 |