간간히 "객체지향", "절차지향", "함수형" 이라는 프로그래밍 언어에 대한 패러다임 종류가 들려왔었다.
언어에 특성에 따라서 크게 저 3가지로 분류되는 듯 했고, 물론 패러다임이라고 했을 때 저 3 종류가 끝은 아니지만 자주 들리는 만큼, 한번 정리해두는 것이 좋을 것 같다!
1. 객체 지향
📌 객체 지향 프로그래밍이란?
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
쉽게 말 하자면,
- 모든 데이터를 객체(Object)로 취급한다.
- 이때 객체는 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음이다.
- 객체가 처리 요청을 받았을 때, 객체 내부에 있는 기능을 사용해 처리하는 방법이다.
📌 기본 구성 요소
1. 클래스(Class)
- 같은 종류의 집단에 속하는 속성과 행위를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형이라고 할 수 있다.
- 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.
2. 객체(Object)
- 객체는 자신 고유의 속성을 가지며 클래스에서 정의한 행위를 수행할 수 있다.
- 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.
3. 메서드(Method), 메시지(Message)
- 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다.
- 메서드는 한 객체의 서브루틴 형태로 객체의 속성을 조작하는 데 사용된다.
객체 지향 언어에선 클래스를 이용해 실행해야하는 함수와 사용되는 변수등을 묶어서 하나의 객체를 만든다.
이렇게 만들어진 객체는 어떠한 일을 할 수 있는 역할을 부여받게 되고, 이것을 "책임"이라고 한다. 각 역할을 가진 객체들은 메세지와 메서드를 활용해 소통을 해서 맡은 역할보다 더 큰 업무를 수행할 수 있다.
객체 지향은 Bottom-up 형태로 프로그래밍 된다고 할 수 있다.
📌 객체 지향의 특징과 장단점
특징:
-
추상화 :
- 공통적인 속성이나 기능을 묶어서 이름을 붙이는 것
- 코드 상에서 구현(로직)부분을 제외한 오직 선언 부분만을 설계
- 상세한 정보는 무시하고 필요한 정보들만 간추려서 구성
-
캡슐화 :
- 관련된 필드(속성)와 메소드(기능)를 하나로 묶고, 실제 구현 내용을 외부로부터 감추는 기법(정보은닉)
- 만일의 상황(외부에서 조작)을 대비해서 특정 소성이나 메소드를 사용자가 조작할 수 없도록 숨겨 놓은 것
- 외부에서는 공개된 메소드(기능)의 인터페이스를 통해 접근할 수 있다.
-
상속성 :
- 상위 부모 객체의 속성과 특징을 하위 객체가 물려 받는 것.
- 만약 어떠한 객체가 이미 존재하는 객체의 특성을 가지고 있다면, 기존 객체의 특성을 상속시켜 만들 수 있다.
- 기존 코드를 그대로 재사용하거나 재정의하고 해당 코드를 재사용하면서 확장할 수 있다.
-
다형성 :
- 같은 함수가 있어도 매개변수에 따라 각자 다른 일을 하는 것
- 같은 기능(메소드)를 호출하더라도 객체에 따라 다르게 동작하는 것
장점:
- 프로그램을 유연하고 변경이 용이하게 만든다.
- 프로그램의 개발과 보수를 간편하게 만든다.
- 직관적인 코드 분석을 가능하게 한다.
단점:
- 객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모되서 개발속도가 느리다.
- 모든 것을 객체로 생각해서 메모리와 연산에 대한 비용이 많이 들어가 실행속도가 느리다.
객체 지향을 이해하기 위해 읽어볼만한 글:
HeeChan - Dev: 객체지향, 어떻게 설계해야 할까
2. 절차 지향
📌 절차 지향 프로그래밍이란?
프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임을 의미한다. 프로시저는 루틴, 하위프로그램, 서브루틴, 메서드, 함수라고도 하는데, 간단히 말하여 수행되어야 할 연속적인 계산 과정을 포함하고 있다. 프로그램의 아무 위치에서나 프로시저를 호출할 수 있는데, 다른 프로시저에서도 호출 가능하고 심지어는 자기 자신에서도 호출 가능하다.
여기서 의미하는 프로시저를 간단하게 말 하자면, 함수 호출이라고 할 수 있다. 기능이 중심이 되며, "어떤 기능을 어떤 순서로 처리할 것인가?"의 관점으로 바라보는 방식이다.
객체 지향이 객체 안에 데이터와 사용될 수 있는 함수를 넣어 여러 객체간의 소통을 통해 일을 처리한다면, 절차 지향에선 데이터와 변수가 global로 사용된다.
생성된 함수들은 변수와 데이터를 공유해서 사용한다. (global scope) 그리고 이 함수들은 서로의 데이터를 전달해가며 소통한다. 이런 방식으로 연산 과정을 거치기 때문에 Top-down 형태로 프로그래밍 된다.
한마디로 정리하면 절차 지향은 프로그래머가 컴퓨터에게 어떤 코드가 어떤 순서로 어떤 함수를 거쳐야할지 지정하는 방식이다.
📌 객체 지향과의 차이점
- 객체 지향이 프로그램을 객체로 나눈다면, 절차 지향은 프로시져, 혹은 함수로 프로그램을 나누게 된다.
- 절차 지향은 함수와 데이터를 별개로 두기 때문에 특정 기능을 수행하기 위해서 그 일을 수행할 수 있는 함수를 호출한다.
- 객체 지향에선 특정 기능을 수행하는 메소드를 가진 객체를 만들어서, 그 인스턴스를 이용해 메소드를 호출한다.
📌 절차 지향의 특징과 장단점
특징:
- 객체 안에 데이터가 저장되는 방식이 아니기 때문에 생성된 모든 함수가 데이터를 다르게 취급한다.
장점:
- 함수를 통해 코드의 재활용성이 높아지게 된다.
- 함수의 호출을 통해 여러 부분을 생략하여 코드의 가독성이 높아진다.
- 상대적으로 빠르다.
단점:
- 유지보수가 어렵다.
- 엄격하게 순서가 정해져 있어 순서가 바뀌면 결과값을 도출하기 어렵고 비효율적이다.
- 프로그램을 분석하기 어렵다.
3. 함수형
📌 함수형 프로그래밍이란?
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 수형 프로그래밍은 함수의 응용을 강조하고, 프로그래밍이 문이 아닌 식이나 선언으로 수행되는 선언형 프로그래밍 패러다임을 따르고 있다.
파이프라인 처럼 입력(Input)을 넣으면 처리과정을 거쳐서 결과(Output)이 나온다. 외부에서는 이 파이프라인의 정보를 접근할 수 없고 안에서도 밖을 접근 할 수가 없다. 이런 함수들을 묶어서 프로그램을 구성해나가는 것을 말한다.
함수에서 외부의 상태값을 참조하거나 외부의 상태를 변경할 수 없어서 사이드 이팩트를 발생시키지 않는다. 때문에 동시성과 관련된 문제를 원천적으로 봉쇄하고, 테스트하기 용이하지만, 상태가 없기 때문에 함수형 프로그래밍 패러다임만 사용하여 프로그램을 작성할 수는 없다.
함수형 프로그램을 이해하기 위해 읽으면 도움되는 글:
📌 함수형의 특징과 장단점
특징:
- 부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
장점:
- 부작용(side effect)이 없다.
- 디버깅이 쉽다.
- 테스트하기 쉽다.
단점:
- 순수함수를 구현하기 위해 코드의 가독성이 좋지 않을 수 있다.
- 반복이 재귀를 통해 이뤄지는데,(=deep copy) 재귀적 코드 스타일은 무한루프에 빠질 수 있다.
- 순수함수를 쓰는건 쉬울 수 있지만, 그것들을 조합하는 것은 쉽지 않다.
- 상태가 없기 때문에 함수형 프로그래밍 패러다임만 사용하여 프로그램을 작성할 수는 없다.
출처: