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

이인수·2020년 12월 9일
2

TIL

목록 보기
10/26

20.12.9 객체 지향 프로그래밍을 배우다!

객체 지향 프로그래밍이 도대체 뭐야?

많은 기업들의 채용공고란을 보면

우대사항 : 객체 지향 프로그래밍 가능자

라는 내용을 많이 보게 된다. 이것을 다시 생각해보면 '객체 지향 프로그래밍은 기업의 이윤성(효율성)을 높이는 프로그래밍이고, 기업들을 그것을 지향한다.'고 할 수 있다.

자, 그럼 이제 우리는 머릿속에 다음의 개념을 집어넣고 시작하게 된다.

객체 지향 프로그래밍은 00에 대한 효율성을 더 좋게 만드는 프로그래밍 기법이다.

절차 지향 프로그래밍(Procedural) vs 객체 지향 프로그래밍(OOP)

우리가 일반적으로 생각하는 프로그래밍이란 무엇일까?
여러가지 답이 있겠지만 공통적으로는 인간의 뜻을 컴퓨터에게 전달하는 것으로 볼 수 있다.

그렇다면 객체 지향 프로그래밍은 객체를 특징으로 컴퓨터에게 뜻을 전하는 프로그래밍 기법이라고 할 수 있는데,

특징이 다른 두 개의 절차 지향 프로그래밍(PP)과 객체 지향 프로그래밍(OOP)이 어떤 차이가 있는지를 알아보며 이해해보자.

절차 지향 프로그래밍(Procedural Programming)

컴퓨터는 코드를 위에서부터 아래로 내려가며 절차적인 처리를 한다. 이는 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.
핵심은 '프로그램안에 다양한 함수변수가 있고, 그것을 어떠한 절차로 연결시킬 것인가'

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

(내가 사용하는 JavaScript를 예로 들었을 때) 객체(Object)란 '이름(name)과 값(value)으로 구성된 프로퍼티(property)의 정렬되지 않은 집합'이고, 만약 프로퍼티의 값으로 함수가 들어오면 메소드(method)가 된다.
이를 토대로 객체를 지향한다고 했을 땐, 재사용성이 높고 관계성이 있는 기능(method)들을 한 객체에 모아서 필요에 따라 사용하는 프로그래밍이다.

(Trade-off)절차 지향 프로그래밍 vs 객체 지향 프로그래밍

객체 지향이 유명하다 해서 무조건 좋다고 할 수는없다.
완벽한 것은 없고 무엇인가 좋다면 무엇인가는 나쁠 수도 있기 때문에(Trade-off)

자, 이제 초반에 우리의 머릿속에 집어넣었던 개념을 다시 꺼내서 대입해보며 객체 지향 프로그래밍에 대해 파고들어보자.

객체 지향 프로그래밍은 00에 대한 효율성을 더 좋게 만드는 프로그래밍 기법이다.

절차 지향 프로그래밍은 기존 프로그래밍 방식으로 위에서 아래로 내려가며 처리하는 컴퓨터의 처리 방식(Top-down)과 유사하기 때문에 객체지향 프로그래밍 보다는 더 빨리 처리되어 실행에 있어 시간적 이점을 갖게 된다.

하지만 소프트웨어의 비약적인 발달로 인해 구현하는 코드가 방대해졌고 복잡한 코드로 인해 변수 이름을 짓기 조차 어려워져(네임스페이스 포화) 함수가 접근할 수 있는 데이터의 범위에 명시적인 제한을 걸어야 하는 상황이 된 것이다.

그래서 객체 지향 프로그래밍이 생겼고, 작은 기능별로 그룹화(객체)하여 큰 기능(문제)를 해결하는 방식으로(Bottom-up) 같은 기능을 중복으로 연산하지 않도록 재활용하기 때문에 개발 기간과 비용을 대폭 줄일 수 있게 되었다.

즉, 객체 지향 프로그래밍은 시간과 비용에 대한 효율성을 더 좋게 만드는 프로그래밍 기법이다.

절차 지향 프로그래밍(Procedural Programming)
장점:
컴퓨터의 처리구조와 유사해 실행속도가 빠르다.
위에서부터 아래로 구조가 되어있어 파악하기에 좋다.
단점:
프로젝트가 방대해지면 복잡해지는 코드로 인해 유지보수가 어렵다.
실행 순서가 정해져 있어 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.
디버깅이 어렵다.

객체 지향 프로그래밍(Object-Oriented Programming)
장점:
코드의 재활용성이 높다.
코딩이 절차지향보다 간편하다.
디버깅이 쉽다.
단점:
처리속도가 절차지향보다 느리다.
설계에 많은 시간소요가 들어간다.

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

