
오늘은 노드 심화 강의 듣는 날
✏️ 객체 지향 (Object-Oriented)
- 객체는 정보와 그 정보를 처리하는 함수 또는 메서드를 가지고 있음
- 객체를 퍼즐 한 조각이라고 생각하기! 퍼즐 하나하나가 모여서 작품 하나를 만듦
- 객체 지향: 소프트웨어 개발에서 주요 구성 요소를 객체로 삼으며 어떤 객체가 어떤 일을 할 것인가에 초점을 맞춤. 따라서 객체가 책임과 권한을 가지고 서로 메세지를 주고받아 협력하여 기능을 수행함.
-> 크고 복잡한 시스템도 효과적으로 분해하고 구성하며, 개발자가 쉽게 이해하고 효율적으로 관리할 수 있음.
- 절차 지향과의 구분점
- 캡슐화, 다형성, 상속을 지원하는가
- 데이터 접근 제한이 가능한가
✏️ 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
- 프로그래밍 패러다임 (Programming Paradigm): 프로그래밍의 방식이나 관점을 바탕으로 효율적이고 명확한 코드를 작성하는 방법
- 구조적 프로그래밍 (Structured Programming)
- 함수형 프로그래밍 (Functional Programming)
- 객체 지향 프로그래밍 (OOP): 데이터(상태)와 그 데이터를 조작하는 프로세스(메서드)가 같은 모듈 내부에 배치되는 프로그래밍 방식.
- 코드를 추상화하여 개발자가 더욱 직관적으로 사고할 수 있게하는 대표적인 프로그래밍 방법론
- 객체는 고유한 특성을 가지고 있으며 특정 기능을 수행할 수 있음
- 객체 지향 프로그래밍의 방식은 데이터와 기능이 밀접하게 연결되어 있기 때문에 코드의 구조와 동작을 직관적으로 파악할 수 있음
- 하나의 객체에 정의된 기능이나 데이터 구조는 다른 객체에서도 쉽게 재사용할 수 있어 '코드의 재사용성과 확장성이 향상되고 개발 시간을 효율적으로 관리'할 수 있음
✏️ 객체 지향 프로그래밍의 핵심 원칙
✨ 캡슐화 (Encapsulation)
- 객체 내부의 세부적인 사항을 감춰 중요 정보를 외부로 노출시키지 않도록 만드는 것
- 자바스크립트는 완벽한 캡슐화를 지원하지 않음. 변수 앞에 '_'를 붙여 내부의 변수를 숨긴 것처럼 나타내는 규칙을 가짐
- ex. Typescript에서 private로 설정한 변수는 외부에서 접근할 수 없음.
-> console.log(private한 변수) -> Error 발생
-> 가져오려면 get함수 사용하기
✨ 상속 (Inheritance)
- 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려 받음
- 코드의 중복을 제거하고 코드 재사용성을 증대
- 상위 클래스의 데이터와 메서드를 변경함으로써 전체 코드에 대한 일관성을 유지
/** 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); // 부모 클래스의 생성자를 호출 -> 마치 부모 클래스를 사용하듯이 사용!
}
}
✨ 추상화 (Abstraction)
- 객체에서 공통된 부분을 모아 상위 개념으로 새롭게 정의
- 불필요한 세부 사항을 생략하고 중요한 특징만 강조하여 코드를 간결하고 관리하기 쉬워짐
- 인터페이스 (Interface): 클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세, 즉 추상 메서드의 집합. 코드의 일관성을 유지해줌.
/** Abstraction **/
interface Human {
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.setName("000"); // Employee 클래스의 name을 변경하는 setter
console.log(employee.getName()); // Employee 클래스의 name을 조회하는 getter
✨ 다형성 (Polymorphism)
- 하나의 객체(클래스)가 다양한 형태로 동작
- ex. 같은 클래스를 상속받아도 자식 클래스들의 반환값이 다른 것
✏️ 객체 지향 설계 5원칙 (SOLID)
🐧 단일 책임의 원칙 (Single Resoponsibility Principle, SRP)
- 하나의 객체는 단 하나의 책임을 가져야 한다.
🐧 개방-폐쇄 원칙 (Open-Closed Principle, OCP)
- 소프트웨어 엔티티 또는 개체(클래스, 모듈, 함수 등)은 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 소프트웨어 개체의 행위는 확장될 수 있지만 개체를 변경해서는 안된다.
🐧 리스코프 치환 원칙 (Liskov substitution principle, LSP)
- 어플리케이션에서 객체는 프로그램(다른 클래스 등)의 동작에 영향을 주지 않으면서 하위 타입의 객체로 바꿀 수 있어야한다.
🐧 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 사용자가 필요하지 않은 것들에 의존하지 않도록 인터페이스는 작고 구체적으로 유지해야한다.
🐧 의존성 역전 원칙 (Dependency Inversion Principle, DIP)
- 프로그래머는 구체적인 것에 의존하기보다는 추상적인 것에 의존해야한다.
- 고수준 계층의 모듈(도메인)은 저수준 계층의 모듈(하부 구조)에 의존해서는 안되고 둘다 추상화에 의존해야 한다.