Dev-dotoli TIL

JS 24 OOP



Object-Oriented Programming


객체 지향 프로그래밍?

좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임

로직을 stat(상태)와 behave(행위)로 이루어진 객체로 만들고,

이 객체들을 레고처럼 조립해서 하나의 프로그램으로 만드는 것

객체는 variable과 method를 grouping한 단위들

  • object
    라틴어 ob(-in the way of) + ject(to throw)
    ~를 향해+던지다 의 의미를 어원으로 가지고
    ~향해 던지는 그 목표, 사물, 물건, 목적

    • subject
      라틴어 sub(-under) + ject(to throw)
      ~아래 던져두다 / 어떠한 것에 ‘종속된 것’
  • orient +ed
    해가뜨는 곳 이라는 라틴어 Oriens 에서 유래함 반대말 occident
    +ed 해가뜨는 곳 을 가리키는 = 목표하는 방향, 지향

  • program +ing
    pre(before) + gram(letter)
    미리 써둔 것

어떤 웹사이트에서 본문과 댓글을 각각 담당하는 로직이 있다면
서로 연관성이 있는 로직들을 객체라는 단단한 껍질안에 모아둠

         ----------                  ----------
         -  본문  -                  -  댓글  -
         ----------                  ----------
         -  변수  -                  -  변수  -
         - 메서드 -                  - 메서드 -
         ----------                  ----------

세팅해놓은 로직이 쓸만하다? 다른 곳에서도 쓰일 수 있게
다른 곳에서 사용하려고 하니까 문제가 생긴다?
그런 문제들을 해결하기 위한 로직세팅
= 재활용성을 높임



문법 / 설계

객체지향 프로그래밍 교육의 큰 두가지 갈래


문법

객체지향을 편하게 할 수 있도록 언어가 제공하는 기능을 익히는 것
그 기능은 if, for문 처럼 문법적인 구성을 가지고 있음
객체를 만드는 법에 대한 학습


설계

좋은 객체를 만드는 법 = 설계를 잘하는 법
좋은 설계는 현실을 잘 반영해야 하는데, 현실은 복잡
설계는 지식보다는 지혜의 영역이라고 생각 함

  • 내가 서있는 역에서 목표로 하는 역에 가려면 어떤 지도선택?

    위성지도, 일반지도, 전철노선도(실체거리), 일반전철노선도

    누구든 일반전철노선도를 참고할 것

    이는 복잡한 현실을 잘 축소해서 설계한 예시

    • abstract(추상화)
      전기회로도에 영감을 얻어서 만들어진 설계

지혜는 추후에 develope하고
먼저 미리 고안해놓은 지혜들을 지식으로써 익히자



부품화


객체의 개념에서 설명한 ‘재활용성’을 높인다는 것은
객체를 일종의 부품으로서 사용한다는 것

  • 초기 pc
    모니터, 본체, 하드디스크, 키보드 = 한개의 완제품
    하나라도 고장나면 통채로 바꾸거나, 수리하기가 까다로워 짐

    이런 문제를 해결하기 위해 pc를 추상화

    • 본체 : main board, power, hard-disk
    • 출력장치 : monitor
    • 입력장치 : keyboard, mouse
  • 현재 pc
    이제 사용자도 비교적 쉽고 저렵하게 고장을 해결할 수 있음

    부품화는 추상화하는 과정에 따라 다르기도 함

    • Apple pc / Microsoft pc

      정답은 없다
      처한 환경에서 그에 적합한 설계를 하는 것
      but 설계? 쉽지않음


객체지향은 부품화의 장점

우리가 알고있는 부품화의 예시:method

  • method를 부품으로 독립된 프로그램을 만들면
    코드의 양을 줄일 수 있고, method별로 기능이 분류되어 있어
    필요한 코드를 찾기 쉽고, 문제진단이 빨라짐
    method를 개선하면 동일한 method를 사용하는 모든코드가 개선됨

  • 다만
    프로그램이 크고 복잡해지면서 method의 양이 많아지면
    method와 variable을 관리하기가 점점 어려워짐
    이를 해결하기위한 방법의 하나가 객체지향 프로그래밍



Information hiding | Encapsulation


제대로된 부품?
그 구조를 몰라도
부품을 사용하는 방법만 알면 쓸 수 있어야 함

  • monitor의 원리와 구조를 몰라도
    pc와 monitor를 연결하는 방법만 안다면
    누구나 사용할 수 있어야 함

즉 내부동작 장법을 case안에 숨기고
사용자에게는 부품의 사용방법만을 노출하는 것



Interface


잘 만들어진 부품?
부품과 부품을 교환할 수 있어야 함

  • A사와 B사의 monitor가 모두 있다면
    사용자의 pc에 어떤 monitor를 연결하더라도 동작해야 함

  • monitor와 pc는 서로 교환관계에 있고
    이를 연결하는 cable의 규격이 표준화 되어있어 가능한 일

    • HDMI cable / LAN cable
      다른기능을 하는 cable간의 물리적 모양을 다르게 만들어
      잘못 꽂지 못하게 설계해 사고를 방지하는 기능도 있음

이런 연결점을 interface라고 하고
이질적인 것들의 결합을 막는 역할도 가지고 있음 = 부품들간의 약속



hardware의 개념에서 살펴본 OOP의 장점들을 기억하면서
software에서 적용되는 OOP를 공부하면 개념을 잡기 쉬울 것

  • software는 hardware가 할 수 없는 것들을 할 수 있음
    ‘복제 / 상속’과 같은 예시가 있다는 것도 숙지하고 공부 할 것