위에서 객체 지향 프로그래밍에 대해 작은 기능별로 그룹화(객체)하여 큰 기능(문제)를 해결하는 방식으로(Bottom-up) 같은 기능을 중복으로 연산하지 않도록 재활용한다고 하였다.

쉽게 말해 작게 쪼개진 객체들을 조립하여 하나의 프로그램을 완성하는 것이라고 할 수 있는데
여기서 조립하는 공장을 Class. 공장에서 구현한 대상은 Object가 된다.

자동차를 예로 들어, Class라는 '자동차 설계도'에는 color, price, speed라는 속성(properties/Attribute)이 있고, 자동차가 가진 기능(행위)들을 함수(Methods/Behaviours)에 담아 만들어 내면


각 기능과 속성별로 다른 자동차들(Objects)이 구현되는 것이다.

  • 설계도(Class 단)
    클래스(Class): 공통된 속성과 연산(행위)를 갖는 객체의 집합. 각각의 개체들이 갖는 속성과 연산을 정의하고 있는 틀.
    함수(Method): 객체가 수행하는 기능. 객체가 갖는 데이터를 처리하는 알고리즘.
    인스턴스(Instance): 클래스에 속한 각각의 객체.(객체 => 인스턴스)
    인스턴스화(Instantiation): 클래스로부터 새로운 객체를 생성하는 것
  • 설계도로 구현하려는 대상(Object 단)
    객체(Object): 데이터와 데이터를 처리하는 함수를 묶어놓은(캡슐화) 하나의 소프트웨어 모듈.
    데이터(Data): 객체가 가지고 있는 정보, 속성.

객체 지향 프로그래밍(OOP) 특징 - OOP Basic Concepts

객체 지향 프로그래밍에는 네 가지 기본 컨셉이 있다.

1. Encapsulation(캡슐화)

캡슐화는 두 가지 측면에서 볼 수 있다.

1) 데이터 구조와 데이터를 다루는 방법을 결합해 묶는 것
2) 내용의 일부를 감추어 은닉하는 것

JavaScript에서는 은닉에 관한 부분을 모듈 패턴(Module Pattern)이라는 방법으로
구현을 한다고 하지만 아직 배운적이 없으므로 일단은 넘어가자(헤헷...)

Encapsulation(캡슐화)는 복잡도를 줄여주고 재사용성을 높여준다.

2. Abstraction(추상화)

(https://itewbm.tistory.com/24 의 내용을 참고하였다.)
나는 이 뚜렷하지 않은 뜻을 가진 추상화라는 부분을 이해할 때 너무나 힘들었다.(지금도 완전히는...)

먼저 검색으로 얻은 객체 지향 프로그래밍에서 추상화구현하는 객체들이 가진 공통적인 데이터와 기능을 도출해 내는 것이다.

왜 추상화를 해야하는 것일까?

객체 마다 여러가지 행위(메소드)가 담겨 있고, 저마다 존재해야 하는 이유가 다를 것이다.
그 중 특이하게 복잡한 행위를 담은 객체를 굳이 내보내서 다른 객체들을 혼란 시킬 필요는 없다는 것.

마치 우리가 핸드폰을 사용해야하는데 터치만 잘하면 됐지 안에 있는 프로그램 구동에 대해 알 필요가 없는 것처럼!

3.Inheritance(상속)

상속은 클래스의 속성과 행위를 하위 클래스에 물려주거나, 상위 클래스에서 물려받는 것이다.
공통된 속성과 행위가 있다면 이미 만든 곳에서 상속을 하여 시간을 절약하기 위함.

Inheritance(상속)은 재사용성을 높여준다.

4.Polymorphism(다형성)

다형성이란 사전적 의미로 '다양한 형태로 나타날 수 있는 능력'을 뜻한다.
즉, 여기서는 같은 것을 상속받았다 하더라도 다양한 형태로 나타낸다는 얘긴데.

예를 들어, 우리가 동물들에게 "소리내봐!" 라고 했는 때. 고양이는 "야옹", 강아지는 "멍멍", 오리는 "꽥꽥" 하는 것 처럼

이 다형성은 동일하게 상속받은 방법으로 동작시키지만 내부 사항은 다르게 할 수 있다.
이를 통해 우리는 좀 더 간결한 코드를 작성할 수 있다.

마치며...

혹시라도 잘못된 부분이 있다면 누구든지 꼭 말씀주세요! ㅎㅎ 감사합니다.

0개의 댓글