사소한 개발지식/잡?지식

객체지향 프로그래밍(OOP) with TypeScript

KimBY 2023. 2. 13. 18:32
728x90
반응형

Object-Oriented-Programming

1. 절차지향 vs 객체지향

🔎 절차지향 프로그래밍

프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법. 순차적인 처리가 중요시 되며 컴퓨터의 처리 방식과 유사하기 때문에 시간적으로 유리하다. 하지만 유지보수와 디버깅이 어렵다는 단점이 있다.

.

🔎 객체지향 프로그래밍

프로그램을 객체 단위로 나누고 이들의 상호작용으로 구현하는 방식. 실제 세계를 모델링 하여 데이터와 절차를 하나의 덩어리(객체)로 묶어서 관리.

.

2. 객체지향 프로그래밍 특성

🔎 캡슐화

비슷한 역할을 하는 속성(필드)와 행위(메소드)들을 하나로 묶고 접근 지정자(public, private, protected)를 통해 제어하는 방식. 외부에서 보여질 필요가 없는 데이터를 숨길 수 있고 원하는 기능만 제공 가능.

class Person {
  // private로 name과 age에 대한 직접 접근 방지
  private name: string
  private age: number

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }

  // public Method를 통해 은닉화된 데이터에 접근(getter, setter)
  public getName(): string {
    return this.name
  }

  public setName(name: string): void {
    this.name = name
  }

  public getAge(): number {
    return this.age
  }

  public setAge(age: number): void {
    this.age = age
  }
}

.

🔎 추상화

모델화 하는 것으로 데이터의 공통된 성질을 추출하여 슈퍼 클래스를 선정하는 개념. 공통된 속성이나 기능을 묶어 이름을 붙이는 것

interface PersonInterface {
  name: string
  age: number

  getName(): string
  setName(name: string): void
  getAge(): number
  setAge(age: number): void
}

.

🔎 상속

하위 클래스에 상위클래스의 기능을 물려주는 것으로 코드를 재활용하여 생산성을 높일 수 있고 유지보수에 용이하다.

class Animal {
  private name: string;

  public getName(): string {
    return this.name
  }

  public setName(name: string): void {
    this.name = name
  }

  public cry(): void {
    console.log('울음소리')
  }
}

class Cat extends Animal {
  cry(): void {
    console.log('야옹')
  }
}

// Animal 클래스를 상속받아 name, getName, setName, cry 를 사용가능
const cat = new Cat()

cat.setName('나비')
console.log(cat.getName()) // 나비
cat.cry() // 야옹

.

🔎 다형성

같은 모양의 함수가 상황에 따라 다르게 동작하는 것을 의미하며 대표적으로 오버로딩과 오버라이딩이 있다.

  • 오버로딩 : 같은 함수명에 파라미터 갯수나 타입을 달리하여 다르게 동작하도록 하는 것.
  • 오버라이딩 : 하위 클래스에서 상위 클래스의 메소드를 똑같은 이름으로 재정의 하여 사용하는 것
// 오버라이딩
class Animal {
  public cry(): void {
    console.log('울음소리')
  }
}

class Cat extends Animal {
  cry(): void {
    console.log('야옹')
  }
}

const animal = new Animal()
animal.cry() // 울음소리

const cat = new Cat()
cat.cry() // 야옹


// 오버로딩
class Animal {
  private name: string

  public setName(name: string): void
  public setName(name: number): void

  setName(name: string | number) : void {
    this.name = typeof name === 'string' ? name : 'Animal' + name.toString()
  }
}

.

참조
https://coding-lks.tistory.com/173
728x90
반응형