노드심화 3-1

·2022년 12월 27일
0

study

목록 보기
30/81
post-thumbnail

객체 지향(Object-Oriented)?

💡 객체 지향은 소프트웨어의 핵심을 기능이 아닌 객체로 삼으며 “누가 어떠한 일을 할 것인가?”에 초점을 맞춥니다.

즉, 객체를 도출하고 각각의 역할을 정의하는 것에 초점을 맞춥니다.

절차지향적인 소프트웨어와 객체지향적인 소프트웨어를 구분하는 방법은 아래의 기준을 만족할 경우 객체지향, 만족하지 않으면 절차지향적인 성격을 가집니다.

  • 캡슐화, 다형성, 클래스 상속을 지원하는가?
  • 데이터 접근 제한을 걸 수 있는가?

캡슐화 (Encapsulation)

💡 개념적이나 물리적으로 객체 내부의 세부적인 사항감추는 것캡슐화라고 부릅니다.

즉, 캡슐화를 사용하는 가장 큰 이유는 정보은닉을 목적으로 합니다.

정보은닉은 객체에 대한 중요한 정보를 외부로 노출시키지 않도록 하기 위한 기법입니다.

캡슐화의 목적은 변경하기 쉬운 객체를 만드는 것입니다. 캡슐화를 통해 객체 내부의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있게 됩니다.

Javascript를 실행했을 때에는 클래스의 멤버 변수가 숨겨지지 않으니, 이번 예제는 Typescript로 확인

/** Encapsulation **/
class User {
  private name: string;
  private age: number;

  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(28);
console.log(user.getName()); // 이용우
console.log(user.getAge()); // 28
// console.log(user.name); // Error: User클래스의 name 변수는 private로 설정되어 있어 바로 접근할 수 없습니다.

추상화 (Abstraction)

💡 객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것을 추상화라고 합니다.

즉, 불필요한 부분을 생략하고 객체 속성 중 공통적이고 중요한 것에만 중점을 두어 모델화 하는 것입니다.

  • 추상화는 객체들의 공통적인 특성을 파악하여 필요 없는 특성제거하는 과정입니다.
  • 시스템을 구축하기 전에 시스템 구조 및 구성을 가시적으로 볼 수 있고, 해당 시스템과 유사한 모델을 만들어 여러가지 테스트를 할 수 있습니다.
  • 복잡한 내부 구현에 신경쓰지 않고, 외부에 노출되어 있는 인터페이스만을 이용하여 코드를 작성할 수 있습니다.

클래스를 설계할 때 공통적으로 묶일 수 있는 기능을 추상화추상 클래스인터페이스로 모델링해서 향후 다형성(Polymorphism)으로 확장할 수 있도록 설계합니다.

여기서 인터페이스(Interface)란 클래스 정의할 때 메소드속성정의하여 인터페이스에 선언된 프로퍼티 또는 메소드의 구현을 강제하여 코드의 일관성을 유지할 수 있도록 만듭니다.

/** 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

=>
클래스가 더 광범위하게 추상화
인터페이스는 메모리를 덜 잡아먹음 => 간단한건 인터페이스로
기능적으로는 똑같으나 필요에 따라 골라서 사용

인터페이스는 타입
인터페이스는 state 사용 불가능 선언만 가능함.
=> class는 타입도 되고 state도 가질 수 있음

클래스는 만들어도 하위에서 꼭 만들어놓은 메소드?함수?들을 모두 사용할 필요는 없지만 인터페이스는 모두 다 사용해야 오류가 안남!!

상속 (Inheritance)

💡 상속이란 이미 정의된 상위 클래스의 특징을 하위 클래스에서 물려받아 코드의 중복을 제거하고 코드 재사용성을 증대시킵니다.

즉, 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려 받는 것을 말합니다.

  • 개별 클래스를 상속 관계로 묶음으로써 클래스 간의 체계화된 구조를 파악하기 쉬워집니다.
  • 데이터와 메소드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지할 수 있습니다.

기존에 작성된 클래스를 물려 받아 재활용하여 사용하므로 객체지향 프로그래밍의 중요한 기능 중 하나입니다!

다형성 (Polymorphism)

💡 다형성이란 객체(클래스)연산을 수행하게 될 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성으로 다른 여러 형태로 재구성 되는 것을 말한다.

즉, 동일한 메소드의 이름을 사용하지만 메소드에 대해 클래스마다 다르게 구현되는 개념이 다형성입니다.

다형성을 통해 역할(인터페이스)과 구현을 분리해서 오버라이딩(Overriding)을 통해 서비스의 구현기능을 유연하게 변경, 확장이 가능합니다.

Java오버로딩(Overloading), 오버라이딩(Overriding)가 대표적인 다형성의 예시

  • 오버로딩(overloading)이란 서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것

  • 오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것

의존성 (Dependency)

💡 의존성이란 객체(모듈 및 클래스)들이 협력하는 과정 속에서 해당 객체들이 다른 객체를 의존하게 되는 정도를 나타냅니다.

  • 의존성이라는 말속에는 어떤 객체가 변경될 때 그 객체에 의존하는 다른 객체도 함께 변경될 수 있다는 사실이 내포되어 있습니다.
  • 만약 하나의 객체가 변경될 경우 의존하고 있는 다른 객체 또한 변경이 이루어지게 됩니다.

결합도 (Coupling)

💡 결합도는 의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 많은 의존성을 가지고 있는지를 나타냅니다.

  • 객체 사이의 의존성이 과한 경우를 가리켜 결합도가 높다고 말한다.

  • 객체들이 합리적인 수준으로 의존할 경우에는 결합도가 낮다고 말한다.

  • 두 객체 사이의 결합도가 높으면 높을수록 함께 변경될 확률도 높아지기 때문에 변경하기 어려워진다.

  • 따라서 설계의 목표는 객체 사이결합도를 낮춰 변경이 용이한 설계를 만드는 것이어야 한다.

응집도 (Cohesion)

💡 응집도는 모듈에 포함된 내부 요소들이 각각 연관되어 있는 관계의 정도를 나타냅니다.

  • 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에 위임하는 객체를 가리켜 응집도가 높다고 말한다.
  • 1개의 메소드가 내부에서 변수를 많이 사용할 수록 해당 메소드클래스응집도가 높아지게됩니다.
  • 자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.
  • 객체의 응집도를 높이기 위해서는 객체는 스스로 자신의 데이터를 책임져야 합니다.
profile
개발자 꿈나무

0개의 댓글