본문 바로가기

Node

객체 지향

객체 지향 이란?
1.객체
객체는 현실 세계의 물체나 개념을 소프트 웨어 세계로 옮긴 것을 말한다.
"자동차"나"사람"으로 생각하면 된다.
여기서 객체는 여러 속성과 행동(메서드)로 구성되어 있다.

2.객체 지향
소프트웨어 개발에서 주요 구성 요소를 기능(function)이 아닌 객체(object)로 삼으며 "어떤 객체가 어떤일을하는가" 에 초점을 맞춘다.
간단하게 객체를 도출하여 역할을 명확하게 정의하는 것에 초점을 맞추는 방법론이며
객체 지향은 책임과 권한을 가진 객체들이 서로 메세지를 주고받아 협력하여 필요한 기능을 수행 하는 방법론이다.
장점:크고 복잡한 시스템도 효과적으로 분해 하고 구성하여 개발자가 손쉽게 이해하고 효율적으로 관리하게 해준다.

3.객체 지향과 절차 지향 구분법
3-1.캡슐화와 다형성 상속을 지원한다면 객체 지향이다.
3-2.데이터 접근제한이 가능하다면 객체 지향이다.

①.캡슐화
데이터(속성)와 이를 처리하는 메서드(행동)를 하나의 객체로 묶고 외부에서 직접 접근하지 못하도록 정보를 은닉하는 기법이다. 이렇게 함으로써 객체 내부의 구현 세부 사항을 숨기고 외부에서는 해당 객체가 제공하는 인터페이스를 통해서만 상호작용 할 수 있다.

★특징
1.정보은닉 : 객체 내부의 데이터는 외부에서 직접 접근할 수 없으며 대신 getter/setter 메서드를 통해서만 데이터를 수정하거나 조회할 수 있다.
2.인터페이스 제공:클래스는 외부에서 사용할 수 있는 공개된 메서드(public method)를 제공하여 내부 구현을 숨기면서도 필요한 기능을 외부에서 사용할 수 있게 한다.
3.데이터 보호: 외부에서 객체의 데이터를 직접 조작하지 못하게하여 데이터 무결성을 유지하고 프로그램의 오류 가능성을 줄인다.

●캡슐화 예시
// Person 클래스는 두 개의 private 변수인 name과 age를 가지고있음
//private: 이 키워드는 변수들이 클래스 외부에서 직접 접근할 수 없도록 만든다. 클래스 내부에서만 접근 가능
class Person{//내부
private name : string
private age : number

//getter와 setter 메서드를 사용함으로써 외부에서 private 변수에 간접적으로 접근할 수 있다.

//setName과 setAge 는 각각 name과  age 변수의 값을 설정하는 메서드
 setName(name:string){
 this.name = name
  }

 setAge(age:number){
  this.age=age
  }
//getName과 getAge 는 각각 name과 age 변수의 값을 반환하는 메서드
 getName(){
 return this.name
  }
 
 getAge(){
 return this.age
  }

//내부
}
//외부


const person = new Person() // Person 클래스의 인스턴스 생성
//값 설정
person.setName("홍길동")
person.setAge(22)

//값 출력
console.log(person.getName()) // 홍길동
console.log(person.getAge()) // 22

//private 변수에 직접 접근을 시도할 경우
console.log(person.name) // error: person의 name은 private로 설정되어있어 호출시 에러 발생​

②.다형성 
같은 메서드나 연산자가 다양한 객체에서 다른 방식으로 동작할 수 있게 하는 특성을 말한다.
이는 객체가 가진 특성에 따라 같은 기능을 다르게 재구성되는 것을 의미한다.
동일한 메서드나 함수 명을 사용하더라도 클래스마다 그 메서드가 다르게 동작하는것을 의미한다.
즉 여러 가지 형태를 가질 수 있다는 의미에서 다형성 이라는 용어가 사용된다.
다형성은 코드의 유연성과 확장성을 높여주며 주로 상속과 인터페이스를 통해 구현된다.

다형성은 역할(인터페이스)과 구현을 분리하게 해준다.
따라서 오버라이딩 을 통해 특정 서비스의 기능을 유연하게 변경하거나 확장할 수 있게 한다.

1.다형성의 두 가지 주요 유형
ⓐ.컴파일 타임 다형성(정적 다형성)
ⓐ-1.컴파일 시점에 결정되는 다형성이다. 
ⓐ-2.대표적인 예로 메서드 오버로딩(Method Overloading)연산자 오버로딩(Operator Overliading)이 있다.
ⓐ-3.메서드 오버로딩은 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러가지로 정의할 수 있게 해준다.
오버로딩 :  새로운 매서드를 정의하는것
오버라이딩 : 상속받은 기존의 메서드를 재정의 하는것

●다형성 예시
/** Polymorphism **/
class Person {
  constructor(name) { this.name = name; }

  buy() {}
}

class Employee extends Person {
  buy() { console.log(`${this.constructor.name} 클래스의 ${this.name}님이 물건을 구매하였습니다.`); }
}

class User extends Person {
  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 클래스의 흑길동님이 물건을 구매하였습니다.​


③. 상속

'Node' 카테고리의 다른 글

webSocket 게임 서버 개발 강의 코드 이해하기  (1) 2024.09.27
HTTP의 특징,webSocket의 특징  (2) 2024.09.26
Mongoose Schema  (0) 2024.09.06
Express.js 의 req,res객체  (0) 2024.09.04
Routing / API Client /DB Client  (0) 2024.09.01