[TIL]객체 지향

최하온·2024년 2월 17일
0

TIL

목록 보기
36/71
post-thumbnail

📃What I learned new


객체 지향 (Object-Oriented)

객체란?

: 현실 셰게의 물체나 개념을 소프트 웨어 세계로 옮긴 것.

객체 지향이란?

: 객체를 도출하고 각각의 역할을 명확하게 정의하는 것에 초점을 맞춤.

객체 지향 프로그래밍 (Object-Oriented-Programing, OOP)

: 객체의 집합으로 프로그램을 표현하는 프로그래밍 패러다임

  • 상태와 메서드가 같으 모듈 내부에 배치되는 프로그래밍 방식
const Car = {
  name: "Kia", // 상태(데이터)
  price: 2000000, // 상태(데이터)
  getName(name) {
    // 메서드
    return this.name;
  },
};
console.log(Car.getName()); // Kia

프로그래밍 패러다임

: 프로그래밍의 방식이나 관점을 바탕으로 효율적이고 명확한 코드를 작성하는 방법

  • 구조적 프로그래밍
  • 객체지향적 프로그래밍
    • 현실 세계를 모델링
  • 함수형 프로그래밍

사용 이유

  1. 코드의 구조와 동작을 직관적으로 파악 가능
  2. 특정 객체 문제 발생 시 그 객체만 유지보수 하면 됨.
  3. 재사용성 up => 효율 up

객체 지향 프로그래밍의 핵심 원칙

1. 캡슐화 (Encapsulation)

  • 객체 내부의 중요한 정보를 은닉하는 것.
// `typescript` 는 타입을 명시해주어야 함.
class User {
  private name: string;
  private age: number;
}
  • private으로 인스턴스 내부에서만 해당 변수에 접근이 가능하도록 제한.

2. 상속 (Inheritance)

  • 다른 클래스가 가진 특징을 다른 클래스가 상속 받는 것.
  • 상위 클래스 변경 시 하위 클래스도 변경이 되어 일관성 유지 용이.
class Person {
  // constructor = 클래스 생성자
  constructor(name, age, language) {
    this.name = name;
    this.age = age;
    this.language = language;
  }
  getLanguage() {
    return this.language;
  }
}
class User extends Person {
  constructor(name, age, language) {
    super(name, age, language); // 상위 클래스 생성자 호출
  }
}

const user1 = new User("on", "28", "korean");
console.log(user1.name); // on
console.log(user1.age); // 28
console.log(user1.getLanguage()); // korean
  • 부모 클래스인 Person의 getLanguage 메소드 이상없이 호출.

3. 추상화 (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;
  }
}

4. 다형성 (Polymorphism)

  • 하나의 객체가 다양한 형태로 동작 하는 것.
  • 역할(인터페이스)과 구현을 분리 => 오버라이딩을 통해 유연하게 확장.
  • 오버라이딩(overriding)
    • 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것
class Person {
  constructor(name) {
    this.name = name;
  }

  buy() {} //부모 클래스에서 정의 한 메소드
}

class Employee extends Person {
  // 부모 클래스(Person)에 상속받은 자식 클래스(Employee)의 buy를 다시 정의
  buy() {
    console.log(`${this.constructor.name} 클래스의 ${this.name}님이 물건을 구매하였습니다.`);
  }
}

class User extends Person {
  // 부모 클래스(Person)에 상속받은 자식 클래스(User)의 buy를 다시 정의
  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 클래스의 유미호님이 물건을 구매하였습니다.
  • buy()는 동일하지만 각기 다른 형태로 동작

0개의 댓글