OOP(Object Oriented Programing)

feelslikemmmm·2020년 10월 28일
0

TIL

목록 보기
29/36
post-thumbnail

객체 지향 프로그래밍이란

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체'라는 기본 단위로 나누고 이 객체 들의 상호 작용으로 서술하는 방식이다.

객체란 하나의 역할을 수행하는 메소드 와 변수(데이터)의 묶음으로 봐야 한다.

객체 지향 프로그래밍이라고 하는 말 속에도 포함되어 있는 것처럼 객체 지향 프로그래밍의 핵심 키워드는

객체(Object)

객체가 무엇인지 에 대해 이해하는 것이 어떻게 보면 객체 지향 프로그래밍의 출발점이라고 할 수 있다

객체 지향 프로그래밍에서 얘기하는 객체를 조금 추상적이고, 어렵게 얘기하면

프로그램을 구성하고 있는 로직을 서로 연관되어 있는 상태(state)행위(behave)로 그룹핑 해 논 것을

일종의 객체라고 할 수 있다

그리고 그 객체는 일종의 레고 블럭 처럼 객체와 객체를 조합해서 하나의 완제품이라고 할 수 있는

소프트웨어를 만들어가는 그런 프로그래밍 기법이 객체 지향 프로그래밍이라고 할 수 있는 것이다

한 웹사이트가 있다고 가정해보자

이 사이트는 우리가 일반적으로 알고 있는 소프트웨어와는 다르지만

이런 웹 서비스 들도 우리가 웹 어플리케이션이라고 부르고, 분명히 소프트웨어 이다

이 사이트 같은 경우는 하나의 프로그램인데, 하나의 프로그램에는 글 목록을 출력 해주는 로직이 있을 것이고

글 본문을 출력 해주는 로직 이 있고, 또 댓글을 추가하고 출력하고 수정하고 삭제하는 로직 이 있을 것이다

하나의 프로그램은 하나의 취지를 가지고 있는 로직 으로 이루어진 것이 아니라

보다시피 여러 개의 목적성을 가진 로직 들의 집합이라고 할 수 있다

처음에 서비스를 만들고, 처음에 어플리케이션 을 만들 때 는 코드가 많지 않다

그렇기 때문에 우리가 전부터 배웠던 절차 지향 프로그래밍에서 배웠던 조건문, 반복문 을 이용해서

프로그램을 짜서 이런 사이트를 충분히 구축할 수 있다

하지만, 사이트의 규모가 커지고 그 사이트를 구축하는데 동원되는 인원들이 많아지고

오랜 시간 동안 프로젝트가 진행되는 과정에서 어려움을 겪게 된다

그러면 어떤 생각을 하게 되냐 면 이 사이트에 들어가 있는 로직 들을 기능별로 그룹핑 하고 싶어하는

생각을 누구나 자연스럽게 하게 된다

그렇다면 어떤 방법을 사용할 수 있을까?

이 사이트를 구성하고 있는 글 목록, 본문, 댓글 과 같은 기능적으로 이 로직 들을 구분해서

글 목록과 관련된 로직 이라고 하면, 변수 이름 앞에는 list_0000

또 본문과 관련된 변수 라면 article_0000 또는 메소드라면 article_0000 이런 방식으로 한다던지

그리고 글 목록과 관련된 변수나 메소드, 또는 본문과 관련된 변수나 메소드를

각각의 기능별로 쪼개서 코드 상으로 서로 연관되어 있는 코드들과 모아둔다던지

이런 여러가지 조치를 취하게 된다

그런것들이 일종의 그루핑, 또는 분류화 영어로는 Categorizing 이라고 할 수 있다

이런 소프트웨어가 커지면서 발생하는 여러가지 문제들로 인해 사람들이 불편함을 겪다 보면

자연스럽게 그것들을 해소할 수 있는 방법을 찾게 된다

그 방법 중 하나가 객체 지향이라고 할 수 있다

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

  • 재사용성
    상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있다
  • 생산성 향상
    잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다
  • 자연적인 모델링
    우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
  • 유지보수의 우수성
    프로그램 수정시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기때문에 유지보수가 쉬워서 매우 경제적이라 할 수 있다.

