ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체 지향 프로그래밍이란 무엇인가
    Programming 2019. 10. 17. 01:45

    프로그래밍 패러다임


    프로그래밍 패러다임이란 프로그래머가 코드를 짤 때 어떤 관점을 가지고 짜느냐에 결정적인 역할을 한다.

    가장 크게는 선언형과 명령형으로 나눌 수 있고, 이안에 우리가 중점적으로 알아볼 객체 지향과 절차 지향, 함수형 프로그래밍이 포함되어있다.

    대략적으로 카테고리를 나누어본다면 다음과 같다.

    • 명령형 프로그래밍
      - 절차적 프로그래밍(PP) : C
      - 객체 지향 프로그래밍(OOP) :C++,JAVA,python
    • 선언형 프로그래밍
      - 함수형 프로그래밍 : SQL, HTML,Python

     

    명령형 프로그래밍이란 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식이고, 선언형 프로그래밍은 어떤 방법으로 해야하는지 나타내기보다 무엇과 같은지를 설명하는 방식이다. 절차 지향 프로그래밍은 주로 C언어를 예로 들고 객체 지향 프로그래밍은 자바나 파이썬 등을 예로 드는데 사실 언어로 카테고리를 나누기에는 함수형 언어로 설계되지 않은 언어도 함수형 스타일로 프로그래밍을 할 수 있기 때문에 특정 언어의 개념에 대응하는 것이 아니라 말 그대로 관점과 개념의 차이라고 할 수 있다. 따라서 특정 언어가 객체지향 언어라고하는 설명은 틀린 것이니 주의할 것.

    명령형과 선언형의 차이


    명령형과 함수형의 차이를 설명한 표

    • 명령형: 알고리즘을 명시하고 목표는 명시하지 않는다.
    • 선언형: 알고리즘을 명시하지 않고 목표만 명시한다.

    각자 명령형과 선언형으로 로봇에게 횡단보도를 건너는 프로그래밍을 짠다고 가정해보자.

    • 명령형으로 로봇에게 지시
      횡단보도까지 약 3m 이동하라,
      초록불이 뜰 때까지 기다렸다가 초록불이면 약 20m 앞으로 이동,
    • 선언형으로 로봇에게 지시
      초록불이 되면 길을 건넘

     

    이토록 명령형은 로봇이 걸어가는 과정의 알고리즘을 명시하지만 이 프로그램의 목적이 무엇인지는 명시하고 있지 않다.

    하지만 선언형은 알고리즘은 없는 대신에 이 프로그램이 초록불이 되면 길을 건넌다라는 목표만을 명시하고 있다.

    이처럼 명령형은 어떻게 할 것인지 설명하고 있고(how), 선언형은 무엇을 할 것인지 정의한다.(what)

    사실 여기까지는 큰 분류에 대한 설명이기 때문에 다소 포괄적이거나 애매모호한 내용일 수 있다. 명령형 프로그래밍에는 절차 지향과 객체 지향이 포함되어 있고, 선언형 프로그래밍에는 함수형 프로그래밍이 포함되어있다는 것만 기억해두고 이제 각각의 특징에 대해서 알아보자.

    절차적 프로그래밍과 객체 지향 프로그래밍의 개요


    초기 프로그래밍 방식은 절차적 프로그래밍 방식이었다. 당시에는 입력을 받아 명시된 순서대로 처리한 다음에 그 결과를 내는 것 뿐이라는 생각이 지배적이었기 때문이다.

    프로그램이 갖는 기능에 대해서만 신경을 쓰고, 프로그램이 어떤 데이터를 취급하는 지에 대한 관심은 없었고 결국 현대에 들어서 다양화되고 다각화된 자료와 방식에 있어서 절차적 프로그래밍으로 이를 짠다는 것은 거의 불가능할 정도로 복잡해지는 한계를 낳게된다.

    한 가지 예를 들면 스타크래프트라는 게임을 만든다고 할 때 코드를 위에서 아래로 순차적으로 짠다고 가정한다면 유닛 뽑는 것은 어디에 구성하고 자원은 어디에 배치해야하고 맵 정보나 이런 다양한 정보들과 상호작용들을 어떤 순서로 배치해야하는지 감도 잡히지 않을 정도로 꼬여버리는 것이다.

    게다가 유닛은 한번 뽑고 마는 것이 아니라 같은 유닛을 여러마리 한 부대를 구성할 수도 있다. 그때마다 새로 코드를 덧붙혀서 사용할 수는 없었다.

    가독성과 중복 코드의 필요성으로 현대의 개발자들은 자연스럽게 객체 지향 프로그래밍으로 패러다임이 넘어가게 된다.

    절차적 프로그래밍(Procedural Programming)이란?


    절차지향 프로그래밍 또는 절차지향적 프로그래밍이라고도 불리는 프로그래밍 패러다임의 일종이다. 위에 설명하면서  절차적으로 실행하는 프로그래밍이, 위에서 아래로 순서대로 실행하게 만드는 프로그래밍이다.라고 이해하기가 쉬운데, 사실 모든 프로그래밍은 순서대로 실행된다.

    번역의 오류에서 온 오개념인데, Procedural은 절차를 뜻하는 것이 아니라 절차형 프로그래밍에서 프로시저 호출의 개념을 바탕으로 하고 있기 때문에 여기서 Procedural이란 프로시저의 Procedure을 의미한다.

    프로시저는 루틴이나 하위프로그램,메서드, 함수형 프로그래밍의 함수와도 같은 의미를 지니고 있는데, 리턴이 없는 함수 정도로 이해하면 좋다.

    이런 프로시저의 개념들을 현대에 다양한 방식에 대응되도록 객체에 담아 세련된 형태로 모듈화를 하는 것이 바로 객체 지향 프로그래밍인 것이다.

    객체 지향 프로그래밍(Object Oriented Programing)이란?


    OOP란 Object-Oriented Programming의 약어로써 객체지향 프로그래밍을 의미한다. 컴퓨터 프로그래밍의 패러다임 중에 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

    여기서 말하는 Object(객체)는 OOP에서 데이터(변수)와 그 데이터에 관련되는 동작(함수). 즉 절차, 방법, 기능을 모두 포함한 개념 기차역에서 승차권을 발매하는 경우, 실체인 '손님'과 동작인 '승차권 주문'은 하나의 객체이며, 실체인 '역무원'과 동작인 '승차권 발매'도 하나의 객체이다. 같은 성질, 같은 구조와 형태를 가지는 객체는 등급으로 정의하고 등급에 속하는 객체는 그 등급의 인스턴스라고 한다.

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


    • 장점
    1. 캡슐화로 코드의 재사용성이 높다.
    2. 코드의 변경이 용이하다.
    3. 직관적인 코드분석이 가능하다.
    4. 개발속도 향상된다.
    5. 상속을 통한 장점 극대화 된다.
    • 단점
    1. 처리속도가 상대적으로 느림
    2. 객체가 많으면 용량이 커질 수 있다.
    3. 설계시 상대적으로 많은 시간이 필요하다.

    객체지향 프로그래밍의 특징

    1)추상화

    → 객체들의 공통적인 속성과 기능을 뽑아내는 작업, 즉 우리가 구현하는 객체들이 가진 공통적인 데이터와 기능을 묶어 이름을 붙이는 것을 말한다.

    2)캡슐화

    → 관련된 데이터와 함수들을 클래스라는 하나의 ‘캡슐’속에 그룹화시켜주는 것으로 외부에는 실제 구현 내용을 감춘다.

    1. 기능과 특성별로 한 곳에 모으고 분류하기 때문에 언제든지 쉽게 불러올 수 있는 재사용성
    2. 외부에서는 ‘추상적인 것’으로 보이기에 정보 은닉화

    3)상속

    → 상위클래스의 데이터와 함수를 하위클래스가 물려받는 것을 말함. 하나의 클래스가 가지고 있는 데이터와 함수를 그대로 다른 클래스가 물려주고자 할 때 이를 이용함.

    → 상속 받은 것을 자식클래스에서 다시 재정의(오버라이딩)해서 사용하는 다형성과도 이어져있다.

    4)다형성

    → 하나의 클래스 내부에 같은 이름의 기능을 여러 개 정의하거나, 상위 클래스의 기능을 하위 클래스에서 다시 정의할 수 있음. 대표적인 예로 오버라이딩과 오버로딩이 있음.

    오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것

    오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것

    함수형 프로그래밍이란?

    앞서 우리는 선언형 프로그래밍과 상반된 명령형 프로그래밍에 대해서 알아보았다. 설명했듯 객체 지향과 절차형은 우리가 일상 생활에 대응하기 위한 방법론들과 패러다임이므로 가장 편하고 익숙하게 적용이 가능했다.

    하지만 함수형 프로그래밍은 기존과 전혀 다른 사고방식이라는 것을 우선적으로 인지하고 받아들여야 한다.

    함수형 프로그래밍은 다음과 같은 전제로 움직인다.

    1. 모든 데이터는 불변상태(Immutab)이어야 한다.
      -함수형 프로그래밍에서는 데이터가 변할 수 없는데, 이를 불변성 데이터라고 한다. 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터를 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
    2. 함수는 순수 함수로 만든다.
      -순수 함수란 동일한 입력에 항상 같은 값을 반환해야하며 프로그램의 실행에 영향을 미치지 않는 함수(다른 말로 side effect가 없어야 한다.)를 뜻한다.
    3. 루프보다는 재귀를 사용한다.
      -for나 while같은 루프보다는 함수안에 함수를 호출하는 재귀호출을 사용하는 방법을 사용한다.
    4. 코드를 간결하게 하고 가독성을 높여 로직에 집중시켜야한다.
      -람다식이나 Collection과 같은 API를 통해 가독성을 높힌다.

    핵심은 순수 함수를 조합해 간결하게 만들어 SideEffect를 없애는 것

    스스로 질문해보기

    Q. 객체 지향 프로그래밍이란 무엇이며 왜 등장하게 되었는가?

    Q. 함수형 프로그래밍에서 순수 함수란 무엇인가?

    Q. 명령형과 선언형의 차이는 무엇인가?

    댓글

Copyright 2023. 은유 All rights reserved.