그저 내가 되었고

항해99) 5주차:: 주특기 심화; 📚객체 지향 & 추상화 & 클래스와 인스턴스 본문

개발/항해99 9기

항해99) 5주차:: 주특기 심화; 📚객체 지향 & 추상화 & 클래스와 인스턴스

hyuunii 2022. 10. 19. 08:47

🎯절차 지향 vs 객체 지향

 절차 지향(Procedural Programming): 이야기를 순서대로 써 나가듯이 순차적인 처리에 중점. 프로그램 전체가 유기적으로 연결되도록 만드는 기법.

 객체 지향(Object Oriented Programming): 모든 데이터를 객체(object)로 취급하며, 이러한 객체를 중심으로 프로그래밍한다. 실생활을 모델링한 기법으로, 객체란 실생활에서 우리가 인식할 수 있는 사물을 생각해볼 수 있다. 이러한 객체의 상태와 행동을 구체화하는 형태의 프로그래밍이 OOP이다. 이때 객체를 만들어내는 설계도, 틀, 기계와 같은 개념을 클래스라고 한다.

 위에서 운전자가 이름과 면허 번호를 지정한 후 자동차를 운전하는 예를 살펴보자. 객체(자동차, 엔진, 운전자)를 생성하고, 각 객체에 포함된 데이터(컬러, 엔진, 이름, 면허번호, 종류)와 기능(구동하기, 전진하기, 정지하기, 운전하기, 장애물 감지하기)을 상호 호출함으로써 프로그램을 구성한다. 여기서 각 객체에 포함된 데이터는 ‘속성’또는 ‘필드’라고 하며, 기능은 ‘메서드’라고 한다.

 OOP의 장점은 클래스의 개념에서 극대화된다. 위의 예시에서 자동차 1대를 운전자 2명이 교대로 운전하는 프로그램의 구조를 상상해 보자. OOP는 운전자 클래스를 이용해 운전자 인스턴스를 하나 더 추가하고, 엔진 객체의 전진하기와 정지하기 기능을 호출하면 끝난다.


🎯추상화

  • 프로그램에서 필요한 요소만 사용해서 오브젝트를 표현하는 것.
  • 보통 불필요한 부분을 생략하고, 프로퍼티 중 공통적이고 중요한 것에만 중점을 두어 모델화 하는 것을 의미함.
  • 무슨말인지 감이 잘 안옵니다.. 예시를 봅시다. e.g.)
// controllers/posts.controller.js
const PostService = require('../services/posts.service');

// Post의 컨트롤러(Controller)역할을 하는 클래스
class PostsController {
  postService = new PostService(); //postService를 PostsController 클래스의 멤버 변수로 할당합니다.

  getPosts = async (req, res, next) => {
    // 서비스 계층에 구현된 findAllPost 로직을 실행합니다.
    const posts = await this.postService.findAllPost();
    res.status(200).json({ data: posts })
  }
  ...
}

module.exports = PostsController;

 Controller에서는 **하위 계층(Service)**이 어떠한 내부 구조를 가지고 있는지 신경쓰지 않고, 외부에 드러나 있는 **메소드(findAllPost)**를 호출만 함. 이것이 가능한 이유는 **추상화(Absctraction)**의 특성 덕분임. 그러니까… ‘postService에서 모든 포스트를 찾아 오는 기능’을 findAllPost라는 메소드 하나로 추상화한 것.

 PostController에서는 클라이언트의 **요청(Request)**을 Service Layer 전달함. 상위 계층인 postController에게 Service Layer에서 어떠한 내부 구조를 통해 비즈니스 로직을 수행하는 것인지는 중요하지 않음. 지 일만 잘 처리해서 넘겨주면 됨.

 


🎯클래스, 생성자, 프로퍼티, 메소드, 인스턴스

클래스의 예

클래스(class)

  • 차(CarMachine) : 설계도

속성(property)

  • modelName = "람보르기니"
  • modelYear = 2019
  • color = "red"

메소드(method)

  • accelerate()
  • brake()

인스턴스(instance)

  • 내 차(hyuunisDreamCar) : 설계도에 의해 생산된 내 차량
  • 친구 차(friendsDreamCar) : 설계도에 의해 생산된 또 다른 차량

 

자동차 인스턴스는 모두 위와 같은 프로퍼티와 메소드를 가진다. 하지만 각 인스턴스마다 가지고 있는 프로퍼티의 값은 전부 다를 것.

 

클래스? ‘오브젝트 뽑아내는 기계’라고 생각하면 편함.

생성자? ‘오브젝트 뽑는 구체적인 레시피.’ constructor( ) { 여기가 생성자 }임. 인스턴스가 생성될 때 가장 처음 호출되는 메소드. 뽑아진 객체의 프로퍼티를 초기화해주는 특별한 기능을 함.

프로퍼티? 오브젝트 내에서 선언된 변수

메소드? 오브젝트 내에 담긴 함수

인스턴스? 클래스로 뽑힌 오브젝트