OOP의 기본 구성 요소

  • 클래스(Class)
    같은 종류의 집단에 속하는 속성과 행위를 정의한 것. 다른 클래스와 독립적으로 디자인해야 한다.
  • 객체(Object)
    클래스의 인스턴스(Instance). 상위 클래스의 속성을 가지고 있으면서 개별적인 특성과 행위(메소드 : Method) 또한 가지고 있다.
  • 메서드(Method)
    클래스로부터 생성된 객체를 사용하는 방법. 객체의 속성을 조작하는 데 사용된다.

예시

  • ES5 클래스는 함수로 정의할 수 있다
  • ES6 에서는 class라는 키워드를 이용해서 정의할 수 있다
  • new 키워드를 통해 클래스의 인스턴스를 만들어낼 수 있다

속성과 메소드

클래스에 속성과 메소드를 정의하고, 인스턴스에서 사용한다

  • 속성
    • brand
    • name
    • color
    • currentFuel
    • maxSpeed
  • 메소드
    • refuel()
    • setSpeed()
    • drive()

위와 같이 객체 지향 프로그래밍은, 현실 세계를 기반으로 프로그래밍 모델을 만들때에 유용하다

클래스 : 속성의 정의

클래스 : 메소드의 정의

요약 :

OOP의 특성

캡슐화(Encapsulation)

캡슐화는 객체의 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업이다.

추상화(Abstraction)

추상화는 객체들이 가진 공통의 특성들을 파악하고 불필요한 특성들을 제거하는 과정을 말한다. 객체들이 가진 동작들을 기준으로 이용자들이 동작만 쉽게 구동할 수 있도록 한다.

이러한 추상화 과정을 통해 이용자들은 프로그래머가 만든 객체를 더 쉽게 사용할 수 있게 된다.

추상화를 할 때 주의할 점은 속성 위주가 아닌 동작 위주로 정의하는 작업을 하는 것이다. 객체의 동작에 연관이 되지 않는 속성들은 결국은 불필요하다. 따라서 불필요한 속성들을 걸러내기 위해 동작을 먼저 정의하고 동작에 필요한 속성들을 정리하는 것이 좋다.

재사용성

OOP의 가장 큰 특성 중 하나가 바로 코드의 재사용성과 상속의 개념이다. 같은 객체를 여러 개 만들어야 하는 경우, 한 번 작성된 코드를 활용하여 동일한 객체를 만들 수 있다.

위 그림을 예시로 들면

본문에 관련된 변수, 메소드 가 객체라고 하는 단위로 응집되어 있고

댓글에 관련된 변수, 메소드 가 객체라고 하는 단위로 응집되어 있다

서로 연관성이 없는, 다른 성격을 가지고 있는 로직들 과는 객체를 껍데기로 해서 분리되어 있는 것이다

객체를 분류해서 소프트웨어를 좀 더 명확하게 이해하고 좀 더 쉽게 관리할 수 있도록 기능별로

로직 들을 구획화 시키고 분류하고 카테고라이징을 하다 보면 자연스럽게 객체 라고 하는 문법 적인 기능이

나타나게 되는 것이고 이 기능은 이 사이트에서 만이 아니라 다른 사이트에서도 사용할 수 있다 라는 생각을

할 수 있고 그것이 가능해진다

이게 바로 프로그래밍에서 가장 중요한 개념이라고 할 수 있는 재활용성 에 객체가 기여하는 바라고 할 수 있다

이렇게 재활용성이 높아지면서 이미 사용하고 있는 로직을 다른 곳에 사용하게 되고

다른 곳에 사용 하려다 보면 또 여러가지 문제를 발생시킨다

그러한 문제를 완화시키기 위해서 여러가지 로직을 제한하고, 컨트롤하는 여러가지 기능들이 추가되게 된다

그게 바로 우리가 마주하고 있는 객체 지향의 여러가지 기능들이 그런 맥락에서 나타난 것이라고 할 수 있다

상속(inheritance) 개념은 다음 포스팅에서 이어가도록 하겠다.

profile
꾸준함을 잃지 말자는 모토를 가지고 개발하고 있습니다 :)

0개의 댓글