티스토리 뷰

프로그래밍 패러다임

프로그래밍 방법론. 시대에 따라 사람들이 갖는 공통적인 인식체계를 패러다임이라고 한다. 프로그래밍에서도 시대에 따라 패러다임이 변했다.(제한된 상태와 적은 메모리를 가진 초기의 시기, 컴퓨터가 대중화된 시기, CPU가 여러 개의 코어를 가진 동시성이 중요해진 요즘 시기)

명령형 프로그래밍, 함수형 프로그래밍, 논리 프로그래밍, 객체 지향 프로그래밍으로 나눌 수 있다.

 

프로그래머가 추구하는 사고 방식 및 코드를 쓰고 설계하는 코드 작성 방식. 언어에 종속적이지 않다. 한 언어에도 다양한 패러다임이 있을 수 있다. 모든 패러다임은 장단점이 있기 때문에 필요에 따라서 선택하고 결합하여 사용하면 된다. (OOP와 FP는 대척점에 있지 않다.)

 

명령형vs 선언형

명령형(Imperative) 프로그래밍

  • 주어진 데이터에 대한 연산 순서로 작성한다.
  • 명령어를 쭉 나열한다.
  • 데이터 처리 과정에 집중하는 패러다임이다.
  • 어떻게 결과에 도달하는가에 집중한다.
  • 예 : 절차형(모듈화하여 반복을 줄임), 객체지향(객체에 데이터, 메서드를 저장해 서로 통신함)
  • 예 : 특정 문자를 다른 문자로 변경한다. -> 반복문을 돌리고 원하는 동작에 대한 코드를 차근차근 작성한다.

코드가 너무 길어지고 반복이 많아진다. 이를 개선하기 위해 절차형, 객체지향 패러다임이 등장했다.

 

선언형(Declartive) 프로그래밍

  • 과정을 명령하지 않고 목적을 선언한다. -> 읽기가 더 쉽고 무슨 역할을 하는지 파악하기 편하다.
  • 목적에 대한 해결 방식은 컴퓨터에 위임한다.
  • 예 : 함수형(데이터의 저장 공간이 아닌 값 자체에 집중)
  • 예 : 특정 문자를 다른 문자로 변경한다. -> 원하는 동작에 대한 메서드를 사용한다.

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

명령형 프로그래밍의 하위 개념이기에 객체 지향과 비슷하다. 실행 절차에 중점을 둔 프로그래밍 방식이며 순차적인 처리방식으로 프로그램 전체가 유기적인 연결이 있다. 반복되는 작업들을 '서브루틴'으로 묶어 간략화한다.(procedural의 반복)

대표적 예 : C


Logic Programming (논리형 프로그래밍)

절차 지향형의 procedural 대신에 논리절(집합)의 나열이다.


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

- 객체라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다.

- 서로 연관되어있는 변수와 함수를 객체로 그룹핑하여 적당한 이름을 붙인다. -> 정리정돈

- 클래스(붕어빵틀)라는 모양틀로 객체(붕어빵)를 만들어 관리한다. -> 유지 보수를 용이하게 만든다.

핵심 개념

캡슐화(Encapsulation)

데이터와 이를 활용하는 함수를 컨테이너(예 : class) 안에 가두는 것을 의미한다.

클래스 안에서 표시할 속성과 숨길 속성을 설정할 수 있다. 어떻게 클래스 정보에 접근, 수정하는지를 결정하는 권한을 제공한다.

객체에 하나하나 정해주지 않아도 내부에 정의된 메서드로 알아서 처리한다.

 

상속(Inheritance)

상속을 통해서 코드 중복을 줄이고 코드를 여러 조각으로 나눌 수 있다.

클래스를 확장하면 자식 클래스는 부모 클래스의 속성을 상속받는다.

- 상속 : 물려받는 것

- 인터페이스 : 장착하는 것

 

추상화(Abstraction)

구현 세부 정보를 숨기는 일반 인터페이스를 지정하는 행위이다.

구현 세부 내용을 변경해도 사용하는 인터페이스(예 : 메서드)는 그대로 유지되었기 때문에 코드를 변경하지 않아도 된다는 장점이 있다.

 

다형성(Polymorphism)

자식 클래스는 부모 클래스의 속성을 상속받지만 오버라이딩을 통해 같은 이름의 메서드여도 다른 동작을 하게 할 수 있다. 오버라이딩하더라도 메서드가 어떻게 동작해야 하는지에 대한 규칙은 정해져 있다.

 

장점과 단점

장점

  1. 코드의 재사용성이 높다.
  2. 코드의 변경이 용이하다.
  3. 직관적인 코드분석이 가능하다.
  4. 상속을 통한 장점이 극대화된다.

 

단점

  1. 처리속도가 상대적으로 느리다.
  2. 객체가 많으면 용량이 커질 수 있다.
  3. 설계 시 상대적으로 많은 시간이 필요하다.

AOP -Aspect Oriented Programming-

객체지향 프로그래밍이 보완되고 확장된 프로그래밍 방법론이다.

클래스마다 들어있는 같은 기능(공통 관심)을 크로스 커팅하여 별도로 모듈로 개발해서 사용될 수 있도록 개발하는 것이다.

크로스 커팅 (출처 : 기술노트 with 알렉 유튜브)


FP -Functional Programming- (함수형 프로그래밍)

