CodeStates/JavaScript

Section2 / Unit2 : 객체 지향 프로그래밍

yeeendy 2023. 5. 11. 13:24
객체 지향 프로그래밍(Object-Oriented Programming, OOP)
  • 프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임
  • 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임
  • 실세계의 실체(사물이나 개념)를 인식하는 철학적 사고를 프로그래밍에 접목하려는 시도에서 시작
  • 프로그램 설계 철학
  • OOP의 모든 것은 "객체"로 그룹화
  • OOP의 4가지 주요 개념을 통해 재사용성을 얻을 수 있음

 

캡슐화(Encapsulation)
  • 데이터와 기능을 하나의 단위로 묶는 것
    ✔︎ 데이터(속성)와 기능(메서드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것
  • 은닉(hiding) : 구현은 숨기고, 동작은 노출시킴
    ✔︎ 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것
    ✔︎ 은닉화 특징을 살려서 코드를 작성하면 객체 내 메서드의 구현만 수정하고,
        노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있다
  • 느슨한 결합(Loose Coupling)에 유리 : 언제든 구현을 수정할 수 있음
    ✔︎ 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라,
        코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미
추상화(Abstraction)
  • 객체에서 공통된 속성과 행위를 추출하는 것
  • 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
  • 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념
  • 추상화를 통해 인터페이스가 단순해짐
  • 너무 많은 기능들이 노출되지 않은 덕분에 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있음
  • 추상화와 캡슐화의 차이
    ✔︎ 캡슐화 - 코드나 데이터의 은닉에 포커스
    ✔︎ 추상화 - 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스
  • 본질
    ✔︎클래스 정의 시, 메서드와 속성만 정의한 것을 인터페이스라고 부른다
상속(Inheritance)
  • 부모 클래스의 특징을 자식 클래스가 물려받는 것
  • 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
  • 장점
    ✔︎ 재사용으로 인한 코드가 줄어든다
    ✔︎ 범용적인 사용이 가능
    ✔︎ 자료와 메서드의 자유로운 사용 및 추가가 가능
  • 단점
    ✔︎ 상위 클래스의 변경이 어려워진다
    ✔︎ 불필요한 클래스가 증가할 수 있다
    ✔︎ 상속이 잘못 사용될 수 있다
다형성(Polymorphism)
  • poly : 많은
  • morph : 형태
  • 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것
  • 어떠한 요소에 여러 개념을 넣어 놓는 것
  • 같은 이름을 가진 메서드라도 조금씩 다르게 작동된다
  • 객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나
    상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성이라는 특징을 갖게 된다

✔︎ 오버라이딩

  • 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것

✔︎ 오버로딩

  • 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것

 

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

✔︎ 장점

  • 클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합
  • 클래스 단위로 수정이 가능하기 때문에 유지 보수가 편리
  • 클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이

✔︎ 단점

  • 처리속도가 상대적으로 느리다
  • 객체의 수가 많아짐에 따라 용량이 커질 수 있다
  • 설계시 많은 시간과 노력이 필요하게 될 수 있다

참조 https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80