[221212] js 객체지향

뜨개발자·2022년 12월 12일
0

TIL

목록 보기
27/75

객체지향의 조건

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

만족하면 객체 지향적, 만족하지 않으면 절차 지향적이라고 한다.

캡슐화

개념적으로나 물리적으로나 객체 내부의 세부적인 사항을 감추는 것
정보 은닉, 변경하기 쉬운 객체 생성을 위해 캡슐화를 진행한다.

상속 (Inheritance)

상위 클래스의 특징을 하위 클래스에서 물려받아 코드의 중복을 제거하고 재사용성을 증대시킴
특징에는 함수, 변수, 데이터 등이 있음

상속 관계로 체계화된 구조 파악이 쉬워짐
데이터나 메소드를 변경할 때 상위만 변경하여 일관성 유지 가능

추상화 (Abstraction)

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것
불필요한 부분을 생략하고, 객체 속성 중 공통적이고 중요한 것에만 중점을 두어 모델화 하는 것

추상화 -> 추상 클래스 -> 인터페이스 로 모델링해서 향후 다형성으로 확장할 수 있도록 설계

다형성 (Polymophism)

객체가 가지고 있는 고유한 특성이 다른 여러 형태로 재구성되는 것
즉, 동일한 메소드의 이름이지만 클래스마다 다르게 구현되는 것
Java의 오버로딩과 오버라이딩이 대표적인 예시

의존성 (Dependency)

해당 객체들이 다른 객체를 의존하게 되는 정도
어떤 객체가 변경될 때 이 객체에 의존하는 다른 객체도 함께 변경될 수 있음

결합도 (Coupling)

의존성의 정도
다른 모듈에 대해 얼마나 많은 의존성을 가지고 있는지 나타냄

객체 사이의 의존성이 높으면 '결합도가 높다'고 함
객체들이 합리적인 수준으로 의존할 경우 '결합도가 낮다'고 함
결합도가 높을수록 함께 변경될 확률이 높아지므로 변경이 어려워짐

객체 사이의 결합도가 낮아 수정이 용이한 설계가 이상적임

응집도 (Cohesion)

모듈에 포함된 내부 요소들이 각각 연관되어 있는 관계의 정도
밀접한 연관이 있는 작업만 수행하는 객체를 '응집도가 높다'고 함

1개의 메소드가 내부에서 변수를 많이 사용할수록 해당 메소드와 클래스는 응집도가 높아짐
응집도를 높이기 위해서 객체는 스스로 자신의 데이터를 책임져야 함



객체지향 프로그래밍 (Object-Oriented Programming, OOP)

프로그래밍 패러다임

무엇을 해서는 안 되는지

  1. 구조적 프로그래밍 : 제어 흐름의 직접적 전환에 대한 규칙

    • 기능을 중심적으로 개발을 진행
    • 프로그래밍이라는 기술이 시작되면서 가장 처음으로 적용된 패러다임
  2. 객체 지향 프로그래밍

    • 프로그램의 처리 단위가 객체인 프로그래밍 방법
    • "현실 세계를 모델링"하는 대표적인 프로그래밍 패러다임
  3. 함수형 프로그래밍

    • 함수를 중심적으로 개발을 진행
    • 3가지 패러다임 중 가장 처음 만들어졌지만 최근에서야 겨우 도입되기 시작

객체 지향 프로그래밍 (OOP)

데이터와 프로세스가 동일한 모듈 내부에 위치하도록 프로그래밍하는 방식

코드를 추상화하여 직관적으로 사고할 수 있음
자동차, 동물, 사람 등 현실 세계의 객체를 유연하게 표현할 수 있음
객체는 어떠한 특성을 가지고 있으며 특정 기능을 수행할 수 있음

예를 들어, 자동차는 객체이고, 출발, 정지, 운행 등과 같은 기능을 수행할 수 있음

왜 객체지향 프로그래밍을 사용해야할까?

동일한 코드를 여러 곳에 분산시켰을 떄, 해당 로직을 수정하려면 모든 부분을 찾아 수정해야 함
이러한 변경점이 발생하더라도 최대한 적은 코드를 수정하여 더 많은 시간을 확보해야 함

발생한 문제를 빠르게 인지하고, 어떤 코드에서 어떤 오류가 발생했는지 빠르게 찾고, 오류를 빠르게 수정하는 것을 목표로 삼아야 하는데,
객체지향 프로그래밍은 데이터와 프로세스를 하나의 단위로 처리하는 특성을 가지고 있기 때문에, 어떤 코드에서 문제가 발생했는지 직관적으로 인지할 수 있고, 해당 로직을 수행하는 코드만 수정하면 문제가 해결될 수 있음

객체지향 프로그래밍의 장점

  • 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 요구사항 변경에 좀 더 수월하게 대응할 수 있는 가능성을 높임
  • 동작 중심보다 데이터 중심으로 프로그래밍을 진행했을 때 코드의 덩치가 커지더라도 일관성을 유지하기 좋음
  • 코드는 자신의 문제를 스스로 처리해야 한다는 예상을 만족시키기에, 우리가 이해하기 쉽고, 객체 내부 내용이 외부에 파급되지 않도록 제어할 수 있기 때문에 변경이 수월함

객체지향 설계

  • 좋은 설계란 요구하는 기능을 온전히 수행하면서 추후의 변경을 매끄럽게 수용할 수 있는 설계
  • 변경 가능한 코드란 이해하기 쉬운 코드
  • 변경하기 쉬운 설계는 한 번에 하나의 클래스만 변경할 수 있는 설계
  • 훌륭한 객체지향 설계의 핵심은 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮추는 것
profile
뜨개질하는 개발자

0개의 댓글