함수형 프로그래밍은 수학과 밀접한 연관이 있어 난해하거나 배우는데 시간이 걸릴 수 있다. 그래서 프로그래밍 언어 역사적으로 함수형 프로그래밍 언어가 더 먼저 나왔으나 사람의 사고방식과 가장 가까운 절차지향 & 객체지향 프로그래밍이 더 많이 쓰였다. 하지만 요즘 AI나 IoT나 빅데이터 등과 같은 방대한 데이터를 빠르게 계산해서 병렬적이고 안정적으로 처리하는 것의 중요성이 높아져 함수형 프로그래밍이 주목을 받고 있다.

 

- 함수형 프로그래밍은 선언적으로 코드를 작성한다.

- 외부환경으로부터 철저히 독립적이다.

- 같은 input에 대하여 언제나 같은 방식의 output이 나온다. 어떤 함수의 동작에 따라 프로그램 내부의 상태가 변경되는 부수효과가 적어 버그가 발생하기 어렵다.

 

특징 및 핵심 개념

순수함수 (Pure fuction)

동일한 입력에는 항상 같은 값을 반환하는 함수이다. 외부의 값을 변경하거나 영향을 받을 수 없다. 항상 동일한 인자를 넣었을 때 동일한 인자를 받아야 한다. 외부의 영향을 받지 않도록 작성해야 한다. -> 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 부수효과가 없다.

 

비상태, 불변성(Stateless, Immutability)

데이터는 변하지 않는 불변성을 유지해야 한다. 데이터를 변경할 경우 원본을 변경하지 않고 복사본을 만들어 변경하고 이용한다. -> 외부 변수를 사용하더라도 원본을 변경하지 않고 복사본을 통해 작업하기 때문에 부수효과가 발생하지 않는다.

 

선언형 함수 (Expressions)

어떻게 할 것 인가보다 무엇을 할 것인가에 주목한다. 루프보다는 재귀를 사용한다.

 

Functor

박싱 된 값에서 값을 뺀 후, 값에 특정 함수를 적용해 타입과 값을 변경하고, 다시 값을 박싱 하는 것을 말한다. 변경된 값은 같은 타입일 수도 있고 다른 타입일 수도 있다. (map 함수 같은 걸 말하는건가..?)

함수 컴비네이터를 사용한다.

  • 함수 컴비네이터 : 배열이나 리스트에서 자주 사용됨. 요소를 변경할 수 있는 이미 작성되어 있는 함수들

 

1급 객체와 고차함수 (Fist-class, Higher-order-functions)

함수형 프로그래밍에서는 함수가 1급 객체가 된다.

  • 1급 객체의 특징
  • 변수나 데이터 구조 안에 할당할 수 있어야 한다.
  • 객체의 인자로 넘길 수 있어야 한다.
  • 객체의 리턴 값으로 사용할 수 있어야 한다.
  • 고차 함수
  • 함수를 파라미터로 전달받는 함수이다.
  • 반환 값으로 또 다른 함수를 리턴하는 함수이다.
  • 커링 : 여러 인자를 받는 함수에 일부 인자만 넣어서 나머지 인자를 받는 다른 함수를 만들어 낼 수 있는 함수형 프로그래밍 기법

 

모나드(Monad)

어떤 타입에 대해 pure, compose 함수가 존재할 때 그 어떤 타입을 모나드라고 한다. 카테고리 이론을 적용하기 위해 합성할 수 있는 연산을 정의하고 추상화하기 위해 쓰인다.

 

모노이드(Monoid)

모노이드는 모나드와 다른 것이다. Magma(추가 또는 빼기와 같은 작업 후에도 항상 모든 요소가 동일한 유형의 요소임을 보장하는 일련의 요소)와 연관되는 개념 (선형 대수를 모르므로 이해할 수 없다....)

 

스코프(Scope)

스코프와 클로저에 대해서 말하는 것 같다.

 

Call-by-name

값이 파라미터로 전달 될 때 평가되지 않고, 실제로 call이 될때 평가하는 것을 말한다. 상황에 맞게 사용하면 효율적으로 코드를 작성할 수 있다.

 

Semigroup, Applicative, Disjunction 등

 

장점과 단점

장점

높은 수준의 추상화를 제공한다.

함수 단위의 코드 재사용이 수월하다.

불변성을 지향하므로 프로그램의 동작을 예측하기 쉬워진다.

 

단점

수학과 밀접한 연관이 있어 난해하거나 배우는데 시간이 걸릴 수 있다.

루프가 아닌 재귀를 사용하여 무한 루프에 빠질 수 있다.

순수 함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다.


아직 이해하지 못했지만 나중에 읽어볼 함수형 프로그래밍 참고 링크

 

함수형 프로그래밍 핵심 개념 참고 1 - 세미그룹

함수형 프로그래밍 핵심 개념 참고 2 - 모노이드

함수형 프로그래밍 핵심 개념 참고 링크 3 - 1

함수형 프로그래밍 핵심 개념 참고 링크 3 - 2

함수형 프로그래밍 핵심 개념 참고 링크 3 - 3

함수형 프로그래밍 - 개념 이해를 돕는 Fantasy-land repo


객체지향과 함수형 프로그래밍의 차이에 대해서 찾다 보니 전체적인 프로그래밍 패러다임에 대해서 정리하게 되었다. 두 가지가 대척점에 있는 개념이라고 생각했는데 잘못이해하고 있었다는 것에 대해 알게 되었다. 검색해 보면 사람마다 개념을 나누는 지점이 달라서 서적을 찾아봐야 될 것 같다.

 

함수형 프로그래밍이 왜 배우기 어렵다고 하는지 체감했다. 수학적인 원리를 이용해서 처리한다고 진짜로 선형 대수가 나와버릴 줄 은 몰랐다....... 저는 선형대수학을 모르는데요... 🥲 선형 대수에 도달할 수 있도록 빨리 수학 공부를 열심히 해야겠다.... 😭

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함