객체 지향 프로그래밍 (Object-oriented programming)

지은·2022년 9월 21일
1

JavaScript

목록 보기
27/42

절차적 언어 vs 객체 지향 언어


절차적 언어

: 순차적 명령의 조합, 변수와 함수가 순차적으로 작동하도록 하는 방법

  • 객체 지향 프로그래밍이라는 패러다임이 등장하기 이전에 쓰였으며, 초기 프로그래밍 언어는 일반적으로 절차적 언어이다. (C, Fortran...)

객체 지향 언어

: 프로그램을 다수의 독립적인 객체로 만든 후 조립하여 서로 상호작용하도록 하는 방법

  • class라고 부르는 데이터 모델의 청사진을 사용해 코드를 작성한다.
  • 데이터와 기능이 별개로 취급되지 않고, 한 번에 묶어서 처리한다.
  • 현대 프로그래밍 언어 대부분이 객체 지향의 특징을 가지고 있다. (Java, python, C++, C#...)

절차 지향 vs 객체 지향

절차 지향객체 지향
특성컴퓨터의 처리 구조와 유사사람의 사고방식과 유사
메모리 사용적음많음
처리 속도빠름느림
재활용성낮음높음
코드 이해어려움쉬움
디버깅어려움쉬움

각 방법론의 장단점을 잘 알고, 상황에 맞는 방법론을 선택하면 된다.

  • 메모리 관리가 중요 ➡️ 메모리를 적게 쓰는 절차 지향
  • 사람들과의 협업이 필요 ➡️ 코드 이해가 쉬운 객체 지향

JavaScript는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.


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

  • 객체 지향 프로그래밍은 프로그램 설계 철학 중 하나이다.
  • 객체 지향 프로그래밍의 모든 것은 "객체(Object)"로 그룹화된다.
    • 객체 내에는 "데이터와 기능이 함께 있다"는 원칙에 따라, 속성과 메소드가 존재한다.
    • ex. 모든 자동차는 공통적인 기능(refuel, drive)과 고유한 속성(maxSpeed)을 가지고 있다.
  • 객체 지향 프로그래밍의 4가지 주요 개념을 통해 재사용성을 얻을 수 있다.

클래스와 인스턴스

  • class : 일종의 원형(original form)으로, 세부사항(속성)이 들어가지 않은 청사진
    객체를 생성하기 위해 생성자 함수(constructor)를 포함한다.

  • instance : class의 사례로, class에 세부사항(속성)을 넣으면 객체가 된다. (= instance object)

  • constructor : 생성자 함수를 통해 함수에 인자를 넣듯 세부사항(속성)을 넣어줄 수 있다.

클래스와 인스턴스에 대해 작성한 글


객체 지향 프로그래밍의 4가지 개념

애플리케이션을 만들 때 좋은 설계를 하기 위해서는, 객체 지향을 이해하고 응용하는 것이 중요하다.
객체 지향에는 캡슐화, 추상화, 상속, 다형성이라는 4가지의 개념이 있다.

캡슐화 (Encapsulation)

  • 데이터와 기능을 하나의 객체 안에 넣어서 묶는 것
  • 데이터(속성)과 기능(메소드)들이 느슨하게 결합된다.
  • 구현은 숨기고, 동작은 노출시킨다. ➡️ 은닉화

느슨한 결합 (Loose coupling)

: 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것
ex. 마우스 구동을 위한 코드를 작성한다고 할 때

  • 속성 : 마우스의 색상, 크기, 무게...
  • 메소드 : 클릭, 이동, 스크롤...

➡️ 정해진 코드만 보고도 instance 객체의 기능을 상상할 수 있게 작성하는 것!

은닉화 (Hiding)

: 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것

  • 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메소드)만 노출시킨다.
  • 엄격한 class는 직접적인 접근을 막고 설정하는 함수(setter)와 불러오는 함수(getter)를 철저하기 나누기도 한다.

추상화 (Abstraction)

: 내부 구현은 복잡하지만, 실제로 노출되는 부분은 단순하게 만든다는 개념

  • 추상화를 통해 인터페이스를 단순하게 만들 수 있다.
  • 너무 많은 기능이 노출되지 않은 덕분에 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있다.
  • 클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라고 부른다.

캡슐화와 추상화의 차이

포커스사진
캡슐화코드나 데이터를 은닉시키는 것
추상화class를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것

상속 (Inheritance)


: 부모 class의 특징을 자식 class가 물려받는 것
기본 클래스(base class) - 파생 클래스(derived class)라고도 한다.


다형성 (Polymorphism)


: 객체에서 똑같은 메서드라도 다른 방식으로 구현할 수 있다.

poly(많은) + morph(형태) = polymorphism(다양한 형태)


정리

  • 캡슐화 : 코드를 복잡하지 않게 만들고, 재사용성을 높인다.
  • 추상화 : 코드를 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화시킨다.
  • 상속 : 불필요한 코드를 줄여 재사용성을 높인다.
  • 다형성 : 동일한 메소드에 대해 객체의 특성에 맞게 달리 작성할 수 있다.

❔ 학습 후 궁금한 점

  • 다형성과 overriding?

이 글은 아래 링크를 참고하여 작성한 글입니다.
https://learntocodetogether.com/what-the-heck-is-oop/

profile
개발 공부 기록 블로그

1개의 댓글

comment-user-thumbnail
2022년 9월 21일

밍뭉이도 다녀감

답글 달기