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

김민석·2024년 2월 19일
0

TIL

목록 보기
36/78

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

캡슐화 (Encapsulation)

객체 내부의 세부적인 사항을 감추는 것, 즉 중요한 정보를 외부로 노출시키지 않도록 만드는 것을 캡슐화(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(10);
console.log(user.getName()); // 김민돌
console.log(user.getAge()); // 10
console.log(user.name); // Error: User 클래스의 name 변수는 private로 설정. 바로 접근 불가능.

getter는 변수의 값을 가져오는 (getName, getAge)
setter는 변수의 값을 설정하는 (setName, setAge)

상속 (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); // 부모 클래스의 생성자를 호출
  }
}

const child = new Child("김민돌", "10", "Node.js");
console.log(child.name); // 김민돌
console.log(child.age); // 10
console.log(child.getTech()); // 부모 클래스의 getTech 메서드 호출: Node.js

Mother 부모 클래스를 상속받은 Child 자식 클래스에서 name, age 변수를 직접 접근하여 호출하고, Mother 부모 클래스에서 정의된 getTech() 메소드를 호출할 수 있게 되었다!

추상화 (Abstraction)

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 정의하는 것을 추상화(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("김민돌"); // Employee 클래스의 name을 변경하는 setter
console.log(employee.getName()); // Employee 클래스의 name을 조회하는 getter

Employee 클래스는 Human 인터페이스에서 정의한 name 프로퍼티와 setName, getName 메서드를 강제로 구현하게 되었습니다.

따라서, 동일한 인터페이스Human 인터페이스를 구현하는 모든 클래스는 해당 인터페이스에 선언된 프로퍼티메서드를 구현해야 함을 보장하게 되었습니다. 이로 인해 코드의 일관성을 유지할 수 있게된 것이죠.


상속과 추상화는 비슷해 보일 수 있지만 사용 목적에 따라 다르다?!
추상화는 붕어빵 틀~~

profile
화이팅 화이팅

0개의 댓글