객체 내부의 세부적인 사항을 감추는 것, 즉 중요한 정보를 외부로 노출시키지 않도록 만드는 것을 캡슐화(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)은 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려 받는 것을 말합니다.
이미 정의된 상위 클래스의 특징을 하위 클래스에서 물려받아 코드의 중복을 제거하고 코드 재사용성을 증대시킵니다.
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)라고 합니다. 즉, 불필요한 세부 사항을 생략하고, 중요한 특징만을 강조함으로써 코드를 더욱 간결하고 관리하기 쉽게 만드는 원칙입니다.
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
인터페이스를 구현하는 모든 클래스는 해당 인터페이스에 선언된 프로퍼티와 메서드를 구현해야 함을 보장하게 되었습니다. 이로 인해 코드의 일관성을 유지할 수 있게된 것이죠.
상속과 추상화는 비슷해 보일 수 있지만 사용 목적에 따라 다르다?!
추상화는 붕어빵 틀~~